Ndewo, unu niile! Ọnwa ole na ole gara aga, anyị malitere ọrụ mmeghe ọhụrụ anyị na mmepụta - ngwa mgbakwunye Grafana maka nlekota kubernetes, nke anyị kpọrọ.
Akụkụ 0 - mmalite: kedu ka anyị siri ruo ebe a?
Echiche ide ngwa mgbakwunye anyị maka Grafan bịakwutere anyị na mberede. Ụlọ ọrụ anyị na-enyocha ọrụ weebụ nke ọkwa dị iche iche nke mgbagwoju anya karịa afọ 10. N'ime oge a, anyị achịkọtala ọnụ ọgụgụ dị ukwuu nke nka, ihe ndị na-adọrọ mmasị, na ahụmahụ na-eji usoro nlekota dị iche iche. Ma n'oge ụfọdụ anyị jụrụ onwe anyị: "Enwere ngwá ọrụ anwansi maka nlekota Kubernetes, nke mere na, dị ka ha na-ekwu," tọọ ya ma chefuo ya "? ". Ngwakọta Prometheus + Grafana. Dịkwa ka ihe ngwọta edoziziri maka nchịkọta a, e nwere nnukwu ngwá ọrụ dị iche iche: prometheus-operator, a set of kubernetes-mixin dashboards, grafana-kubernetes-app.
Ngwa ngwa grafana-kubernetes-app yiri ka ọ bụ nhọrọ kacha amasị anyị, mana akwadobeghị ya ihe karịrị otu afọ yana, ọzọkwa, enweghị ike ịrụ ọrụ na ụdị node-exporter na kube-state-metrics. Ma n'oge ụfọdụ anyị kpebiri, sị: "Ọ bụ na anyị ekwesịghị ime mkpebi nke anyị?"
Kedu echiche anyị kpebiri itinye na ngwa mgbakwunye anyị:
- nleba anya nke “maapụ ngwa”: ngosipụta dabara adaba nke ngwa n'ụyọkọ, nke ejiri aha aha chịkọtara, mbugharị...;
- nleba anya nke njikọ dị ka "nkwanye - ọrụ (+ ọdụ ụgbọ mmiri)".
- nhụta nkesa nke ngwa ụyọkọ n'ofe ọnụ ụyọkọ.
- nchịkọta metrik na ozi sitere n'ọtụtụ ebe: Prometheus na k8s api server.
- nlekota nke ma akụkụ akụrụngwa (iji oge CPU, ebe nchekwa, disk subsystem, netwọk) na ngwa mgbagha - ahụike-ọnọdụ pods, ọnụ ọgụgụ nke oyiri dị, ozi gbasara ịgafe ndụ/nnwale ịdị njikere.
Part 1: Gịnị bụ a "Grafana ngwa mgbakwunye"?
Site n'echiche teknụzụ, ngwa mgbakwunye maka Grafana bụ onye na-ahụ maka angular, nke echekwara na ndekọ data Grafana (/var/grafana/plugins/ /dist/module.js) ma enwere ike ibu ya dị ka modul SystemJS. Nakwa na ndekọ a, ekwesịrị inwe faịlụ plugin.json nwere ozi meta niile gbasara ngwa mgbakwunye gị: aha, ụdị, ụdị ngwa mgbakwunye, njikọ na ebe nchekwa/saịtị/ikike, ịdabere na ihe ndị ọzọ.
modul.ts
ngwa mgbakwunye.json
Dị ka ị na-ahụ na nseta ihuenyo, anyị kpọmkwem plugin.type = ngwa. N'ihi na plugins maka Grafana nwere ike ịbụ ụdị atọ:
panel: ụdị ngwa mgbakwunye a na-ahụkarị - ọ bụ panel maka iji anya nke uche ọ bụla metrics, eji wuo dashboard dị iche iche.
isi iyi data: ngwa mgbakwunye na ụfọdụ isi iyi data (dịka ọmụmaatụ, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
ngwa: Ngwa mgbakwunye na-enye gị ohere iwulite ngwa frontend nke gị n'ime Grafana, mepụta ibe HTML nke gị wee jiri aka nweta isi iyi data iji hụ data dị iche iche. Ọzọkwa, plugins nke ụdị ndị ọzọ (datasource, panel) na dị iche iche dashboards nwere ike iji dị ka ndabere.
Ndabere ngwa mgbakwunye ihe atụ nwere ụdị = ngwa.
Ị nwere ike iji ma Javascript na TypeScript dị ka asụsụ mmemme (anyị họọrọ ya). Nkwadebe maka hello-world plugins nke ụdị ọ bụla ị nwere ike
Nkebi 2: ịkwadebe gburugburu ebe obibi
Iji rụọ ọrụ na ngwa mgbakwunye ahụ, anyị chọrọ ụyọkọ kubernetes nwere ngwaọrụ etinyegoro mbụ: prometheus, node-exporter, kube-state-metrics, grafana. Ekwesịrị ịhazi gburugburu ebe obibi ngwa ngwa, dị mfe na n'ụzọ nkịtị, yana iji hụ na ebughachite ọkụ, akwụkwọ ndekọ data Grafana kwesịrị ịkwanye ozugbo site na igwe onye nrụpụta.
Ụzọ kachasị mma, n'echiche anyị, na-arụ ọrụ na mpaghara na kubernetes bụ
Edemede mwepụta minikube ikpeazụ anyị dị ka nke a:
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
Nkebi nke 3: ezigbo mmepe
Ihe Nlereanya
Na nkwadebe maka mmejuputa ngwa mgbakwunye ahụ, anyị kpebiri ịkọwa ụlọ ọrụ Kubernetes niile anyị ga-arụ ọrụ n'ụdị klaasị TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Nke ọ bụla n'ime klaasị ndị a na-eketa site na klas BaseModel nkịtị, nke na-akọwa onye nrụpụta, onye na-emebi ihe, ụzọ maka imelite na ịgbanwe ọhụụ. Nke ọ bụla n'ime klaasị ahụ na-akọwa mmekọrịta akwụkwụ na ụlọ ọrụ ndị ọzọ, dịka ọmụmaatụ, ndepụta nke pọd maka otu ụdị mbugharị.
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 = [];
}
}
Site n'enyemaka nke getters na setters, anyị nwere ike igosipụta ma ọ bụ tọọ metrik ụlọ ọrụ anyị chọrọ n'ụdị dabara adaba na nke enwere ike ịgụ. Ọmụmaatụ, mmepụta nke ọnụ ụzọ cpu nwere ike ịkepụta:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
peeji nke
A kọwara ndepụta nke ibe ngwa mgbakwunye anyị niile na pluing.json anyị na ngalaba dabere:
N'ime ngọngọ maka ibe ọ bụla anyị ga-egosirịrị aha PAGE (a ga-agbanwe ya ka ọ bụrụ slug nke a ga-eji nweta ibe a); aha nke akụrụngwa na-ahụ maka ọrụ nke ibe a (ndepụta nke components na-ebupụ na module.ts); na-egosi ọrụ onye ọrụ nke ọrụ na ibe a dị yana ntọala igodo maka sidebar.
Na akụrụngwa maka ọrụ nke ibe, anyị ga-edozi templateUrl, na-agafe n'ebe ahụ ụzọ na html faịlụ na markup. N'ime onye njikwa ahụ, site na ịgba ọgwụ mgbochi, anyị nwere ike ịnweta ọrụ akụkụ abụọ dị mkpa:
- backendSrv - ọrụ na-enye mmekọrịta na ihe nkesa API Grafana;
- datasourceSrv - ọrụ na-enye mmekọrịta mpaghara na isi mmalite data arụnyere na Grafana gị (dịka ọmụmaatụ, usoro .getAll() - weghachi ndepụta nke isi mmalite data arụnyere; .nweta() ) - weghachi ihe atụ nke isi mmalite data.
Nkebi 4: isi iyi data
Site n'echiche nke Grafana, datasource bụ otu ngwa mgbakwunye dị ka ndị ọzọ niile: o nwere modulu ntinye nke ya.js, enwere faịlụ nwere ozi meta plugin.json. Mgbe ị na-emepụta ngwa mgbakwunye nwere ụdị = ngwa, anyị nwere ike ịmekọrịta na isi mmalite data dị adị (dịka ọmụmaatụ, prometheus-datasource) yana nke anyị, nke anyị nwere ike ịchekwa ozugbo na ndekọ ngwa mgbakwunye (dist/datasource/*) ma ọ bụ wụnye dị ka ndabere. N'ọnọdụ anyị, isi mmalite data na-abịa na koodu ngwa mgbakwunye. Ọ dịkwa mkpa ịnwe template config.html yana njikwa ConfigCtrl, nke a ga-eji maka ibe nhazi ihe atụ datasource yana njikwa Datasource, nke na-emejuputa mgbagha nke isi iyi data gị.
Na ngwa mgbakwunye KubeGraf, site na echiche onye ọrụ, datasource bụ ihe atụ nke ụyọkọ kubernetes na-arụ ọrụ ndị a (koodu isi dị
- na-anakọta data site na k8s api-server (na-enweta ndepụta aha oghere, ntinye...)
- Arịrịọ proxying maka prometheus-datasource (nke ahọpụtara na ntọala ngwa mgbakwunye maka ụyọkọ ọ bụla akọwapụtara) yana nhazi nzaghachi iji data ma na ibe static yana na dashboards.
- na-emelite data na ibe ngwa mgbakwunye static (yana ọnụego ume ọhụrụ atọrọ).
- ajụjụ nhazi iji mepụta mpempe akwụkwọ ndebiri na grafana-dashboards (usoro metriFindQuery())
- ule njikọ na ụyọkọ k8s ikpeazụ.
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"};
})
}
Isi ihe dị iche na-adọrọ mmasị, n'echiche anyị, bụ mmejuputa usoro nyocha na ikike maka data data. Dịka, n'ime igbe ahụ, anyị nwere ike iji datasourceHttpSettings akụrụngwa arụnyere na Grafana iji hazie ohere ịnweta isi mmalite data ikpeazụ. Iji akụrụngwa a, anyị nwere ike hazie ohere ịnweta isi iyi data http site na ịkọwapụta url na ntọala nkwenye/ikike: nbanye-paswọọdụ, ma ọ bụ ahịa-cert/client-key. Iji mejuputa ikike ịhazi ohere site na iji token bearer (ụkpụrụ de facto maka k8s), anyị ga-eme ntakịrị tweaking.
Iji dozie nsogbu a, ị nwere ike iji usoro arụnyere na Grafana “Plugin Routes” (nkọwa ndị ọzọ na
/api/v8/namespaces nwere ikike: nkụnye eji isi mee.
Dị ka o kwesịrị ịdị, iji rụọ ọrụ na sava k8s api anyị chọrọ onye ọrụ nwere ohere ịgụ naanị, gosipụtara maka imepụta nke ị nwekwara ike ịhụ na ya.
Akụkụ 5: ntọhapụ
Ozugbo ị dechara ngwa mgbakwunye Grafana nke gị, ị ga-achọkarị ime ka ọ dị n'ihu ọha. Na Grafana nke a bụ ọba akwụkwọ plugins dị ebe a
Ka ngwa mgbakwunye gị dị na ụlọ ahịa gọọmentị, ịkwesịrị ịme PR n'ime
ebe mbipute bụ ụdị ngwa mgbakwunye gị, url bụ njikọ na ebe nchekwa ahụ, ma mee bụ hash nke ntinye nke otu ụdị ngwa mgbakwunye ahụ ga-adị.
Na mmepụta ị ga-ahụ ọmarịcha foto dị ka:
A ga-ejide data maka ya ozugbo na Readme.md, Changelog.md na faịlụ plugin.json nwere nkọwa ngwa mgbakwunye.
Nkebi nke 6: kama nkwubi okwu
Anyị akwụsịghị ịmepụta ngwa mgbakwunye anyị ka ahapụchara ya. Ma ugbu a, anyị na-arụ ọrụ na nlekota nke ọma iji akụrụngwa nke ụyọkọ ọnụ, na-ewebata atụmatụ ọhụrụ iji melite UX, yana raking na nnukwu nzaghachi natara mgbe ị wụnye ngwa mgbakwunye ma ndị ahịa anyị na ndị mmadụ na GitHub (ọ bụrụ na ị pụọ. Okwu gị ma ọ bụ dọta arịrịọ, a ga m enwe obi ụtọ :)
Anyị na-atụ anya na isiokwu a ga-enyere gị aka ịghọta ụdị ngwá ọrụ dị ebube dị ka Grafana na, ikekwe, dee ngwa mgbakwunye nke gị.
Daalụ!)
isi: www.habr.com