Tere kõigile! Paar kuud tagasi käivitasime tootmisse oma uue avatud lähtekoodiga projekti – kubernetese jälgimiseks mõeldud Grafana plugina, mille nimetasime
0. osa – sissejuhatus: kuidas me selle punktini jõudsime?
Idee kirjutada Grafani jaoks oma pistikprogramm tuli meile täiesti juhuslikult. Meie ettevõte on jälginud erineva keerukusastmega veebiprojekte üle 10 aasta. Selle ajaga on kogunenud suur hulk eriteadmisi, huvitavaid juhtumeid ja kogemusi erinevate seiresüsteemide kasutamisel. Ja mingil hetkel küsisime endalt: “Kas Kubernetese jälgimiseks on olemas maagiline tööriist, et, nagu öeldakse, “seadista ja unusta”?”.. Tööstusstandard k8-de jälgimisel on muidugi juba ammu olnud Prometheus + Grafana kombinatsioon. Ja selle virna valmislahendustena on olemas suur hulk erinevaid tööriistu: prometheus-operaator, kubernetes-mixini armatuurlaudade komplekt, grafana-kubernetes-app.
Grafana-kubernetes-rakenduse pistikprogramm tundus meie jaoks kõige huvitavam variant, kuid seda pole enam kui aasta toetatud ja pealegi ei saa see töötada koos uute versioonidega node-exporter ja kube-state-metrics. Ja mingil hetkel otsustasime: "Kas me ei peaks ise otsustama?"
Milliseid ideid otsustasime oma pistikprogrammis rakendada:
- "rakenduste kaardi" visualiseerimine: rakenduste mugav esitlemine klastris, rühmitatud nimeruumide, juurutuste järgi...;
- ühenduste visualiseerimine nagu "juurutamine - teenus (+pordid)".
- klastrirakenduste jaotuse visualiseerimine klastri sõlmede vahel.
- mõõdikute ja teabe kogumine mitmest allikast: Prometheus ja k8s api server.
- nii infrastruktuuri osa (protsessori aja, mälu, ketta alamsüsteemi, võrgu kasutus) kui ka rakendusloogika jälgimine - terviseseisundi podid, saadaolevate koopiate arv, info elavuse/valmisoleku testide läbimise kohta.
1. osa: Mis on Grafana pistikprogramm?
Tehnilisest vaatenurgast on Grafana pistikprogramm nurkkontroller, mis on salvestatud Grafana andmekataloogi (/var/grafana/plugins/ /dist/module.js) ja seda saab laadida SystemJS-moodulina. Selles kataloogis peaks olema ka fail plugin.json, mis sisaldab kogu teie pistikprogrammi metateavet: nimi, versioon, pistikprogrammi tüüp, lingid hoidlale/saidile/litsentsile, sõltuvused ja nii edasi.
moodul.ts
plugin.json
Nagu näete ekraanipildil, määrasime plugin.type = app. Kuna Grafana pistikprogramme võib olla kolme tüüpi:
paneel: kõige levinum pistikprogrammi tüüp – see on paneel mis tahes mõõdikute visualiseerimiseks, mida kasutatakse erinevate armatuurlaudade koostamiseks.
andmeallikas: plugina pistikühendus mõne andmeallikaga (näiteks Prometheus-andmeallikas, ClickHouse-andmeallikas, ElasticSearch-andmeallikas).
app: pistikprogramm, mis võimaldab teil Grafana sees luua oma kasutajaliidese rakenduse, luua oma html-lehti ja erinevate andmete visualiseerimiseks andmeallikale käsitsi juurde pääseda. Samuti saab sõltuvustena kasutada teist tüüpi pluginaid (andmeallikas, paneel) ja erinevaid armatuurlaudu.
Näidissõltuvuste pistikprogrammide tüüp=app.
Programmeerimiskeelena saab kasutada nii JavaScripti kui TypeScripti (valisime selle). Ettevalmistused mis tahes tüüpi hello-worldi pistikprogrammide jaoks
2. osa: kohaliku keskkonna ettevalmistamine
Pistikprogrammi kallal töötamiseks vajame loomulikult kubernetese klastrit koos kõigi eelinstallitud tööriistadega: prometheus, node-exporter, kube-state-metrics, grafana. Keskkond tuleks seadistada kiiresti, lihtsalt ja loomulikult ning kuuma taaslaadimise tagamiseks tuleks Grafana andmekataloog paigaldada otse arendaja masinast.
Meie arvates on kõige mugavam viis kubernetesega kohapeal töötada
Meie viimane minikube käivitamisskript näeb välja selline:
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. osa: tegelik areng
Objektimudel
Pistikprogrammi juurutamise ettevalmistamisel otsustasime kirjeldada kõiki Kubernetese põhioleme, millega töötame TypeScripti klasside kujul: pod, juurutamine, deemonset, olekuteabe komplekt, töö, cronjob, teenus, sõlm, nimeruum. Kõik need klassid pärivad ühisest BaseModel klassist, mis kirjeldab konstruktorit, hävitajat ja nähtavuse värskendamise ja vahetamise meetodeid. Iga klass kirjeldab pesastatud seoseid teiste olemitega, näiteks juurutamise tüüpi olemi poodide loendit.
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 = [];
}
}
Getterite ja setterite abil saame kuvada või seadistada meile vajalikke olemimõõdikuid mugaval ja loetaval kujul. Näiteks eraldatavate protsessorisõlmede vormindatud väljund:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
Lehekülgede
Kõigi meie pistikprogrammide lehtede loendit kirjeldatakse algselt faili pluing.json jaotises sõltuvused:
Iga lehe plokis peame märkima LEHEKÜLJE NIMI (see teisendatakse seejärel leheks, mille kaudu see leht on juurdepääsetav); selle lehe töötamise eest vastutava komponendi nimi (komponentide loend eksporditakse module.ts-i); mis näitab kasutaja rolli, mille jaoks selle lehe töö on saadaval, ja külgriba navigeerimisseadeid.
Lehe töötamise eest vastutavas komponendis peame määrama templateUrl, edastades sinna tee html-faili koos märgistusega. Kontrolleri sees pääseme sõltuvuse süstimise kaudu juurde kuni kahele olulisele nurgateenusele:
- backendSrv - teenus, mis pakub suhtlust Grafana API serveriga;
- datasourceSrv – teenus, mis pakub kohalikku suhtlust kõigi teie Grafanasse installitud andmeallikatega (näiteks meetod .getAll() – tagastab kõigi installitud andmeallikate loendi; .get( ) – tagastab konkreetse andmeallika eksemplariobjekti.
4. osa: andmeallikas
Grafana vaatenurgast on andmeallikas täpselt sama plugin nagu kõik teised: sellel on oma sisenemispunkt module.js, seal on fail metainfoga plugin.json. Plugina arendamisel type = app saame suhelda nii olemasolevate andmeallikatega (näiteks prometheus-datasource) kui ka enda omadega, mida saame salvestada otse pluginate kataloogi (dist/datasource/*) või installida sõltuvusena. Meie puhul on andmeallikas kaasas pistikprogrammi kood. Samuti on vajalik mall config.html ja ConfigCtrl-kontroller, mida kasutatakse andmeallika eksemplari konfiguratsioonilehe jaoks ning andmeallika kontroller, mis rakendab teie andmeallika loogikat.
KubeGrafi pistikprogrammis on kasutajaliidese vaatenurgast andmeallikaks kubernetese klastri eksemplar, mis rakendab järgmisi võimalusi (lähtekood on saadaval
- andmete kogumine k8s api-serverist (nimeruumide loendi hankimine, juurutused jne)
- prometheus-datasource päringute puhverserver (mis valitakse iga konkreetse klastri pistikprogrammi seadetes) ja vastuste vormindamine, et kasutada andmeid nii staatilistel lehtedel kui ka armatuurlaudadel.
- staatiliste pistikprogrammide lehtede andmete värskendamine (määratud värskendussagedusega).
- päringute töötlemine mallilehe genereerimiseks grafana-armatuurlaudades (meetod metriFindQuery())
- ühenduse test 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: "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"};
})
}
Eraldi huvitav punkt on meie arvates andmeallika autentimis- ja autoriseerimismehhanismi rakendamine. Tavaliselt saame lõplikule andmeallikale juurdepääsu konfigureerimiseks kasutada sisseehitatud Grafana komponenti datasourceHttpSettings. Seda komponenti kasutades saame konfigureerida juurdepääsu http-andmeallikale, määrates URL-i ja põhilised autentimise/volitamise sätted: login-password või client-cert/client-key. Selleks, et rakendada võimalust juurdepääsu konfigureerimiseks kandemärgiga (de facto standard k8-de jaoks), pidime seda veidi kohandama.
Selle probleemi lahendamiseks võite kasutada sisseehitatud Grafana "Plugin Routes" mehhanismi (lisateavet leiate aadressilt
/api/v8/namespaces päisega Authorization: kandja.
Loomulikult vajame k8s api serveriga töötamiseks kirjutuskaitstud juurdepääsuga kasutajat, mille loomise manifestid leiate ka
5. osa: vabastamine
Kui olete oma Grafana pistikprogrammi kirjutanud, soovite selle loomulikult avalikult kättesaadavaks teha. Grafanas on see siin saadaval olevate pluginate teek
Selleks, et teie pistikprogramm oleks ametlikus poes saadaval, peate tegema PR-i
kus versioon on teie pistikprogrammi versioon, siis url on link hoidlale ja commit on sissekande räsi, mille jaoks on saadaval plugina konkreetne versioon.
Ja väljundis näete imelist pilti nagu:
Selle andmed haaratakse automaatselt teie Readme.md-st, Changelog.md-st ja failist plugin.json koos pistikprogrammi kirjeldusega.
6. osa: järelduste asemel
Me ei lõpetanud oma pistikprogrammi arendamist pärast väljalaskmist. Ja nüüd tegeleme klastri sõlmede ressursside kasutamise korrektse jälgimisega, uute funktsioonide juurutamisega UX-i täiustamiseks ja ka suure hulga tagasiside kogumiseks, mis on pärast pistikprogrammi installimist saadud nii meie klientidelt kui ka GitHubi inimestelt (kui lahkute Teie probleem või tõmbetaotlus, olen väga rahul :)
Loodame, et see artikkel aitab teil mõista sellist imelist tööriista nagu Grafana ja võib-olla kirjutada oma pistikprogrammi.
Aitäh!)
Allikas: www.habr.com