Þróun viðbót fyrir Grafana: saga stórra skota

Hæ allir! Fyrir nokkrum mánuðum settum við nýja opna hugbúnaðinn okkar í framleiðslu - Grafana viðbótina til að fylgjast með kubernetes, sem við kölluðum DevOpsProdigy KubeGraf. Frumkóði viðbótarinnar er fáanlegur á opinber geymsla á GitHub. Og í þessari grein viljum við deila með þér sögunni um hvernig við bjuggum til viðbótina, hvaða verkfæri við notuðum og hvaða gildrur við lentum í í þróunarferlinu. Förum!

Hluti 0 - inngangur: hvernig komumst við að þessum tímapunkti?

Hugmyndin um að skrifa okkar eigin viðbót fyrir Grafan kom til okkar alveg óvart. Fyrirtækið okkar hefur fylgst með vefverkefnum af ýmsum flækjustigum í meira en 10 ár. Á þessum tíma höfum við safnað upp mikilli sérfræðiþekkingu, áhugaverðum málum og reynslu af notkun ýmissa eftirlitskerfa. Og á einhverjum tímapunkti spurðum við okkur sjálf: "Er til töfratæki til að fylgjast með Kubernetes, þannig að eins og þeir segja, "stilltu það og gleymdu því"? Samsetning Prometheus + Grafana. Og sem tilbúnar lausnir fyrir þennan stafla er til mikið sett af ýmsum tegundum verkfæra: prometheus-operator, sett af kubernetes-mixin mælaborðum, grafana-kubernetes-app.

Grafana-kubernetes-app viðbótin virtist vera áhugaverðasti kosturinn fyrir okkur, en hann hefur ekki verið studdur í meira en ár og getur þar að auki ekki virkað með nýjum útgáfum af hnútaútflytjanda og kube-state-mælingum. Og á einhverjum tímapunkti ákváðum við: "Eigum við ekki að taka okkar eigin ákvörðun?"

Hvaða hugmyndir ákváðum við að innleiða í viðbótinni okkar:

  • sjónmynd af "forritakortinu": þægileg kynning á forritum í þyrpingunni, flokkuð eftir nafnasvæðum, dreifingum...;
  • sjónmynd af tengingum eins og "dreifing - þjónusta (+höfn)".
  • sýn á dreifingu klasaforrita yfir klasahnúta.
  • söfnun mæligilda og upplýsinga frá nokkrum aðilum: Prometheus og k8s API miðlara.
  • eftirlit með bæði innviðahlutanum (notkun örgjörvatíma, minni, undirkerfis disks, netkerfis) og rökfræði forrita - heilsustöðubelg, fjöldi tiltækra eftirmynda, upplýsingar um að standast lífhæfni/viðbúnaðarpróf.

Hluti 1: Hvað er „Grafana viðbót“?

Frá tæknilegu sjónarhorni er viðbótin fyrir Grafana hornstýring, sem er geymd í Grafana gagnaskránni (/var/grafana/plugins/ /dist/module.js) og hægt er að hlaða hana sem SystemJS mát. Einnig í þessari möppu ætti að vera plugin.json skrá sem inniheldur allar metaupplýsingar um viðbótina þína: nafn, útgáfa, tegund viðbóta, tengla á geymsluna/síðuna/leyfið, ósjálfstæði og svo framvegis.

Þróun viðbót fyrir Grafana: saga stórra skota
mát.ts

Þróun viðbót fyrir Grafana: saga stórra skota
plugin.json

Eins og þú sérð á skjámyndinni tilgreindum við plugin.type = app. Vegna þess að viðbætur fyrir Grafana geta verið af þremur gerðum:

spjaldið: Algengasta gerð viðbótarinnar - það er spjaldið til að sjá hvaða mælikvarða sem er, notað til að byggja upp ýmis mælaborð.
gagnaheimild: viðbætur við einhvern gagnagjafa (til dæmis Prometheus-gagnaveitu, ClickHouse-gagnaveitu, ElasticSearch-gagnaveitu).
app: Viðbót sem gerir þér kleift að smíða þitt eigið framendaforrit inni í Grafana, búa til þínar eigin HTML síður og fá handvirkan aðgang að gagnaveitunni til að sjá ýmis gögn. Einnig er hægt að nota viðbætur af öðrum gerðum (gagnaveitu, pallborð) og ýmis mælaborð sem ósjálfstæði.

Þróun viðbót fyrir Grafana: saga stórra skota
Dæmi um ósjálfstæði viðbóta með type=app.

Þú getur notað bæði JavaScript og TypeScript sem forritunarmál (við völdum það). Undirbúningur fyrir hello-world viðbætur af hvaða gerð sem þú getur finna með hlekk: þessi geymsla inniheldur fjöldann allan af byrjendapökkum (það er meira að segja tilraunadæmi um viðbót í React) með fyrirfram uppsettum og stilltum smiðjum.

Hluti 2: Undirbúningur nærumhverfis

Til að vinna við viðbótina þurfum við náttúrulega kubernetes þyrping með öllum foruppsettum verkfærum: prometheus, node-exporter, kube-state-metrics, grafana. Umhverfið ætti að vera sett upp á fljótlegan, auðveldan og náttúrulegan hátt og til að tryggja heita endurhleðslu ætti að setja Grafana gagnaskrána upp beint frá vél þróunaraðilans.

Þægilegasta leiðin, að okkar mati, til að vinna á staðnum með kubernetes er minikube. Næsta skref er að setja upp Prometheus + Grafana samsetninguna með því að nota prometheus-operator. IN Þessi grein Ferlið við að setja upp prometheus-operator á minikube er lýst í smáatriðum. Til að virkja þrautseigju verður þú að stilla færibreytuna þrautseigja: satt í töflunum/grafana/values.yaml skránni skaltu bæta við eigin PV og PVC og tilgreina þau í persistence.existingClaim færibreytunni

Síðasta minikube kynningarforritið okkar lítur svona út:

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. hluti: raunveruleg þróun

Object Model

Til að undirbúa innleiðingu viðbótarinnar ákváðum við að lýsa öllum grunneiningum Kubernetes sem við munum vinna með í formi TypeScript flokka: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Hver þessara flokka erfir frá hinum almenna BaseModel flokki, sem lýsir byggingaraðilanum, eyðileggjandanum, aðferðum til að uppfæra og skipta um sýnileika. Hver flokkur lýsir hreiðrum tengslum við aðrar einingar, til dæmis lista yfir hólf fyrir einingu af gerð dreifingar.

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

Með hjálp getters og setjara getum við sýnt eða stillt einingamælingar sem við þurfum á þægilegu og læsilegu formi. Til dæmis, sniðinn framleiðsla af úthlutanlegum örgjörvahnútum:

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

síður

Listi yfir allar viðbótasíðurnar okkar er upphaflega lýst í pluing.json okkar í ósjálfstæðishlutanum:

Þróun viðbót fyrir Grafana: saga stórra skota

Í reitnum fyrir hverja síðu verðum við að gefa til kynna SÍÐANAFNIÐ (því verður síðan breytt í snigl sem verður aðgengileg þessari síðu); heiti íhlutsins sem ber ábyrgð á rekstri þessarar síðu (listi yfir íhluti er fluttur út í module.ts); sem gefur til kynna notendahlutverkið sem vinna með þessari síðu er í boði fyrir og leiðsögustillingar fyrir hliðarstikuna.

Í hlutanum sem ber ábyrgð á rekstri síðunnar verðum við að stilla templateUrl, þar sem slóðin að html-skránni með markup liggur þangað. Inni í stjórnandanum, með innspýtingu háðs, getum við fengið aðgang að allt að 2 mikilvægum hornþjónustu:

  • backendSrv - þjónusta sem veitir samskipti við Grafana API netþjóninn;
  • datasourceSrv - þjónusta sem veitir staðbundna samskipti við alla gagnagjafa sem eru uppsettir í Grafana þínum (til dæmis .getAll() aðferðin - skilar lista yfir alla uppsettu gagnagjafa; .get( ) - skilar tilvikshlut af tilteknum gagnagjafa.

Þróun viðbót fyrir Grafana: saga stórra skota

Þróun viðbót fyrir Grafana: saga stórra skota

Þróun viðbót fyrir Grafana: saga stórra skota

Hluti 4: gagnagjafi

Frá sjónarhóli Grafana er gagnaveitan nákvæmlega sama viðbótin og öll hin: það hefur sinn eigin inngangspunkt module.js, það er skrá með meta information plugin.json. Þegar við erum að þróa viðbót með type = app, getum við haft samskipti við bæði núverandi gagnaveitur (til dæmis, prometheus-datasource) og okkar eigin, sem við getum geymt beint í viðbótaskránni (dist/datasource/*) eða sett upp sem ósjálfstæði. Í okkar tilviki kemur gagnaveitan með viðbótakóðanum. Það er líka nauðsynlegt að hafa config.html sniðmát og ConfigCtrl stýringu, sem verður notað fyrir uppsetningarsíðu gagnauppsprettunnar og stjórnandi gagnagjafa, sem útfærir rökfræði gagnagjafans þíns.

Í KubeGraf viðbótinni, frá sjónarhóli notendaviðmótsins, er gagnagjafinn dæmi um kubernetes þyrping sem útfærir eftirfarandi eiginleika (frumkóði er fáanlegur по ссылке):

  • safna gögnum frá k8s api-þjóninum (fá lista yfir nafnrými, uppsetningar...)
  • umboðsbeiðnir til prometheus-datasource (sem er valið í viðbótastillingum fyrir hvern sérstakan klasa) og forsníða svör til að nota gögn bæði á kyrrstæðum síðum og í mælaborðum.
  • að uppfæra gögn á kyrrstæðum viðbótasíðum (með ákveðnum endurnýjunartíðni).
  • vinna úr fyrirspurnum til að búa til sniðmátsblað í grafana-dashboards (metriFindQuery() aðferð)

Þróun viðbót fyrir Grafana: saga stórra skota

Þróun viðbót fyrir Grafana: saga stórra skota

Þróun viðbót fyrir Grafana: saga stórra skota

  • tengingarpróf við loka k8s þyrpinguna.
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"};
       })
}

Sérstakur áhugaverður punktur, að okkar mati, er innleiðing á auðkenningar- og heimildarkerfi fyrir gagnagjafann. Venjulega, út úr kassanum, getum við notað innbyggða Grafana íhluta gagnagjafaHttpSettings til að stilla aðgang að endanlegu gagnagjafanum. Með því að nota þennan íhlut getum við stillt aðgang að http gagnagjafanum með því að tilgreina slóðina og helstu auðkenningar-/heimildarstillingar: innskráningarlykilorð eða client-cert/client-key. Til þess að innleiða möguleikann á að stilla aðgang með því að nota burðarlykilinn (de facto staðallinn fyrir k8s), þurftum við að gera smá lagfæringar.

Til að leysa þetta vandamál geturðu notað innbyggða Grafana „Plugin Routes“ vélbúnaðinn (nánari upplýsingar á opinber skjalasíðu). Í stillingum gagnagjafans okkar getum við lýst yfir sett af leiðarreglum sem grafana proxy-þjónninn mun vinna úr. Til dæmis, fyrir hvern einstakan endapunkt er hægt að stilla hausa eða vefslóðir með möguleika á sniðmát, sem hægt er að taka gögn um úr jsonData og secureJsonData reitunum (til að geyma lykilorð eða tákn á dulkóðuðu formi). Í okkar dæmi, fyrirspurnir eins og /__proxy/api/v1/nafnarými verður settur á slóð eyðublaðsins
/api/v8/nafnarými með heimild: Bearer haus.

Þróun viðbót fyrir Grafana: saga stórra skota

Þróun viðbót fyrir Grafana: saga stórra skota

Til að vinna með k8s api þjóninum þurfum við náttúrulega notanda með skrifvarinn aðgang, birtingarmyndir til að búa til sem þú getur líka fundið í frumkóða viðbótarinnar.

Hluti 5: gefa út

Þróun viðbót fyrir Grafana: saga stórra skota

Þegar þú hefur skrifað þitt eigið Grafana viðbót, vilt þú náttúrulega gera það aðgengilegt almenningi. Í Grafana er þetta safn af viðbótum sem hægt er að fá hér grafana.com/grafana/plugins

Til þess að viðbótin þín sé fáanleg í opinberu versluninni þarftu að gera PR inn þessari geymslumeð því að bæta efni eins og þessu við repo.json skrána:

Þróun viðbót fyrir Grafana: saga stórra skota

þar sem útgáfa er útgáfan af viðbótinni þinni, slóð er tengill á geymsluna og commit er kjötkássa commitsins sem ákveðin útgáfa af viðbótinni verður fáanleg fyrir.

Og við úttakið muntu sjá dásamlega mynd eins og:

Þróun viðbót fyrir Grafana: saga stórra skota

Gögnin fyrir það verða sjálfkrafa tekin úr Readme.md, Changelog.md og plugin.json skránni með viðbótalýsingunni.

6. hluti: í ​​stað ályktana

Við hættum ekki að þróa viðbótina okkar eftir útgáfu. Og nú erum við að vinna að því að fylgjast rétt með notkun auðlinda þyrpingahnúta, kynna nýja eiginleika til að bæta UX, og einnig að safna inn miklu magni af endurgjöf sem berast eftir uppsetningu viðbótarinnar bæði af viðskiptavinum okkar og frá fólki á GitHub (ef þú ferð málið eða dráttarbeiðnin þín, ég verð mjög ánægð :)

Við vonum að þessi grein muni hjálpa þér að skilja svo dásamlegt tól eins og Grafana og, ef til vill, skrifa þitt eigið viðbót.

Takk fyrir!)

Heimild: www.habr.com

Bæta við athugasemd