Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Helo pawb! Ychydig fisoedd yn ôl, lansiwyd ein prosiect ffynhonnell agored newydd i gynhyrchu - yr ategyn Grafana ar gyfer monitro kubernetes, y gwnaethom ei alw DevOpsProdigy KubeGraf. Mae cod ffynhonnell yr ategyn ar gael yn storfa gyhoeddus ar GitHub. Ac yn yr erthygl hon rydym am rannu'r stori gyda chi am sut y gwnaethom greu'r ategyn, pa offer a ddefnyddiwyd gennym a pha beryglon y daethom ar eu traws yn ystod y broses ddatblygu. Awn ni!

Rhan 0 - rhagarweiniol: sut daethon ni i'r pwynt hwn?

Daeth y syniad i ysgrifennu ein ategyn ein hunain ar gyfer Grafan atom ar ddamwain. Mae ein cwmni wedi bod yn monitro prosiectau gwe o wahanol lefelau o gymhlethdod am fwy na 10 mlynedd. Yn ystod y cyfnod hwn, rydym wedi cronni llawer iawn o arbenigedd, achosion diddorol, a phrofiad o ddefnyddio systemau monitro amrywiol. Ac ar ryw adeg fe wnaethon ni ofyn i ni'n hunain: “A oes yna offeryn hud ar gyfer monitro Kubernetes, fel bod, fel maen nhw'n dweud, “ei osod a'i anghofio”?”.. Mae safon y diwydiant ar gyfer monitro k8s, wrth gwrs, wedi bod yn hir ers tro. Cyfuniad Prometheus + Grafana. Ac fel atebion parod ar gyfer y pentwr hwn, mae set fawr o wahanol fathau o offer: prometheus-operator, set o ddangosfyrddau kubernetes-mixin, grafana-kubernetes-app.

Roedd yn ymddangos mai'r ategyn grafana-kubernetes-app oedd yr opsiwn mwyaf diddorol i ni, ond nid yw wedi'i gefnogi ers mwy na blwyddyn ac, ar ben hynny, ni all weithio gyda fersiynau newydd o nod-allforiwr a kube-state-metrics. Ac ar ryw adeg fe benderfynon ni: “Oni ddylem ni wneud ein penderfyniad ein hunain?”

Pa syniadau y gwnaethom benderfynu eu rhoi ar waith yn ein ategyn:

  • delweddu'r “map cais”: cyflwyniad cyfleus o gymwysiadau yn y clwstwr, wedi'u grwpio yn ôl gofodau enwau, gosodiadau...;
  • delweddu cysylltiadau fel “defnyddio - gwasanaeth (+ porthladdoedd)”.
  • delweddu dosbarthiad cymwysiadau clwstwr ar draws nodau clwstwr.
  • casglu metrigau a gwybodaeth o sawl ffynhonnell: Prometheus a gweinydd api k8s.
  • monitro'r rhan seilwaith (defnyddio amser CPU, cof, is-system disg, rhwydwaith) a rhesymeg cymhwyso - codennau statws iechyd, nifer y copïau sydd ar gael, gwybodaeth am basio profion bywiogrwydd / parodrwydd.

Rhan 1: Beth yw “Ategyn Grafana”?

O safbwynt technegol, mae'r ategyn ar gyfer Grafana yn rheolydd onglog, sy'n cael ei storio yng nghyfeiriadur data Grafana (/var/grafana/ategion/ /dist/module.js) a gellir ei lwytho fel modiwl SystemJS. Hefyd yn y cyfeiriadur hwn dylai fod ffeil plugin.json sy'n cynnwys yr holl wybodaeth meta am eich ategyn: enw, fersiwn, math o ategyn, dolenni i'r storfa / gwefan / trwydded, dibyniaethau, ac ati.

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr
modiwl.ts

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr
ategyn.json

Fel y gallwch weld yn y screenshot, rydym yn nodi plugin.type = app. Oherwydd gall ategion ar gyfer Grafana fod o dri math:

panel: y math mwyaf cyffredin o ategyn - mae'n banel ar gyfer delweddu unrhyw fetrigau, a ddefnyddir i adeiladu dangosfyrddau amrywiol.
ffynhonnell data: cysylltydd ategyn i ryw ffynhonnell ddata (er enghraifft, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Ategyn sy'n eich galluogi i adeiladu eich cymhwysiad blaen eich hun y tu mewn i Grafana, creu eich tudalennau html eich hun a chyrchu'r ffynhonnell ddata â llaw i ddelweddu data amrywiol. Hefyd, gellir defnyddio ategion o fathau eraill (ffynhonnell ddata, panel) a dangosfyrddau amrywiol fel dibyniaethau.

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr
Enghreifftiau o ddibyniaethau ategyn gyda type=app.

Gallwch ddefnyddio JavaScript a TypeScript fel iaith raglennu (fe wnaethon ni ei dewis). Paratoadau ar gyfer ategion helo-fyd o unrhyw fath y gallwch dod o hyd i'r ddolen: mae'r storfa hon yn cynnwys nifer fawr o becynnau cychwyn (mae hyd yn oed enghraifft arbrofol o ategyn yn React) gydag adeiladwyr wedi'u gosod ymlaen llaw a'u ffurfweddu.

Rhan 2: paratoi'r amgylchedd lleol

I weithio ar yr ategyn, yn naturiol mae angen clwstwr kubernetes gyda'r holl offer sydd wedi'u gosod ymlaen llaw: prometheus, nod-allforiwr, kube-state-metrics, grafana. Dylid sefydlu'r amgylchedd yn gyflym, yn hawdd ac yn naturiol, ac er mwyn sicrhau ail-lwytho poeth, dylid gosod cyfeiriadur data Grafana yn uniongyrchol o beiriant y datblygwr.

Y ffordd fwyaf cyfleus, yn ein barn ni, i weithio'n lleol gyda kubernetes yw ciwb mini. Y cam nesaf yw gosod y cyfuniad Prometheus + Grafana gan ddefnyddio prometheus-operator. YN yr erthygl hon Disgrifir y broses o osod gweithredwr prometheus ar minikube yn fanwl. Er mwyn galluogi dyfalbarhad, rhaid i chi osod y paramedr dyfalwch: true yn y ffeil siartiau/grafana/values.yaml, ychwanegwch eich PV a'ch PVC eich hun a nodwch nhw yn y paramedr persistence.existingClaim

Mae ein sgript lansio minikube terfynol yn edrych fel hyn:

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

Rhan 3: datblygiad gwirioneddol

Model Gwrthrych

Wrth baratoi ar gyfer gweithredu'r ategyn, fe wnaethom benderfynu disgrifio'r holl endidau Kubernetes sylfaenol y byddwn yn gweithio gyda nhw ar ffurf dosbarthiadau TypeScript: pod, defnydd, daemonset, statefulset, swydd, cronjob, gwasanaeth, nod, gofod enwau. Mae pob un o'r dosbarthiadau hyn yn etifeddu o'r dosbarth BaseModel cyffredin, sy'n disgrifio'r adeiladwr, y distrywiwr, y dulliau ar gyfer diweddaru a newid gwelededd. Mae pob un o'r dosbarthiadau yn disgrifio perthnasoedd nythu ag endidau eraill, er enghraifft, rhestr o godennau ar gyfer endid o fath.

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

Gyda chymorth derbynwyr a gosodwyr, gallwn arddangos neu osod y metrigau endid sydd eu hangen arnom mewn ffurf gyfleus a darllenadwy. Er enghraifft, allbwn wedi'i fformatio o nodau cpu y gellir eu dyrannu:

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

tudalennau

Disgrifir rhestr o'n holl dudalennau ategyn i ddechrau yn ein pluing.json yn yr adran dibyniaethau:

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Yn y bloc ar gyfer pob tudalen mae'n rhaid i ni nodi ENW'R TUDALEN (bydd yn cael ei drawsnewid wedyn yn wlithen y bydd y dudalen hon yn hygyrch); enw'r gydran sy'n gyfrifol am weithrediad y dudalen hon (mae'r rhestr o gydrannau'n cael ei hallforio i module.ts); yn nodi rôl defnyddiwr y mae gwaith gyda'r dudalen hon ar gael ar ei chyfer a gosodiadau llywio ar gyfer y bar ochr.

Yn y gydran sy'n gyfrifol am weithrediad y dudalen, rhaid inni osod templateUrl, gan basio yno'r llwybr i'r ffeil html gyda marcio. Y tu mewn i'r rheolydd, trwy chwistrelliad dibyniaeth, gallwn gael mynediad at hyd at 2 wasanaeth onglog pwysig:

  • backendSrv - gwasanaeth sy'n darparu rhyngweithio â gweinydd API Grafana;
  • datasourceSrv - gwasanaeth sy'n darparu rhyngweithiad lleol gyda'r holl ffynonellau data sydd wedi'u gosod yn eich Grafana (er enghraifft, y dull .getAll() - yn dychwelyd rhestr o'r holl ffynonellau data sydd wedi'u gosod; .get( ) - yn dychwelyd gwrthrych enghreifftiol o ffynhonnell ddata benodol.

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Rhan 4: ffynhonnell ddata

O safbwynt Grafana, mae datasource yn union yr un ategyn â'r lleill i gyd: mae ganddi ei modiwl pwynt mynediad ei hun.js, mae ffeil gyda meta information plugin.json. Wrth ddatblygu ategyn gyda type = app, gallwn ryngweithio â'r ddau ffynhonnell data presennol (er enghraifft, prometheus-datasource) a'n un ni, y gallwn ei storio'n uniongyrchol yn y cyfeiriadur ategyn (dist / datasource / *) neu ei osod fel dibyniaeth. Yn ein hachos ni, mae'r ffynhonnell ddata yn dod gyda'r cod ategyn. Mae hefyd yn angenrheidiol cael templed config.html a rheolydd ConfigCtrl, a ddefnyddir ar gyfer y dudalen ffurfweddu enghraifft ffynhonnell data a'r rheolydd Datasource, sy'n gweithredu rhesymeg eich ffynhonnell ddata.

Yn yr ategyn KubeGraf, o safbwynt y rhyngwyneb defnyddiwr, mae'r ffynhonnell ddata yn enghraifft o glwstwr kubernetes sy'n gweithredu'r galluoedd canlynol (cod ffynhonnell ar gael по ссылке):

  • casglu data o'r gweinydd ap k8s (cael rhestr o ofodau enwau, gosodiadau...)
  • dirprwyo ceisiadau i ffynhonnell data prometheus (a ddewisir yng ngosodiadau'r ategyn ar gyfer pob clwstwr penodol) a fformatio ymatebion i ddefnyddio data mewn tudalennau sefydlog ac mewn dangosfyrddau.
  • diweddaru data ar dudalennau ategyn statig (gyda chyfradd adnewyddu benodol).
  • prosesu ymholiadau i gynhyrchu taflen dempled mewn dangosfyrddau grafana (dull metriFindQuery())

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

  • prawf cysylltiad â'r clwstwr k8s terfynol.
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"};
       })
}

Pwynt diddorol ar wahân, yn ein barn ni, yw gweithredu mecanwaith dilysu ac awdurdodi ar gyfer y ffynhonnell ddata. Yn nodweddiadol, allan o'r blwch, gallwn ddefnyddio'r datasourceHttpSettings cydran Grafana adeiledig i ffurfweddu mynediad i'r ffynhonnell ddata derfynol. Gan ddefnyddio'r gydran hon, gallwn ffurfweddu mynediad i'r ffynhonnell ddata http trwy nodi'r url a'r gosodiadau dilysu/awdurdodi sylfaenol: mewngofnodi-password, neu client-cert/client-key. Er mwyn gweithredu'r gallu i ffurfweddu mynediad gan ddefnyddio tocyn cludwr (y safon de facto ar gyfer k8s), bu'n rhaid i ni wneud ychydig o tweaking.

I ddatrys y broblem hon, gallwch ddefnyddio'r mecanwaith adeiledig yn Grafana “Plugin Routes” (mwy o fanylion yn tudalen dogfennaeth swyddogol). Yng ngosodiadau ein ffynhonnell ddata, gallwn ddatgan set o reolau llwybro a fydd yn cael eu prosesu gan y gweinydd dirprwy grafana. Er enghraifft, ar gyfer pob pwynt terfyn unigol mae'n bosibl gosod penawdau neu urls gyda'r posibilrwydd o dempled, y gellir cymryd data ar eu cyfer o'r meysydd jsonData a secureJsonData (ar gyfer storio cyfrineiriau neu docynnau ar ffurf wedi'i hamgryptio). Yn ein enghraifft, mae ymholiadau fel /__proxy/api/v1/namespaces yn cael ei ddirprwyo i url y ffurflen
/api/v8/namespaces gyda'r pennawd Awdurdodi: Cludwr.

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Yn naturiol, i weithio gyda'r gweinydd api k8s mae angen defnyddiwr gyda mynediad darllen yn unig, maniffestau ar gyfer creu y gallwch chi ddod o hyd iddynt hefyd yn cod ffynhonnell ategyn.

Rhan 5: rhyddhau

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Unwaith y byddwch wedi ysgrifennu eich ategyn Grafana eich hun, byddwch yn naturiol am ei wneud ar gael i'r cyhoedd. Yn Grafana dyma lyfrgell o ategion sydd ar gael yma grafana.com/grafana/plugins

Er mwyn i'ch ategyn fod ar gael yn y siop swyddogol, mae angen i chi wneud PR i mewn ystorfa hontrwy ychwanegu cynnwys fel hyn at y ffeil repo.json:

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

lle mai fersiwn yw'r fersiwn o'ch ategyn, mae url yn ddolen i'r ystorfa, ac ymrwymo yw hash y ymrwymiad y bydd fersiwn penodol o'r ategyn ar gael ar ei gyfer.

Ac yn yr allbwn fe welwch lun gwych fel:

Datblygu ategyn ar gyfer Grafana: hanes ergydion mawr

Bydd y data ar ei gyfer yn cael ei gipio'n awtomatig o'ch Readme.md, Changelog.md a'r ffeil plugin.json gyda disgrifiad yr ategyn.

Rhan 6: yn lle casgliadau

Ni wnaethom roi'r gorau i ddatblygu ein ategyn ar ôl ei ryddhau. Ac yn awr rydym yn gweithio ar fonitro'r defnydd o adnoddau nodau clwstwr yn gywir, gan gyflwyno nodweddion newydd i wella UX, a hefyd cribinio llawer iawn o adborth a dderbyniwyd ar ôl gosod yr ategyn gan ein cleientiaid a chan bobl ar GitHub (os byddwch yn gadael eich mater neu gais tynnu, byddaf yn hapus iawn :)

Gobeithiwn y bydd yr erthygl hon yn eich helpu i ddeall teclyn mor wych â Grafana ac, efallai, ysgrifennu eich ategyn eich hun.

Diolch!)

Ffynhonnell: hab.com

Ychwanegu sylw