Nyob zoo sawv daws! Ob peb lub hlis dhau los, peb tau tshaj tawm peb txoj haujlwm qhib tshiab rau hauv kev tsim khoom - Grafana plugin rau kev saib xyuas kubernetes, uas peb hu ua
Part 0 - introductory: Peb tau mus txog qhov twg?
Lub tswv yim los sau peb tus kheej plugin rau Grafan tuaj rau peb heev los ntawm kev sib tsoo. Peb lub tuam txhab tau saib xyuas lub vev xaib ntawm ntau theem ntawm kev nyuaj rau ntau tshaj 10 xyoo. Lub sijhawm no, peb tau sau ntau qhov kev txawj ntse, nthuav dav, thiab kev paub txog kev siv ntau yam kev saib xyuas. Thiab ntawm qee lub sijhawm peb nug peb tus kheej: "Puas muaj cov cuab yeej ua khawv koob rau kev saib xyuas Kubernetes, yog li ntawd, raws li lawv hais, "tsim nws thiab tsis nco qab nws"?". Prometheus + Grafana ua ke. Thiab raws li cov kev daws teeb meem npaj txhij rau pawg no, muaj ntau txheej ntau yam ntawm cov cuab yeej: prometheus-tus neeg teb xov tooj, txheej kubernetes-mixin dashboards, grafana-kubernetes-app.
Lub grafana-kubernetes-app plugin zoo li yog qhov kev xaiv nthuav tshaj plaws rau peb, tab sis nws tsis tau txais kev txhawb nqa rau ntau tshaj ib xyoos thiab, ntxiv rau, tsis tuaj yeem ua haujlwm nrog cov tshiab versions ntawm node-exporter thiab kube-state-metrics. Thiab qee lub sijhawm peb txiav txim siab: "Peb puas yuav tsum txiav txim siab peb tus kheej?"
Cov tswv yim dab tsi peb txiav txim siab los siv hauv peb lub plugin:
- visualization ntawm "daim ntawv qhia daim ntawv thov": yooj yim nthuav qhia ntawm daim ntawv thov nyob rau hauv pawg, pab pawg los ntawm namespaces, deployments ...;
- kev pom kev sib txuas zoo li "kev xa tawm - kev pabcuam (+ chaw nres nkoj)".
- visualization ntawm kev faib ntawm cov ntawv thov hauv pawg hauv pawg pawg.
- sau cov kev ntsuas thiab cov ntaub ntawv los ntawm ntau qhov chaw: Prometheus thiab k8s api server.
- kev saib xyuas ntawm ob qho tib si infrastructure (siv lub sij hawm CPU, nco, disk subsystem, network) thiab daim ntawv thov logic - kev noj qab haus huv-status pods, tus naj npawb ntawm replicas muaj, cov ntaub ntawv hais txog kev xeem dhau lub neej / kev npaj txhij.
Part 1: Dab tsi yog "Grafana plugin"?
Los ntawm cov kev taw qhia ntawm kev pom, lub plugin rau Grafana yog tus tswj angular, uas yog khaws cia hauv Grafana cov ntaub ntawv teev npe (/var/grafana/plugins/ /dist/module.js) thiab tuaj yeem thauj khoom raws li SystemJS module. Tsis tas li ntawd hauv phau ntawv teev npe no yuav tsum muaj cov ntaub ntawv plugin.json uas muaj tag nrho cov ntaub ntawv meta txog koj lub plugin: lub npe, version, hom plugin, txuas mus rau qhov chaw cia khoom / chaw / ntawv tso cai, kev vam khom, thiab lwm yam.
module.ts
plugin.json
Raws li koj tuaj yeem pom hauv lub screenshot, peb teev plugin.type = app. Vim tias plugins rau Grafana tuaj yeem yog peb hom:
vaj huam sib luag: hom plugin ntau tshaj plaws - nws yog lub vaj huam sib luag rau kev pom cov kev ntsuas, siv los tsim ntau yam dashboards.
datasource: plugin connector rau qee cov ntaub ntawv qhov chaw (piv txwv li, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Lub plugin uas tso cai rau koj los tsim koj tus kheej daim ntawv thov frontend hauv Grafana, tsim koj tus kheej html nplooj ntawv thiab manually nkag mus rau datasource kom pom ntau yam ntaub ntawv. Tsis tas li ntawd, plugins ntawm lwm hom (datasource, vaj huam sib luag) thiab ntau yam dashboards tuaj yeem siv los ua kev vam khom.
Piv txwv plugin dependencies nrog hom = app.
Koj tuaj yeem siv JavaScript thiab TypeScript ua hom lus programming (peb xaiv nws). Kev npaj rau hello-world plugins ntawm txhua yam koj ua tau
Ntu 2: npaj ib puag ncig hauv zos
Txhawm rau ua haujlwm ntawm lub plugin, peb ib txwm xav tau kubernetes pawg nrog tag nrho cov cuab yeej preinstalled: prometheus, node-exporter, kube-state-metrics, grafana. Ib puag ncig yuav tsum tau teeb tsa sai, yooj yim thiab ib txwm, thiab txhawm rau kom kub-reload, Grafana cov ntaub ntawv teev npe yuav tsum tau txuas ncaj qha los ntawm tus tsim tawm lub tshuab.
Txoj kev yooj yim tshaj plaws, hauv peb lub tswv yim, ua haujlwm hauv zos nrog kubernetes yog
Peb qhov kawg minikube tso tsab ntawv zoo li no:
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
Ntu 3: kev txhim kho tiag tiag
Yam khoom Model
Hauv kev npaj rau kev siv lub plugin, peb tau txiav txim siab los piav qhia tag nrho cov ntsiab lus Kubernetes cov chaw uas peb yuav ua haujlwm nrog rau hauv cov chav kawm TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Txhua chav kawm no tau txais txiaj ntsig los ntawm cov chav kawm BaseModel, uas piav qhia txog tus tsim, tus tsim, kev tsim kho, kev hloov kho thiab hloov qhov pom kev. Txhua chav kawm piav qhia txog kev sib raug zoo nrog lwm cov koom haum, piv txwv li, ib daim ntawv teev cov pods rau ib qho chaw ntawm hom kev xa tawm.
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 = [];
}
}
Nrog kev pab los ntawm getters thiab setters, peb tuaj yeem tso saib lossis teeb tsa qhov chaw ntsuas peb xav tau hauv daim ntawv yooj yim thiab nyeem tau. Piv txwv li, formatted tso zis ntawm allocatable cpu nodes:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
nplooj ntawv
Ib daim ntawv teev npe ntawm tag nrho peb cov nplooj ntawv plugin yog pib piav qhia hauv peb lub pluing.json nyob rau hauv seem dependencies:
Nyob rau hauv lub thaiv rau txhua nplooj ntawv peb yuav tsum qhia lub PAGE NAME (nws mam li hloov mus rau ib tug slug uas nplooj ntawv no yuav siv tau); lub npe ntawm lub luag haujlwm rau kev ua haujlwm ntawm nplooj ntawv no (cov npe ntawm cov khoom raug xa tawm mus rau module.ts); qhia txog tus neeg siv lub luag haujlwm uas ua haujlwm nrog nplooj ntawv no muaj thiab navigation nqis rau lub sidebar.
Hauv kev tivthaiv lub luag haujlwm rau kev ua haujlwm ntawm nplooj ntawv, peb yuav tsum teeb tsa templateUrl, dhau qhov ntawd mus rau cov ntaub ntawv html nrog markup. Nyob rau hauv tus maub los, los ntawm kev vam khom kev txhaj tshuaj, peb tuaj yeem nkag mus txog 2 qhov kev pabcuam angular tseem ceeb:
- backendSrv - ib qho kev pabcuam uas muab kev cuam tshuam nrog Grafana API server;
- datasourceSrv - ib qho kev pabcuam uas muab kev sib cuam tshuam hauv zos nrog txhua cov ntaub ntawv tau teeb tsa hauv koj lub Grafana (piv txwv li, txoj kev .getAll() - rov qab cov npe ntawm tag nrho cov ntaub ntawv tau teeb tsa; .get( ) - xa cov khoom piv txwv ntawm cov ntaub ntawv tshwj xeeb.
Part 4: Cov ntaub ntawv qhov chaw
Los ntawm Grafana txoj kev xav, datasource yog tib yam plugin raws li tag nrho lwm tus: nws muaj nws tus kheej nkag point module.js, muaj cov ntaub ntawv nrog meta cov ntaub ntawv plugin.json. Thaum tsim lub plugin nrog hom = app, peb tuaj yeem cuam tshuam nrog ob qho tib si cov ntaub ntawv uas twb muaj lawm (piv txwv li, prometheus-datasource) thiab peb tus kheej, uas peb tuaj yeem khaws ncaj qha rau hauv plugin directory (dist/datasource/*) lossis nruab raws li kev vam khom. Nyob rau hauv peb cov ntaub ntawv, cov ntaub ntawv los nrog lub plugin code. Nws tseem yuav tsum muaj config.html template thiab ConfigCtrl maub los, uas yuav siv rau datasource piv txwv configuration nplooj ntawv thiab Datasource maub los, uas siv lub logic ntawm koj datasource.
Nyob rau hauv KubeGraf plugin, los ntawm cov neeg siv interface ntawm qhov pom, cov ntaub ntawv yog ib qho piv txwv ntawm kubernetes pawg uas siv cov peev txheej hauv qab no (qhov chaws muaj.
- sau cov ntaub ntawv los ntawm k8s api-server (tau txais ib daim ntawv teev npe, kev xa tawm ...)
- proxying thov rau prometheus-datasource (uas yog xaiv nyob rau hauv lub plugin teeb tsa rau txhua pawg tshwj xeeb) thiab formatting cov lus teb siv cov ntaub ntawv ob qho tib si hauv nplooj ntawv zoo li qub thiab hauv dashboards.
- hloov kho cov ntaub ntawv ntawm nplooj ntawv plugin zoo li qub (nrog rau tus nqi refresh).
- ua cov lus nug los tsim ib daim ntawv template hauv grafana-dashboards (metriFindQuery() txoj kev)
- kev sib txuas kuaj nrog qhov kawg k8s pawg.
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"};
})
}
Ib qho kev nthuav qhia tshwj xeeb, hauv peb lub tswv yim, yog kev ua raws li kev lees paub thiab kev tso cai mechanism rau datasource. Feem ntau, tawm ntawm lub thawv, peb tuaj yeem siv qhov tsim-hauv Grafana tivthaiv datasourceHttpSettings los teeb tsa kev nkag mus rau cov ntaub ntawv zaum kawg. Siv cov khoom siv no, peb tuaj yeem teeb tsa kev nkag mus rau http cov ntaub ntawv los ntawm kev qhia qhov url thiab qhov yooj yim authentication/authorization settings: tus ID nkag mus-password, los yog tus neeg siv-cert/client-key. Txhawm rau siv lub peev xwm los teeb tsa kev nkag mus siv tus lej cim (tus qauv de facto rau k8s), peb yuav tsum tau ua me ntsis tweaking.
Yuav kom daws tau qhov teeb meem no, koj tuaj yeem siv lub built-in Grafana "Plugin Routes" mechanism (ntxiv cov ntsiab lus ntawm
/api/v8/namespaces nrog Kev Tso Cai: Bearer header.
Lawm, ua haujlwm nrog k8s api server peb xav tau tus neeg siv nrog nyeem nkaus xwb, qhia rau kev tsim uas koj tuaj yeem pom hauv
Ntu 5: tso tawm
Thaum koj tau sau koj tus kheej Grafana plugin, koj yuav xav ua kom nws muaj rau pej xeem. Hauv Grafana qhov no yog lub tsev qiv ntawv ntawm plugins muaj nyob ntawm no
Txhawm rau kom koj lub plugin muaj nyob rau ntawm lub khw muag khoom, koj yuav tsum ua PR hauv
qhov twg version yog qhov version ntawm koj lub plugin, url yog qhov txuas mus rau qhov chaw cia khoom, thiab cog lus yog qhov hash ntawm kev cog lus rau qhov tshwj xeeb version ntawm lub plugin yuav muaj.
Thiab ntawm cov zis koj yuav pom ib daim duab zoo li:
Cov ntaub ntawv rau nws yuav tau txais los ntawm koj lub Readme.md, Changelog.md thiab cov ntaub ntawv plugin.json nrog cov lus piav qhia plugin.
Ntu 6: tsis yog cov lus xaus
Peb tsis tau tso tseg kev tsim peb plugin tom qab tso tawm. Thiab tam sim no peb tab tom ua haujlwm kom raug saib xyuas kev siv cov peev txheej ntawm pawg nodes, qhia cov yam ntxwv tshiab los txhim kho UX, thiab tseem raking ntau cov lus pom zoo tau txais tom qab txhim kho lub plugin ob qho tib si los ntawm peb cov neeg siv khoom thiab los ntawm cov neeg ntawm GitHub (yog tias koj tawm mus. koj qhov teeb meem lossis rub thov, Kuv yuav zoo siab heev :)
Peb cia siab tias tsab xov xwm no yuav pab koj nkag siab txog cov cuab yeej zoo li Grafana thiab, tej zaum, sau koj tus kheej plugin.
Ua tsaug!)
Tau qhov twg los: www.hab.com