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
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.
modiwl.ts
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.
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
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
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:
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.
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())
- 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
/api/v8/namespaces gyda'r pennawd Awdurdodi: Cludwr.
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
Rhan 5: rhyddhau
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
Er mwyn i'ch ategyn fod ar gael yn y siop swyddogol, mae angen i chi wneud PR i mewn
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:
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