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
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.
mát.ts
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.
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
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
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:
Í 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.
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ð)
- 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 á
/api/v8/nafnarými með heimild: Bearer haus.
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ð í
Hluti 5: gefa út
Þ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
Til þess að viðbótin þín sé fáanleg í opinberu versluninni þarftu að gera PR inn
þ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:
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