Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Ndewo, unu niile! Ọnwa ole na ole gara aga, anyị malitere ọrụ mmeghe ọhụrụ anyị na mmepụta - ngwa mgbakwunye Grafana maka nlekota kubernetes, nke anyị kpọrọ. DevOpsProdigy KubeGraf. Koodu isi mmalite plugin dị na ebe nchekwa ọha na GitHub. Na n'isiokwu a, anyị chọrọ ịkọrọ gị akụkọ nke otú anyị si kee ngwa mgbakwunye, ihe ngwá ọrụ anyị ji na ihe ọnyà anyị zutere n'oge mmepe usoro. Ka a pụọ!

Akụkụ 0 - mmalite: kedu ka anyị siri ruo ebe a?

Echiche ide ngwa mgbakwunye anyị maka Grafan bịakwutere anyị na mberede. Ụlọ ọrụ anyị na-enyocha ọrụ weebụ nke ọkwa dị iche iche nke mgbagwoju anya karịa afọ 10. N'ime oge a, anyị achịkọtala ọnụ ọgụgụ dị ukwuu nke nka, ihe ndị na-adọrọ mmasị, na ahụmahụ na-eji usoro nlekota dị iche iche. Ma n'oge ụfọdụ anyị jụrụ onwe anyị: "Enwere ngwá ọrụ anwansi maka nlekota Kubernetes, nke mere na, dị ka ha na-ekwu," tọọ ya ma chefuo ya "? ". Ngwakọta Prometheus + Grafana. Dịkwa ka ihe ngwọta edoziziri maka nchịkọta a, e nwere nnukwu ngwá ọrụ dị iche iche: prometheus-operator, a set of kubernetes-mixin dashboards, grafana-kubernetes-app.

Ngwa ngwa grafana-kubernetes-app yiri ka ọ bụ nhọrọ kacha amasị anyị, mana akwadobeghị ya ihe karịrị otu afọ yana, ọzọkwa, enweghị ike ịrụ ọrụ na ụdị node-exporter na kube-state-metrics. Ma n'oge ụfọdụ anyị kpebiri, sị: "Ọ bụ na anyị ekwesịghị ime mkpebi nke anyị?"

Kedu echiche anyị kpebiri itinye na ngwa mgbakwunye anyị:

  • nleba anya nke “maapụ ngwa”: ngosipụta dabara adaba nke ngwa n'ụyọkọ, nke ejiri aha aha chịkọtara, mbugharị...;
  • nleba anya nke njikọ dị ka "nkwanye - ọrụ (+ ọdụ ụgbọ mmiri)".
  • nhụta nkesa nke ngwa ụyọkọ n'ofe ọnụ ụyọkọ.
  • nchịkọta metrik na ozi sitere n'ọtụtụ ebe: Prometheus na k8s api server.
  • nlekota nke ma akụkụ akụrụngwa (iji oge CPU, ebe nchekwa, disk subsystem, netwọk) na ngwa mgbagha - ahụike-ọnọdụ pods, ọnụ ọgụgụ nke oyiri dị, ozi gbasara ịgafe ndụ/nnwale ịdị njikere.

Part 1: Gịnị bụ a "Grafana ngwa mgbakwunye"?

Site n'echiche teknụzụ, ngwa mgbakwunye maka Grafana bụ onye na-ahụ maka angular, nke echekwara na ndekọ data Grafana (/var/grafana/plugins/ /dist/module.js) ma enwere ike ibu ya dị ka modul SystemJS. Nakwa na ndekọ a, ekwesịrị inwe faịlụ plugin.json nwere ozi meta niile gbasara ngwa mgbakwunye gị: aha, ụdị, ụdị ngwa mgbakwunye, njikọ na ebe nchekwa/saịtị/ikike, ịdabere na ihe ndị ọzọ.

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa
modul.ts

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa
ngwa mgbakwunye.json

Dị ka ị na-ahụ na nseta ihuenyo, anyị kpọmkwem plugin.type = ngwa. N'ihi na plugins maka Grafana nwere ike ịbụ ụdị atọ:

panel: ụdị ngwa mgbakwunye a na-ahụkarị - ọ bụ panel maka iji anya nke uche ọ bụla metrics, eji wuo dashboard dị iche iche.
isi iyi data: ngwa mgbakwunye na ụfọdụ isi iyi data (dịka ọmụmaatụ, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
ngwa: Ngwa mgbakwunye na-enye gị ohere iwulite ngwa frontend nke gị n'ime Grafana, mepụta ibe HTML nke gị wee jiri aka nweta isi iyi data iji hụ data dị iche iche. Ọzọkwa, plugins nke ụdị ndị ọzọ (datasource, panel) na dị iche iche dashboards nwere ike iji dị ka ndabere.

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa
Ndabere ngwa mgbakwunye ihe atụ nwere ụdị = ngwa.

Ị nwere ike iji ma Javascript na TypeScript dị ka asụsụ mmemme (anyị họọrọ ya). Nkwadebe maka hello-world plugins nke ụdị ọ bụla ị nwere ike chọta njikọ: ebe nchekwa a nwere ọnụ ọgụgụ buru ibu nke mkpọ mmalite (enwere ọbụna ihe atụ nnwale nke ngwa mgbakwunye na React) nwere ndị nrụpụta etinyegoro na ahaziri.

Nkebi 2: ịkwadebe gburugburu ebe obibi

Iji rụọ ọrụ na ngwa mgbakwunye ahụ, anyị chọrọ ụyọkọ kubernetes nwere ngwaọrụ etinyegoro mbụ: prometheus, node-exporter, kube-state-metrics, grafana. Ekwesịrị ịhazi gburugburu ebe obibi ngwa ngwa, dị mfe na n'ụzọ nkịtị, yana iji hụ na ebughachite ọkụ, akwụkwọ ndekọ data Grafana kwesịrị ịkwanye ozugbo site na igwe onye nrụpụta.

Ụzọ kachasị mma, n'echiche anyị, na-arụ ọrụ na mpaghara na kubernetes bụ minikube. Nzọụkwụ ọzọ bụ ịwụnye ngwakọta Prometheus + Grafana site na iji prometheus-operator. N'ime Akụkọ a A kọwara usoro nke ịwụnye prometheus-operator na minikube n'ụzọ zuru ezu. Iji mee ka nnọgidesi ike nwee ike, ị ga-edozi oke nnọgidesi ike: eziokwu na chaatị/grafana/values.yaml faịlụ, tinye PV na PVC nke gị wee kọwapụta ha na persistence.existingClaim parameter.

Edemede mwepụta minikube ikpeazụ anyị dị ka nke a:

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

Nkebi nke 3: ezigbo mmepe

Ihe Nlereanya

Na nkwadebe maka mmejuputa ngwa mgbakwunye ahụ, anyị kpebiri ịkọwa ụlọ ọrụ Kubernetes niile anyị ga-arụ ọrụ n'ụdị klaasị TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Nke ọ bụla n'ime klaasị ndị a na-eketa site na klas BaseModel nkịtị, nke na-akọwa onye nrụpụta, onye na-emebi ihe, ụzọ maka imelite na ịgbanwe ọhụụ. Nke ọ bụla n'ime klaasị ahụ na-akọwa mmekọrịta akwụkwụ na ụlọ ọrụ ndị ọzọ, dịka ọmụmaatụ, ndepụta nke pọd maka otu ụdị mbugharị.

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 = [];
   }
}

Site n'enyemaka nke getters na setters, anyị nwere ike igosipụta ma ọ bụ tọọ metrik ụlọ ọrụ anyị chọrọ n'ụdị dabara adaba na nke enwere ike ịgụ. Ọmụmaatụ, mmepụta nke ọnụ ụzọ cpu nwere ike ịkepụta:

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

peeji nke

A kọwara ndepụta nke ibe ngwa mgbakwunye anyị niile na pluing.json anyị na ngalaba dabere:

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

N'ime ngọngọ maka ibe ọ bụla anyị ga-egosirịrị aha PAGE (a ga-agbanwe ya ka ọ bụrụ slug nke a ga-eji nweta ibe a); aha nke akụrụngwa na-ahụ maka ọrụ nke ibe a (ndepụta nke components na-ebupụ na module.ts); na-egosi ọrụ onye ọrụ nke ọrụ na ibe a dị yana ntọala igodo maka sidebar.

Na akụrụngwa maka ọrụ nke ibe, anyị ga-edozi templateUrl, na-agafe n'ebe ahụ ụzọ na html faịlụ na markup. N'ime onye njikwa ahụ, site na ịgba ọgwụ mgbochi, anyị nwere ike ịnweta ọrụ akụkụ abụọ dị mkpa:

  • backendSrv - ọrụ na-enye mmekọrịta na ihe nkesa API Grafana;
  • datasourceSrv - ọrụ na-enye mmekọrịta mpaghara na isi mmalite data arụnyere na Grafana gị (dịka ọmụmaatụ, usoro .getAll() - weghachi ndepụta nke isi mmalite data arụnyere; .nweta() ) - weghachi ihe atụ nke isi mmalite data.

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Nkebi 4: isi iyi data

Site n'echiche nke Grafana, datasource bụ otu ngwa mgbakwunye dị ka ndị ọzọ niile: o nwere modulu ntinye nke ya.js, enwere faịlụ nwere ozi meta plugin.json. Mgbe ị na-emepụta ngwa mgbakwunye nwere ụdị = ngwa, anyị nwere ike ịmekọrịta na isi mmalite data dị adị (dịka ọmụmaatụ, prometheus-datasource) yana nke anyị, nke anyị nwere ike ịchekwa ozugbo na ndekọ ngwa mgbakwunye (dist/datasource/*) ma ọ bụ wụnye dị ka ndabere. N'ọnọdụ anyị, isi mmalite data na-abịa na koodu ngwa mgbakwunye. Ọ dịkwa mkpa ịnwe template config.html yana njikwa ConfigCtrl, nke a ga-eji maka ibe nhazi ihe atụ datasource yana njikwa Datasource, nke na-emejuputa mgbagha nke isi iyi data gị.

Na ngwa mgbakwunye KubeGraf, site na echiche onye ọrụ, datasource bụ ihe atụ nke ụyọkọ kubernetes na-arụ ọrụ ndị a (koodu isi dị njikọ):

  • na-anakọta data site na k8s api-server (na-enweta ndepụta aha oghere, ntinye...)
  • Arịrịọ proxying maka prometheus-datasource (nke ahọpụtara na ntọala ngwa mgbakwunye maka ụyọkọ ọ bụla akọwapụtara) yana nhazi nzaghachi iji data ma na ibe static yana na dashboards.
  • na-emelite data na ibe ngwa mgbakwunye static (yana ọnụego ume ọhụrụ atọrọ).
  • ajụjụ nhazi iji mepụta mpempe akwụkwọ ndebiri na grafana-dashboards (usoro metriFindQuery())

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

  • ule njikọ na ụyọkọ k8s ikpeazụ.
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"};
       })
}

Isi ihe dị iche na-adọrọ mmasị, n'echiche anyị, bụ mmejuputa usoro nyocha na ikike maka data data. Dịka, n'ime igbe ahụ, anyị nwere ike iji datasourceHttpSettings akụrụngwa arụnyere na Grafana iji hazie ohere ịnweta isi mmalite data ikpeazụ. Iji akụrụngwa a, anyị nwere ike hazie ohere ịnweta isi iyi data http site na ịkọwapụta url na ntọala nkwenye/ikike: nbanye-paswọọdụ, ma ọ bụ ahịa-cert/client-key. Iji mejuputa ikike ịhazi ohere site na iji token bearer (ụkpụrụ de facto maka k8s), anyị ga-eme ntakịrị tweaking.

Iji dozie nsogbu a, ị nwere ike iji usoro arụnyere na Grafana “Plugin Routes” (nkọwa ndị ọzọ na ibe akwụkwọ ikike). Na ntọala nke data data anyị, anyị nwere ike ikwuwapụta usoro iwu ngagharị nke sava proxy grafana ga-ahazi. Dịka ọmụmaatụ, maka njedebe onye ọ bụla, ọ ga-ekwe omume ịtọ nkụnye eji isi mee ma ọ bụ url nwere ike ịnwapụta, data enwere ike iwere ya site na jsonData na secureJsonData ubi (maka ịchekwa okwuntughe ma ọ bụ akara ngosi n'ụdị ezoro ezo). N'ihe atụ anyị, ajụjụ dịka /__proxy/api/v1/namespaces a ga-etinye proxied na url nke ụdị ahụ
/api/v8/namespaces nwere ikike: nkụnye eji isi mee.

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Dị ka o kwesịrị ịdị, iji rụọ ọrụ na sava k8s api anyị chọrọ onye ọrụ nwere ohere ịgụ naanị, gosipụtara maka imepụta nke ị nwekwara ike ịhụ na ya. ngwa mgbakwunye koodu.

Akụkụ 5: ntọhapụ

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

Ozugbo ị dechara ngwa mgbakwunye Grafana nke gị, ị ga-achọkarị ime ka ọ dị n'ihu ọha. Na Grafana nke a bụ ọba akwụkwọ plugins dị ebe a grafana.com/grafana/plugins

Ka ngwa mgbakwunye gị dị na ụlọ ahịa gọọmentị, ịkwesịrị ịme PR n'ime ebe nchekwa asite na ịgbakwunye ọdịnaya dị ka nke a na faịlụ repo.json:

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

ebe mbipute bụ ụdị ngwa mgbakwunye gị, url bụ njikọ na ebe nchekwa ahụ, ma mee bụ hash nke ntinye nke otu ụdị ngwa mgbakwunye ahụ ga-adị.

Na mmepụta ị ga-ahụ ọmarịcha foto dị ka:

Mmepe nke ngwa mgbakwunye maka Grafana: akụkọ ihe mere eme nke nnukwu gbaa

A ga-ejide data maka ya ozugbo na Readme.md, Changelog.md na faịlụ plugin.json nwere nkọwa ngwa mgbakwunye.

Nkebi nke 6: kama nkwubi okwu

Anyị akwụsịghị ịmepụta ngwa mgbakwunye anyị ka ahapụchara ya. Ma ugbu a, anyị na-arụ ọrụ na nlekota nke ọma iji akụrụngwa nke ụyọkọ ọnụ, na-ewebata atụmatụ ọhụrụ iji melite UX, yana raking na nnukwu nzaghachi natara mgbe ị wụnye ngwa mgbakwunye ma ndị ahịa anyị na ndị mmadụ na GitHub (ọ bụrụ na ị pụọ. Okwu gị ma ọ bụ dọta arịrịọ, a ga m enwe obi ụtọ :)

Anyị na-atụ anya na isiokwu a ga-enyere gị aka ịghọta ụdị ngwá ọrụ dị ebube dị ka Grafana na, ikekwe, dee ngwa mgbakwunye nke gị.

Daalụ!)

isi: www.habr.com

Tinye a comment