Bawo ni gbogbo eniyan! Ni oṣu diẹ sẹhin, a ṣe ifilọlẹ iṣẹ orisun ṣiṣi tuntun wa sinu iṣelọpọ - ohun itanna Grafana fun abojuto kubernetes, eyiti a pe
Apakan 0 - ifihan: bawo ni a ṣe de aaye yii?
Ero lati kọ ohun itanna tiwa fun Grafan wa si wa lairotẹlẹ. Ile-iṣẹ wa ti n ṣe abojuto awọn iṣẹ akanṣe wẹẹbu ti awọn ipele pupọ ti idiju fun diẹ sii ju ọdun 10 lọ. Lakoko yii, a ti ṣajọpọ iye nla ti oye, awọn ọran ti o nifẹ, ati iriri ni lilo ọpọlọpọ awọn eto ibojuwo. Ati ni aaye kan a beere lọwọ ara wa: "Ṣe ohun elo idan kan wa fun mimojuto Kubernetes, nitorina, bi wọn ṣe sọ, "ṣeto rẹ ki o gbagbe rẹ"? Prometheus + Grafana apapo. Ati bi awọn solusan ti a ti ṣetan fun akopọ yii, ọpọlọpọ awọn iru irinṣẹ wa: prometheus-operator, ṣeto ti kubernetes-mixin dashboards, grafana-kubernetes-app.
Ohun itanna grafana-kubernetes-app dabi ẹnipe aṣayan ti o nifẹ julọ fun wa, ṣugbọn ko ṣe atilẹyin fun diẹ sii ju ọdun kan lọ ati, pẹlupẹlu, ko le ṣiṣẹ pẹlu awọn ẹya tuntun ti node-atporter ati kube-state-metrics. Ati ni aaye kan a pinnu: “Ṣe ko yẹ ki a ṣe ipinnu tiwa?”
Awọn imọran wo ni a pinnu lati ṣe ninu ohun itanna wa:
- iworan ti “ maapu ohun elo ”: igbejade irọrun ti awọn ohun elo ninu iṣupọ, ti a ṣe akojọpọ nipasẹ awọn aaye orukọ, awọn imuṣiṣẹ…;
- iworan ti awọn asopọ bi “imuṣiṣẹ - iṣẹ (+ awọn ibudo)”.
- iworan ti pinpin awọn ohun elo iṣupọ kọja awọn apa iṣupọ.
- ikojọpọ awọn metiriki ati alaye lati awọn orisun pupọ: Prometheus ati olupin api k8s.
- Abojuto ti awọn mejeeji apakan amayederun (lilo akoko Sipiyu, iranti, eto disiki, nẹtiwọọki) ati ọgbọn ohun elo - awọn adarọ-ese ipo ilera, nọmba awọn ẹda ti o wa, alaye nipa gbigbe awọn idanwo igbesi aye / imurasilẹ.
Apá 1: Kí ni a "Grafana itanna"?
Lati oju iwoye imọ-ẹrọ, ohun itanna fun Grafana jẹ oluṣakoso angula, eyiti o wa ni ipamọ ninu itọsọna data Grafana (/var/grafana/awọn afikun/ /dist/module.js) ati ki o le wa ni ti kojọpọ bi SystemJS module. Paapaa ninu itọsọna yii yẹ ki o jẹ faili plugin.json ti o ni gbogbo alaye meta nipa ohun itanna rẹ: orukọ, ẹya, iru ohun itanna, awọn ọna asopọ si ibi ipamọ / aaye / iwe-aṣẹ, awọn igbẹkẹle, ati bẹbẹ lọ.
module.ts
itanna.json
Bi o ti le ri ninu sikirinifoto, a pato plugin.type = app. Nitori awọn afikun fun Grafana le jẹ ti awọn oriṣi mẹta:
panel: iru ohun itanna ti o wọpọ julọ - o jẹ nronu fun wiwo eyikeyi awọn metiriki, ti a lo lati kọ ọpọlọpọ awọn dasibodu.
orisun data: asopo ohun itanna si orisun data kan (fun apẹẹrẹ, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Ohun itanna kan ti o fun ọ laaye lati kọ ohun elo iwaju ti tirẹ inu Grafana, ṣẹda awọn oju-iwe html tirẹ ki o wọle si orisun data pẹlu ọwọ lati wo ọpọlọpọ data. Paapaa, awọn afikun ti awọn iru miiran (orisun data, nronu) ati ọpọlọpọ awọn dasibodu le ṣee lo bi awọn igbẹkẹle.
Apeere awọn igbẹkẹle itanna pẹlu iru=app.
O le lo mejeeji JavaScript ati TypeScript bi ede siseto (a yan rẹ). Awọn igbaradi fun awọn afikun-aye-aye ti eyikeyi iru ti o le
Apá 2: ngbaradi agbegbe agbegbe
Lati ṣiṣẹ lori ohun itanna, nipa ti ara a nilo iṣupọ kubernetes pẹlu gbogbo awọn irinṣẹ ti a ti fi sii tẹlẹ: prometheus, node-atporter, kube-state-metrics, grafana. Ayika yẹ ki o ṣeto ni iyara, ni irọrun ati nipa ti ara, ati lati rii daju gbigbo gbona, itọsọna data Grafana yẹ ki o gbe taara lati inu ẹrọ olupilẹṣẹ.
Ọna ti o rọrun julọ, ninu ero wa, lati ṣiṣẹ ni agbegbe pẹlu kubernetes jẹ
Iwe afọwọkọ ifilọlẹ minikube ikẹhin wa dabi eyi:
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
Apá 3: gangan idagbasoke
Awoṣe Nkan
Ni igbaradi fun imuse ohun itanna, a pinnu lati ṣapejuwe gbogbo awọn ile-iṣẹ Kubernetes ipilẹ ti a yoo ṣiṣẹ pẹlu irisi awọn kilasi TypeScript: pod, imuṣiṣẹ, daemonset, statefulset, iṣẹ, cronjob, iṣẹ, ipade, aaye orukọ. Ọkọọkan awọn kilasi wọnyi jogun lati kilasi BaseModel ti o wọpọ, eyiti o ṣapejuwe olupilẹṣẹ, apanirun, awọn ọna fun imudojuiwọn ati yiyi hihan. Ọkọọkan awọn kilasi n ṣapejuwe awọn ibatan itẹ-ẹiyẹ pẹlu awọn nkan miiran, fun apẹẹrẹ, atokọ ti awọn adarọ-ese fun nkan ti imuṣiṣẹ iru.
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 = [];
}
}
Pẹlu iranlọwọ ti awọn getters ati awọn oluṣeto, a le ṣafihan tabi ṣeto awọn metiriki nkan ti a nilo ni irọrun ati fọọmu kika. Fún àpẹrẹ, àgbékalẹ̀ àbájáde ti àwọn ìdìpọ̀ cpu tí a lè pín sí:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
ojúewé
Atokọ ti gbogbo awọn oju-iwe itanna wa ni akọkọ ṣapejuwe ninu pluing.json wa ni apakan awọn igbẹkẹle:
Ninu bulọki fun oju-iwe kọọkan a gbọdọ tọkasi ORUKO IWE (a yoo yipada si slug nipasẹ eyiti oju-iwe yii yoo wa); orukọ paati lodidi fun isẹ ti oju-iwe yii (akojọ awọn paati ti wa ni okeere si module.ts); nfihan ipa olumulo fun eyiti iṣẹ pẹlu oju-iwe yii wa ati awọn eto lilọ kiri fun ẹgbẹ ẹgbẹ.
Ninu paati ti o ni iduro fun iṣiṣẹ ti oju-iwe naa, a gbọdọ ṣeto templateUrl, gbigbe sibẹ ọna si faili html pẹlu isamisi. Ninu oludari, nipasẹ abẹrẹ igbẹkẹle, a le wọle si awọn iṣẹ igun pataki meji:
- backendSrv - iṣẹ kan ti o pese ibaraenisepo pẹlu olupin API Grafana;
- datasourceSrv - iṣẹ kan ti o pese ibaraenisepo agbegbe pẹlu gbogbo awọn orisun data ti a fi sori ẹrọ ni Grafana rẹ (fun apẹẹrẹ, ọna .getAll() - da akojọ gbogbo awọn orisun data ti a fi sori ẹrọ pada; .gba() ) - pada ohun apẹẹrẹ ti orisun data kan pato.
Apá 4: data orisun
Lati oju wiwo Grafana, orisun data jẹ ohun itanna kanna gangan bi gbogbo awọn miiran: o ni aaye titẹsi tirẹ module.js, faili kan wa pẹlu alaye meta plugin.json. Nigbati o ba n ṣe agbekalẹ ohun itanna kan pẹlu iru = app, a le ṣe ajọṣepọ pẹlu awọn orisun data ti o wa tẹlẹ (fun apẹẹrẹ, prometheus-datasource) ati tiwa, eyiti a le fipamọ taara sinu itọsọna itanna (dist/datasource/*) tabi fi sii bi igbẹkẹle. Ninu ọran wa, orisun data wa pẹlu koodu itanna naa. O tun jẹ dandan lati ni awoṣe config.html kan ati oluṣakoso ConfigCtrl kan, eyiti yoo ṣee lo fun oju-iwe iṣeto orisun orisun data ati oluṣakoso orisun Data, eyiti o ṣe adaṣe ọgbọn ti orisun data rẹ.
Ninu ohun itanna KubeGraf, lati oju wiwo wiwo olumulo, orisun data jẹ apẹẹrẹ ti iṣupọ kubernetes ti o ṣe awọn agbara wọnyi (koodu orisun wa
- gbigba data lati k8s api-server (ngba atokọ ti awọn aaye orukọ, awọn imuṣiṣẹ…)
- awọn ibeere proxying si orisun data prometheus (eyiti o yan ninu awọn eto itanna fun iṣupọ kan pato kọọkan) ati awọn idahun ọna kika lati lo data mejeeji ni awọn oju-iwe aimi ati ni awọn dasibodu.
- n ṣe imudojuiwọn data lori awọn oju-iwe itanna aimi (pẹlu iwọn isọdọtun ti a ṣeto).
- awọn ibeere ṣiṣe lati ṣe agbekalẹ iwe awoṣe kan ni grafana-dashboards (ọna metriFindQuery())
- igbeyewo asopọ pẹlu ik k8s iṣupọ.
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"};
})
}
Ojuami iyanilenu lọtọ, ninu ero wa, jẹ imuse ti ijẹrisi ati ẹrọ aṣẹ fun orisun data. Ni deede, lati inu apoti, a le lo datasourceHttpEto paati Grafana ti a ṣe sinu lati tunto iraye si orisun data ikẹhin. Lilo paati yii, a le tunto iraye si orisun data http nipa sisọ url ati ipilẹ ijẹrisi/awọn eto igbanilaaye: ọrọ igbaniwọle-iwọle, tabi alabara-cert/bọtini alabara. Lati le ṣe imuse agbara lati tunto iwọle si nipa lilo ami-ami ti nrù (boṣewa de facto fun k8s), a ni lati ṣe tweaking kekere kan.
Lati yanju iṣoro yii, o le lo ẹrọ ti a ṣe sinu Grafana “Awọn ipa ọna itanna” (awọn alaye diẹ sii ni
/api/v8/namespaces pẹlu Aṣẹ: Akọsori Akọsori.
Nipa ti, lati ṣiṣẹ pẹlu olupin api k8s a nilo olumulo kan pẹlu iwọle kika nikan, ṣafihan fun ṣiṣẹda eyiti o tun le rii ninu
Apá 5: Tu
Ni kete ti o ti kọ ohun itanna Grafana tirẹ, iwọ yoo fẹ nipa ti ara lati jẹ ki o wa ni gbangba. Ni Grafana eyi jẹ ile-ikawe ti awọn afikun ti o wa nibi
Ni ibere fun ohun itanna rẹ lati wa lori ile itaja osise, o nilo lati ṣe PR kan ninu
nibiti ikede jẹ ẹya ti ohun itanna rẹ, url jẹ ọna asopọ si ibi ipamọ, ati ṣe ni hash ti ifaramọ eyiti ẹya kan pato ti ohun itanna yoo wa.
Ati ni iṣelọpọ iwọ yoo rii aworan iyanu bi:
Awọn data fun o yoo wa ni laifọwọyi dimu lati rẹ Readme.md, Changelog.md ati plugin.json faili pẹlu awọn ohun itanna apejuwe.
Apá 6: dipo awọn ipari
A ko dẹkun idagbasoke ohun itanna wa lẹhin itusilẹ. Ati ni bayi a n ṣiṣẹ ni abojuto ni deede lilo awọn orisun ti awọn apa iṣupọ, ṣafihan awọn ẹya tuntun lati mu ilọsiwaju UX, ati tun raking ni iye nla ti awọn esi ti o gba lẹhin fifi sori ẹrọ itanna mejeeji nipasẹ awọn alabara wa ati lati ọdọ eniyan lori GitHub (ti o ba lọ kuro Ọrọ rẹ tabi ibeere fa, Emi yoo dun pupọ :)
A nireti pe nkan yii yoo ran ọ lọwọ lati loye iru irinṣẹ iyanu bi Grafana ati, boya, kọ ohun itanna tirẹ.
E dupe!)
orisun: www.habr.com