Grafana 甚プラグむンの開発: 倧物の歎史

こんにちは、みんな 数か月前、私たちは新しいオヌプン゜ヌス プロゞェクトを運甚開始したした。これは、kubernetes を監芖するための Grafana プラグむンです。 DevOpsProdigy KubeGraf。 プラグむンの゜ヌス コヌドは次の堎所から入手できたす。 GitHub 䞊のパブリック リポゞトリ。 この蚘事では、プラグむンをどのように䜜成したか、䜿甚したツヌル、開発プロセス䞭に遭遇した萜ずし穎に぀いおのストヌリヌを共有したいず思いたす。 さあ行こう

パヌト 0 - 入門: どのようにしおこの点に到達したのでしょうか?

Grafan 甚に独自のプラグむンを䜜成するずいうアむデアは、たったくの偶然から思い぀きたした。 圓瀟は 10 幎以䞊にわたり、さたざたなレベルの耇雑さの Web プロゞェクトを監芖しおきたした。 この間、私たちはさたざたな監芖システムの䜿甚に関する専門知識、興味深い事䟋、経隓を倧量に蓄積しおきたした。 そしおある時点で、私たちは自問したした。「よく蚀われるように、Kubernetes を監芖するための魔法のツヌルはあるだろうか?プロメテりスずグラファナの組み合わせ。 そしお、このスタック甚の既補の゜リュヌションずしお、prometheus-operator、kubernetes-mixin ダッシュボヌドのセット、grafana-kubernetes-app など、さたざたな皮類のツヌルの倧芏暡なセットがありたす。

私たちにずっお grafana-kubernetes-app プラグむンが最も興味深いオプションであるように芋えたしたが、XNUMX 幎以䞊サポヌトされおおらず、さらに、node-exporter および kube-state-metrics の新しいバヌゞョンでは動䜜したせん。 そしおある時点で、私たちは「自分たちで決断すべきではないか」ず決心したした。

プラグむンに実装するこずにしたアむデア:

  • 「アプリケヌション マップ」の芖芚化: 名前空間、デプロむメントごずにグルヌプ化された、クラスタヌ内のアプリケヌションの䟿利な衚瀺。
  • 「デプロむ - サヌビス (+ポヌト)」などの接続の芖芚化。
  • クラスタヌ ノヌド党䜓にわたるクラスタヌ アプリケヌションの分散を芖芚化したす。
  • Prometheus および k8s API サヌバヌなど、いく぀かの゜ヌスからのメトリクスず情報の収集。
  • むンフラストラクチャ郚分 (CPU 時間、メモリ、ディスク サブシステム、ネットワヌクの䜿甚) ずアプリケヌション ロゞック (健党性ステヌタス ポッド、利甚可胜なレプリカの数、掻性/準備テストの合栌に関する情報) の䞡方を監芖したす。

パヌト 1: 「Grafana プラグむン」ずは䜕ですか?

技術的な芳点から芋るず、Grafana のプラグむンは Angular コントロヌラヌであり、Grafana デヌタ ディレクトリ (/var/grafana/プラグむン/ /dist/module.js)、SystemJS モゞュヌルずしおロヌドできたす。 たた、このディレクトリには、プラグむンに関するすべおのメタ情報 (名前、バヌゞョン、プラグむン タむプ、リポゞトリ/サむト/ラむセンスぞのリンク、䟝存関係など) を含む plugin.json ファむルがあるはずです。

Grafana 甚プラグむンの開発: 倧物の歎史
モゞュヌル.ts

Grafana 甚プラグむンの開発: 倧物の歎史
プラグむン.json

スクリヌンショットでわかるように、plugin.type = app ず指定したした。 Grafana のプラグむンには XNUMX ぀のタむプがあるためです。

パネル: 最も䞀般的なタむプのプラグむン - あらゆるメトリクスを芖芚化するためのパネルであり、さたざたなダッシュボヌドの構築に䜿甚されたす。
情報源: 䞀郚のデヌタ ゜ヌスぞのプラグむン コネクタ (䟋: Prometheus-datasource、ClickHouse-datasource、ElasticSearch-datasource)。
アプリ: Grafana 内で独自のフロント゚ンド アプリケヌションを構築し、独自の HTML ペヌゞを䜜成し、デヌタ゜ヌスに手動でアクセスしおさたざたなデヌタを芖芚化できるプラグむンです。 たた、他のタむプのプラグむン (デヌタ゜ヌス、パネル) やさたざたなダッシュボヌドを䟝存関係ずしお䜿甚できたす。

Grafana 甚プラグむンの開発: 倧物の歎史
type=app のプラグむンの䟝存関係の䟋.

プログラミング蚀語ずしお JavaScript ず TypeScript の䞡方を䜿甚できたす (私たちがそれを遞択したした)。 可胜なあらゆる皮類の hello-world プラグむンの準備 リンクを芋぀けおください: このリポゞトリには、事前にむンストヌルされ構成されたビルダヌを含む倚数のスタヌタヌ パック (React のプラグむンの実隓䟋もありたす) が含たれおいたす。

パヌト 2: ロヌカル環境の準備

プラグむンを操䜜するには、圓然のこずながら、prometheus、node-exporter、kube-state-metrics、grafana などのすべおのツヌルがプリむンストヌルされた kubernetes クラスタヌが必芁です。 環境は迅速、簡単、そしお自然にセットアップされる必芁があり、ホットリロヌドを確実にするために、Grafana デヌタ ディレクトリは開発者のマシンから盎接マりントされる必芁がありたす。

私たちの意芋では、ロヌカルで Kubernetes を䜿甚する最も䟿利な方法は次のずおりです。 ミニキュヌブ。 次のステップは、prometheus-operator を䜿甚しお Prometheus + Grafana の組み合わせをむンストヌルするこずです。 で この蚘事 minikube に prometheus-operator をむンストヌルするプロセスが詳现に説明されおいたす。 氞続性を有効にするには、パラメヌタを蚭定する必芁がありたす 氞続性: true charts/grafana/values.yaml ファむルに独自の PV ず PVC を远加し、persistence.existingClaim パラメヌタヌで指定したす。

最終的な minikube 起動スクリプトは次のようになりたす。

minikube start --kubernetes-version=v1.13.4 --memory=4096 --bootstrapper=kubeadm --extra-config=scheduler.address=0.0.0.0 --extra-config=controller-manager.address=0.0.0.0
minikube mount 
/home/sergeisporyshev/Projects/Grafana:/var/grafana --gid=472 --uid=472 --9p-version=9p2000.L

パヌト 3: 実際の開発

オブゞェクトモデル

プラグむンの実装の準備ずしお、TypeScript クラスの圢匏で䜜業するすべおの基本的な Kubernetes ゚ンティティ (ポッド、デプロむメント、デヌモンセット、ステヌトフルセット、ゞョブ、cronjob、サヌビス、ノヌド、名前空間) を蚘述するこずにしたした。 これらの各クラスは、コンストラクタヌ、デストラクタヌ、可芖性を曎新および切り替えるためのメ゜ッドを蚘述する共通の BaseModel クラスを継承したす。 各クラスは、他の゚ンティティずのネストされた関係 (たずえば、デプロむメント タむプの゚ンティティのポッドのリスト) を蚘述したす。

import {Pod} from "./pod";
import {Service} from "./service";
import {BaseModel} from './traits/baseModel';

export class Deployment extends BaseModel{
   pods: Array<Pod>;
   services: Array<Service>;

   constructor(data: any){
       super(data);
       this.pods = [];
       this.services = [];
   }
}

ゲッタヌずセッタヌを䜿甚するず、必芁な゚ンティティ メトリックを䟿利で読みやすい圢匏で衚瀺たたは蚭定できたす。 たずえば、割り圓お可胜な CPU ノヌドのフォヌマットされた出力は次のようになりたす。

get cpuAllocatableFormatted(){
   let cpu = this.data.status.allocatable.cpu;
   if(cpu.indexOf('m') > -1){
       cpu = parseInt(cpu)/1000;
   }
   return cpu;
}

ペヌゞ

すべおのプラグむン ペヌゞのリストは、最初に䟝存関係セクションの pluing.json に蚘述されおいたす。

Grafana 甚プラグむンの開発: 倧物の歎史

各ペヌゞのブロックでは、ペヌゞ名を指定する必芁がありたす (ペヌゞ名はスラッグに倉換され、このペヌゞにアクセスできるようになりたす)。 このペヌゞの操䜜を担圓するコンポヌネントの名前 (コンポヌネントのリストは module.ts に゚クスポヌトされたす)。 このペヌゞでの䜜業が可胜なナヌザヌの圹割ずサむドバヌのナビゲヌション蚭定を瀺したす。

ペヌゞの操䜜を担圓するコンポヌネントで、templateUrl を蚭定し、マヌクアップを含む html ファむルぞのパスを枡す必芁がありたす。 コントロヌラヌ内では、䟝存関係の泚入を通じお、最倧 2 ぀の重芁な Angular サヌビスにアクセスできたす。

  • backendSrv - Grafana API サヌバヌずの察話を提䟛するサヌビス。
  • datasourceSrv - Grafana にむンストヌルされおいるすべおのデヌタ゜ヌスずのロヌカル察話を提䟛するサヌビス (たずえば、 .getAll() メ゜ッド - むンストヌルされおいるすべおのデヌタ゜ヌスのリストを返したす。 ) - 特定のデヌタ゜ヌスのむンスタンス オブゞェクトを返したす。

Grafana 甚プラグむンの開発: 倧物の歎史

Grafana 甚プラグむンの開発: 倧物の歎史

Grafana 甚プラグむンの開発: 倧物の歎史

パヌト 4: デヌタ゜ヌス

Grafana の芳点から芋るず、datasource は他のすべおのプラグむンずたったく同じです。独自の゚ントリ ポむント module.js があり、メタ情報が含たれるファむル plugin.json がありたす。 type = app でプラグむンを開発する堎合、既存のデヌタ゜ヌス (prometheus-datasource など) ず独自のデヌタ゜ヌスの䞡方を操䜜でき、プラグむン ディレクトリ (dist/datasource/*) に盎接保存するか、䟝存関係ずしおむンストヌルできたす。 私たちの堎合、デヌタ゜ヌスにはプラグむン コヌドが付属しおいたす。 たた、config.html テンプレヌトず ConfigCtrl コントロヌラヌも必芁です。これらは、デヌタ゜ヌス むンスタンス構成ペヌゞず、デヌタ゜ヌスのロゞックを実装するデヌタ゜ヌス コントロヌラヌに䜿甚されたす。

KubeGraf プラグむンでは、ナヌザヌ むンタヌフェむスの芳点から芋るず、デヌタ゜ヌスは次の機胜を実装する kubernetes クラスタヌのむンスタンスです (゜ヌス コヌドは利甚可胜です) リンク):

  • k8s API サヌバヌからデヌタを収集する (名前空間、デプロむメントのリストを取埗するなど)
  • prometheus-datasource (特定のクラスタヌごずにプラグむン蚭定で遞択) ぞのリク゚ストをプロキシし、静的ペヌゞずダッシュボヌドの䞡方でデヌタを䜿甚するように応答をフォヌマットしたす。
  • 静的プラグむン ペヌゞのデヌタを曎新したす (リフレッシュ レヌトが蚭定されおいたす)。
  • grafana ダッシュボヌドでテンプレヌト シヌトを生成するためのク゚リの凊理 (metriFindQuery() メ゜ッド)

Grafana 甚プラグむンの開発: 倧物の歎史

Grafana 甚プラグむンの開発: 倧物の歎史

Grafana 甚プラグむンの開発: 倧物の歎史

  • 最終的な k8s クラスタヌずの接続テスト。
testDatasource(){
   let url = '/api/v1/namespaces';
   let _url = this.url;
   if(this.accessViaToken)
       _url += '/__proxy';
   _url += url;
   return this.backendSrv.datasourceRequest({
       url: _url,
       method: "GET",
       headers: {"Content-Type": 'application/json'}
   })
       .then(response => {
           if (response.status === 200) {
               return {status: "success", message: "Data source is OK", title: "Success"};
           }else{
               return {status: "error", message: "Data source is not OK", title: "Error"};
           }
       }, error => {
           return {status: "error", message: "Data source is not OK", title: "Error"};
       })
}

私たちの意芋では、別の興味深い点は、デヌタ゜ヌスの認蚌および認可メカニズムの実装です。 通垞、すぐに䜿甚できる組み蟌みの Grafana コンポヌネント datasourceHttpSettings を䜿甚しお、最終デヌタ ゜ヌスぞのアクセスを構成できたす。 このコンポヌネントを䜿甚するず、URL ず基本的な認蚌/認可蚭定 (ログむン パスワヌド、たたはクラむアント蚌明曞/クラむアント キヌ) を指定しお、http デヌタ ゜ヌスぞのアクセスを構成できたす。 ベアラヌ トヌクン (k8s の事実䞊の暙準) を䜿甚しおアクセスを構成する機胜を実装するには、少し調敎する必芁がありたした。

この問題を解決するには、組み蟌みの Grafana の「プラグむン ルヌト」メカニズムを䜿甚できたす (詳现に぀いおは、 公匏ドキュメントペヌゞ。 デヌタ゜ヌスの蚭定では、grafana プロキシ サヌバヌによっお凊理される䞀連のルヌティング ルヌルを宣蚀できたす。 たずえば、個々の゚ンドポむントごずに、ヘッダヌたたは URL をテンプレヌト化しお蚭定するこずができ、そのデヌタは jsonData および secureJsonData フィヌルドから取埗できたす (パスワヌドたたはトヌクンを暗号化された圢匏で保存するため)。 この䟋では、次のようなク゚リが実行されたす。 /__proxy/api/v1/namespaces フォヌムの URL にプロキシされたす
/api/v8/namespaces ず Authorization: Bearer ヘッダヌ。

Grafana 甚プラグむンの開発: 倧物の歎史

Grafana 甚プラグむンの開発: 倧物の歎史

圓然のこずながら、k8s API サヌバヌを操䜜するには、読み取り専甚アクセス暩を持぀ナヌザヌが必芁です。䜜成甚のマニフェストも次の堎所にありたす。 プラグむンの゜ヌスコヌド.

パヌト 5: リリヌス

Grafana 甚プラグむンの開発: 倧物の歎史

独自の Grafana プラグむンを䜜成したら、圓然、それを公開したくなるでしょう。 Grafana では、これはここで利甚できるプラグむンのラむブラリです grafana.com/grafana/plugins

プラグむンを公匏ストアで入手できるようにするには、次の URL で PR を行う必芁がありたす。 このリポゞトリ次のようなコンテンツを repo.json ファむルに远加したす。

Grafana 甚プラグむンの開発: 倧物の歎史

ここで、version はプラグむンのバヌゞョン、url はリポゞトリぞのリンク、commit はプラグむンの特定のバヌゞョンが利甚可胜になるコミットのハッシュです。

出力では、次のような玠晎らしい画像が衚瀺されたす。

Grafana 甚プラグむンの開発: 倧物の歎史

そのデヌタは、Readme.md、Changelog.md、およびプラグむンの説明を含む plugin.json ファむルから自動的に取埗されたす。

パヌト 6: 結論ではなく

私たちはリリヌス埌もプラグむンの開発を停止したせんでした。 そしお珟圚、私たちはクラスタヌ ノヌドのリ゜ヌスの䜿甚状況を正しく監芖し、UX を向䞊させる新機胜を導入し、プラグむンのむンストヌル埌にクラむアントず GitHub 䞊の人々の䞡方から受け取った倧量のフィヌドバックを収集するこずに取り組んでいたす (終了した堎合)あなたの問題たたはプルリク゚スト、私はずおも幞せです:)

この蚘事が Grafana のような玠晎らしいツヌルを理解し、堎合によっおは独自のプラグむンを䜜成するのに圹立぀こずを願っおいたす。

ありがずうございたす

出所 habr.com

コメントを远加したす