Grafana plugina arendamine: Ôppetunnid ja kogemused

Tere kĂ”igile! MĂ”ned kuud tagasi kĂ€ivitasime tootmises meie uue avatud lĂ€htekoodiga projekti — Grafana plugina Kubernetes'i jĂ€lgimiseks, mille nimeks saime DevOpsProdigy KubeGraf. Plugina lĂ€htekood on saadaval avalikus GitHub'i hoidlas. Ja selles artiklis tahame jagada teiega lugu sellest, kuidas me plugina loomisega alustasime, milliseid tööriistu kasutasime ja milliste takistustega silmitsi seisisime arenduse kĂ€igus. Alustame!

Osa 0 — sissejuhatus: kuidas me siia jĂ”udsime?

MĂ”te kirjutada omaenda plugin Grafanale tekkis meile tĂ€iesti juhuslikult. Meie ettevĂ”te on enam kui 10 aastat tegelenud erineva keerukusega veebiprojektide jĂ€lgimisega. Selle aja jooksul oleme kogunud suure hulga teadmisi, huvitavaid juhtumeid ja kogemusi erinevate jĂ€lgimissĂŒsteemide kasutamisest. Ja mingil hetkel kĂŒsisime endalt: „Kas on olemas maagiline tööriist Kubernetes'i jĂ€lgimiseks, et nagu öeldakse, „paned paika ja unustad”?..“ Kubernetes'i jĂ€lgimise valdkonna standardiks on juba ammu olnud kombinatsioon Prometheus + Grafana. Ja selle tehnoloogiapaki jaoks on olemas suur hulk erinevaid tööriistu: prometheus-operator, kubernetes-mixin paneelide kogum, grafana-kubernetes-app.

Meile nĂ€is kĂ”ige huvitavam valik olevat grafana-kubernetes-app plugin, kuid see ei ole enam ĂŒle aasta toetust saanud ning lisaks ei oska see töötada uusimate versioonide node-exporter'i ja kube-state-metrics'iga. Ja mingil hetkel otsustasime: „Äkki ei tee me oma lahendust?”

Milliseid ideid otsustasime oma plugina realiseerida:

  • rakenduse kaardi visualiseerimine: mugav rakenduste esitus klastris, rĂŒhmitatuna namespace'ide, deployment'ite kaupa
;
  • suhete visualiseerimine tĂŒĂŒpi „deployment — teenus (+portid)”.
  • klastri rakenduste jaotumise visualiseerimine klastris olevate nod'i vahel.
  • metriikide ja teabe kogumine mitmest allikast: Prometheus ja Kubernetes'i API server.
  • infrastruktuuri jĂ€lgimine (protsessoriaja, mĂ€lu, kĂ”vakettateenuse ja vĂ”rgu kasutamine), samuti rakenduste loogika jĂ€lgimine — pod'ide tervisestatus, saadaval olevate koopiate arv, teave liveness/readyness testide lĂ€bimise kohta.

Osa 1: Mis on „Grafana plugin“?

Tehnilisest vaatenurgast on Grafana plugin Angulari kontrollija, mis salvestatakse Grafana data katalooge./var/grafana/plugins/<your_plugin_name>/dist/module.js) ja vĂ”ib laadida SystemJS-modulina. Samuti peab selle katalooge olema fail plugin.json, mis sisaldab kogu teavet teie plugina kohta: nimi, versioon, plugina tĂŒĂŒp, lingid hoidla/sait/ litsents, sĂ”ltuvused ja nii edasi.

Grafana plugina arendamine: Ôppetunnid ja kogemused
module.ts

Grafana plugina arendamine: Ôppetunnid ja kogemused
plugin.json

Nagu nĂ€ha ekraanipildilt, oleme mÀÀranud plugin.type = app. Grafana pluginaid on kolm tĂŒĂŒpi:

paneel: kĂ”ige levinum plugina tĂŒĂŒp — esindab paneeli, mis visualiseerib teatud mÔÔdikuid, kasutatakse erinevate armatuurlaudade loomiseks.
andmeallika: andmeallika konnektor (nÀiteks Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: plugin, mis vĂ”imaldab teil luua oma frontendi rakenduse Grafanas, luua oma html-lehti ja manuaalselt pöörduda andmeallika poole, et visualiseerida erinevaid andmeid. Samuti vĂ”ivad sĂ”ltuvustena kasutada muid plugina tĂŒĂŒpe (andmeallikas, paneel) ja erinevaid armatuurlaudu.

Grafana plugina arendamine: Ôppetunnid ja kogemused
NĂ€ide plugina sĂ”ltuvustest tĂŒĂŒbi = app kohta.

Programmeerimiskeelena saab kasutada nii JavaScripti kui ka TypeScripti (me oleme valinud viimase). Valmistooted hello-world pluginate jaoks igasugustes tĂŒĂŒpidest leiate ĂŒhenduse kaudu: see hoidla sisaldab suurt hulka starter-pack'e (sealhulgas eksperimenteerimiste nĂ€olu plugina React'i peal) koos eelinstallitud ja konfigureeritud kogumikega.

Osa 2: kohaliku keskkonna ettevalmistamine

Plugina arendamiseks on meil loomulikult vaja kubernetes klastri kÔigi eelkohustuslike tööriistadega: prometheus, node-exporter, kube-state-metrics, grafana. Keskkond peab olema seadistatav kiiresti, kergelt ja vaevata, ja hot-reload andmete kausta jaoks peab Grafana kaust olema otseselt arendaja masinast mÀhitud.

Meie arvates on kubernetes'ega kohalikuks tööks kĂ”ige mugavam minikube. JĂ€rgmine samm on installida Prometheus + Grafana koos prometheus-operatoriga. KĂ€esolevas selles artiklis on ĂŒksikasjalikult kirjeldatud prometheus-operatori installimise protsessi minikube'is. PĂŒsivuse sisselĂŒlitamiseks on vajalik seadistada parameeter persistence: true charts/grafana/values.yaml failis, lisada oma PV ja PVC ning mÀÀrata need parameetrisse persistence.existingClaim

Meie lÔplik minikube'i kÀivitamisskript nÀeb vÀlja jÀrgmine:

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

Osa 3: arendamine

Objektimudel

Plugin'i rakendamise ettevalmistamiseks otsustasime kirjeldada kĂ”iki pĂ”hielemente Kubernetes'is, millega me töötame, TypeScript'i klassidena: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. IgaĂŒks neist klassidest pĂ€rib ĂŒldklassist BaseModel, milles on kirjeldatud konstruktor, destruktor, meetodid uuendamiseks ja nĂ€htavuse vahetamiseks. Igas klassis on kirjeldatud ka sisemised suhted teiste elementidega, nĂ€iteks deployment'i tĂŒĂŒpi elemendi pod'id.

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

export class Deployment extends BaseModel {
   pods: Array;
   services: Array;

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

Getter'ite ja setter'ite abil saame vÀlja tuua vÔi seada meile vajalikud metrikad elementide mÔistetaval ja loetaval kujul. NÀiteks vormindatud vÀljund allocatable cpu nod'ist:

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

Lehed

Meie plugin'i kÔigi lehtede nimekiri on algselt kirjeldatud meie pluing.json failis sÔltuvuste osas:

Grafana plugina arendamine: Ôppetunnid ja kogemused

Iga lehe jaoks peame mÀÀrama LEHE NIME (mille abil see leht hiljem slug'iks konvertitakse); komponendi nime, mis vastutab selle lehe töö eest (komponentide nimekiri eksporditakse module.ts); kasutaja rolli, kellele on see leht ja sidumise seaded saadaval, ning navigatsiooni seadistused kĂŒlgriba jaoks.

Komponendis, mis vastutab lehe töö eest, peame seadma templateUrl, edastades sinna html-faili tee, kus on mark-up. Kontrollija sees saame sÔltuvuse sisestamise kaudu juurdepÀÀsu kahele olulisele angular-teenusele:

  • backendSrv — teenus, mis tagab suhtluse grafana api-serveriga;
  • datasourceSrv — teenus, mis tagab kohapealse suhtluse kĂ”igi sinu Grafanas installitud andmeallikatega (nĂ€iteks meetod .getAll() — tagastab nimekirja kĂ”igist installitud andmeallikatest; .get() — tagastab konkreetse andmeallika objekti-instandi.

Grafana plugina arendamine: Ôppetunnid ja kogemused

Grafana plugina arendamine: Ôppetunnid ja kogemused

Grafana plugina arendamine: Ôppetunnid ja kogemused

Osa 4: andmeallikas

Grafana vaatepunktist on datasource tĂ€pselt sama tĂŒĂŒpi plugin nagu kĂ”ik teised: sellel on oma sisenemispunkt module.js ja metaandmete fail plugin.json. Kui arendame pluginat tĂŒĂŒbiga app, saame suhelda nii olemasolevate datasource'idega (nĂ€iteks prometheus-datasource) kui ka omaenda, mida saame hoida otse pluginakataloogis (dist/datasource/*) vĂ”i paigaldada sĂ”ltuvusena. Meie puhul tarnitakse datasource koos pluginakoodiga. Samuti on vajalik config.html mall ja ConfigCtrl kontrollija, mida kasutatakse datasource'i eksemplari konfigureerimise lehel ja Datasource kontrollija jaoks, kus on teostatud teie datasource'i tööd loogika.

Pluginas KubeGraf, kasutajaliidese vaatenurgast, esindab datasource kubernetes-klastri eksemplari, kus on rakendatud jÀrgmised vÔimalused (allikakood on saadaval linki pidi):

  • andmete kogumine k8s api-server'ist (namespace'ide, deployment'ide jne. loendi saamine)
  • pĂ€ringute edastamine prometheus-datasource'ile (mis valitakse pluginaseadetes iga konkreetse klastrite jaoks) ja vastuste vormindamine andmete kasutamiseks nii staatilistes lehtedes kui ka armatuurlaudadel.
  • andmete vĂ€rskendamine pluginas staatilistes lehtedes (kehtiva vĂ€rskendussagedusega).
  • pĂ€ringute töötlemine template-loendi koostamiseks grafana-dashboards (meetod .metriFindQuery())

Grafana plugina arendamine: Ôppetunnid ja kogemused

Grafana plugina arendamine: Ôppetunnid ja kogemused

Grafana plugina arendamine: Ôppetunnid ja kogemused

  • ĂŒhenduse testimine lĂ”pliku k8s-klastriga.
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: "Andmeallikas on korras", title: "Edu"};
           }else{
               return {status: "error", message: "Andmeallikas ei ole korras", title: "Viga"};
           }
       }, error => {
           return {status: "error", message: "Andmeallikas ei ole korras", title: "Viga"};
       })
}

Meie arvates on eriliselt huvitav aspekt andmeallika autentimise ja autoriseerimise mehhanismi rakendamine. Tavaliselt saame me hĂ”lpsasti kasutada Grafana sisseehitatud komponenti — datasourceHttpSettings, et konfigureerida juurdepÀÀsu lĂ”pp-andmeallikale. Selle komponendi abil saame seada http-andmeallika pĂ€ringu, mĂ€rkides url ja pĂ”hiseaded autentimise/autoriseerimise jaoks: kasutajanimi-parool vĂ”i client-cert/client-key. Selleks, et rakendada juurdepÀÀsu seadistamise vĂ”imalust bearer-tokeniga (de facto standard k8s jaoks), pidime natuke „kemplema”.

Selle probleemi lahendamiseks saab kasutada Grafana sisseehitatud mehhanismi „Plugin Routes” (lisainfo ametlikult dokumentatsioonilehel). Meie andmeallika seadetes saame mÀÀratleda reeglite kogumi, mida grafana proxy-server töötleb. NĂ€iteks iga eraldi endpoint'i jaoks on vĂ”imalik mÀÀrata pealkirju vĂ”i url-e, kasutades mallide loomise vĂ”imalust, mille andmed vĂ”ivad tulla jsonData ja secureJsonData (salajaste andmete vĂ”i tokenite krĂŒptitud kujul hoidmiseks) vĂ€liidest. Meie nĂ€ites on pĂ€ringud, mis nĂ€evad vĂ€lja /__proxy/api/v1/namespaces proksitud url-ile, mis nĂ€eb vĂ€lja
/api/v1/namespaces, kus on mÀÀratud pealkiri Authorization: Bearer.

Grafana plugina arendamine: Ôppetunnid ja kogemused

Grafana plugina arendamine: Ôppetunnid ja kogemused

Muidugi, et töötada k8s api-serveriga, vajame me kasutajat koos readonly juurdepÀÀsuga, mille loomiseks mÔeldud manifestid on samuti saadaval plugin-koodi all.

Osa 5: vÀljaanne

Grafana plugina arendamine: Ôppetunnid ja kogemused

PĂ€rast oma Grafana plugina kirjutamist saate loomulikult soovida seda avatud kasutada. Grafanas on pluginate teek, mis on saadaval aadressil grafana.com/grafana/plugins

Kuna teie plugin oleks ametlikus poes nÀhtav, peate tegema PR seda repot, lisades failisse repo.json jÀrgmise sisu:

Grafana plugina arendamine: Ôppetunnid ja kogemused

kus version — teie plugina versioon, url — link repole ja commit — commit'i hash, mille alusel konkreetne plugina versioon on saadaval.

Ja lÔpptulemuseks on imeline pilt:

Grafana plugina arendamine: Ôppetunnid ja kogemused

Andmed selle jaoks saavad automaatselt lÀbi vaadatavaks teie Readme.md, Changelog.md ja plugin.json failist, mis kirjeldab plugina.

Osa 6: jÀreldused

Me ei ole pĂ€rast litsentsi vĂ€ljaandmist oma pistikprogrammi arendust peatatud. Praegu töötame mĂ”istliku klastrinoodide ressursside jĂ€lgimise, uusi funktsioonide rakendamise UX parandamiseks ja suurte tagasisidehulga töötlemise kallal, mida oleme saanud pistikprogrammi installimise kĂ€igus nii oma klientidelt kui ka GitHubi probleemide kaudu (kui jĂ€tate oma probleemide vĂ”i pull request'i, olen vĂ€ga Ă”nnelik 🙂).

Loodame, et see artikkel aitab teil mÔista suurepÀrast tööriista nagu Grafana ning vÔib-olla kirjutada omaenda pistikprogrammi.

AitÀh! )

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster