Sveiki visiem! Pirms dažiem mÄneÅ”iem mÄs uzsÄkÄm mÅ«su jauno atvÄrtÄ koda projektu ražoÅ”anÄ - Grafana spraudni kubernetes uzraudzÄ«bai, ko nosaucÄm
0. daļa ā ievads: kÄ mÄs nonÄcÄm lÄ«dz Å”im punktam?
Ideja uzrakstÄ«t savu Grafan spraudni mums radÄs pavisam nejauÅ”i. MÅ«su uzÅÄmums jau vairÄk nekÄ 10 gadus uzrauga dažÄdas sarežģītÄ«bas pakÄpes tÄ«mekļa projektus. Å ajÄ laikÄ esam uzkrÄjuÅ”i lielu pieredzi, interesantus gadÄ«jumus un pieredzi dažÄdu uzraudzÄ«bas sistÄmu izmantoÅ”anÄ. Un kÄdÄ brÄ«dÄ« mÄs sev jautÄjÄm: "Vai ir kÄds maÄ£isks rÄ«ks Kubernetes uzraudzÄ«bai, lai, kÄ saka, "noteiktu un aizmirstu"?".. Nozares standarts k8s uzraudzÄ«bai, protams, jau sen ir bijis Prometejs + Grafana kombinÄcija. Un kÄ gatavi risinÄjumi Å”ai kaudzei ir liels dažÄdu veidu rÄ«ku komplekts: prometheus-operator, kubernetes-mixin informÄcijas paneļu komplekts, grafana-kubernetes-app.
Spraudnis grafana-kubernetes-app mums Ŕķita visinteresantÄkais variants, taÄu tas netiek atbalstÄ«ts vairÄk nekÄ gadu un turklÄt nevar darboties ar jaunajÄm node-exporter un kube-state-metrics versijÄm. Un kÄdÄ brÄ«dÄ« mÄs nolÄmÄm: "Vai mums nevajadzÄtu pieÅemt savu lÄmumu?"
KÄdas idejas mÄs nolÄmÄm ieviest savÄ spraudnÄ«:
- āAplikÄciju kartesā vizualizÄcija: Ärta lietojumprogrammu prezentÄcija klasterÄ«, sagrupÄtas pÄc nosaukumvietÄm, izvietoÅ”anas...;
- savienojumu vizualizÄcija, piemÄram, "izvietoÅ”ana - pakalpojums (+porti)".
- klasteru lietojumprogrammu sadalÄ«juma vizualizÄcija klasteru mezglos.
- metrikas un informÄcijas kolekcija no vairÄkiem avotiem: Prometheus un k8s api serveri.
- gan infrastruktÅ«ras daļas (CPU laika, atmiÅas, diska apakÅ”sistÄmas, tÄ«kla izmantoÅ”ana), gan lietojumprogrammu loÄ£ikas uzraudzÄ«ba - veselÄ«bas stÄvokļa podi, pieejamo repliku skaits, informÄcija par dzÄ«vÄ«guma/gatavÄ«bas testu nokÄrtoÅ”anu.
1. daļa. Kas ir āGrafana spraudnisā?
No tehniskÄ viedokļa Grafana spraudnis ir leÅÄ·iskais kontrolleris, kas tiek glabÄts Grafana datu direktorijÄ (/var/grafana/plugins/ /dist/module.js) un to var ielÄdÄt kÄ SystemJS moduli. ArÄ« Å”ajÄ direktorijÄ ir jÄbÅ«t failam plugin.json, kurÄ ir visa metainformÄcija par jÅ«su spraudni: nosaukums, versija, spraudÅa veids, saites uz repozitoriju/vietni/licenci, atkarÄ«bas utt.
modulis.ts
plugin.json
KÄ redzat ekrÄnuzÅÄmumÄ, mÄs norÄdÄ«jÄm plugin.type = app. TÄ kÄ Grafana spraudÅi var bÅ«t trÄ«s veidu:
panelis: visizplatÄ«tÄkais spraudÅa veids - tas ir panelis jebkuras metrikas vizualizÄcijai, ko izmanto dažÄdu informÄcijas paneļu izveidoÅ”anai.
datu avots: spraudÅa savienotÄjs kÄdam datu avotam (piemÄram, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: spraudnis, kas ļauj Grafana izveidot savu priekÅ”gala lietojumprogrammu, izveidot savas html lapas un manuÄli piekļūt datu avotam, lai vizualizÄtu dažÄdus datus. KÄ atkarÄ«bas var izmantot arÄ« cita veida spraudÅus (datu avots, panelis) un dažÄdus informÄcijas paneļus.
SpraudÅa atkarÄ«bu piemÄri ar type=app.
KÄ programmÄÅ”anas valodu varat izmantot gan JavaScript, gan TypeScript (mÄs to izvÄlÄjÄmies). SagatavoÅ”anÄs jebkura veida hello-world spraudÅiem
2. daļa: vietÄjÄs vides sagatavoÅ”ana
Lai strÄdÄtu ar spraudni, mums, protams, ir nepiecieÅ”ams kubernetes klasteris ar visiem iepriekÅ” instalÄtajiem rÄ«kiem: prometheus, node-exporter, kube-state-metrics, grafana. Vide ir jÄiestata Ätri, vienkÄrÅ”i un dabiski, un, lai nodroÅ”inÄtu atkÄrtotu ielÄdi, Grafana datu direktorijs ir jÄmontÄ tieÅ”i no izstrÄdÄtÄja iekÄrtas.
ÄrtÄkais veids, mÅ«suprÄt, lokÄli strÄdÄt ar kubernetes ir
MÅ«su pÄdÄjais minikube palaiÅ”anas skripts izskatÄs Å”Ädi:
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. daļa: faktiskÄ attÄ«stÄ«ba
Objekta modelis
Gatavojoties spraudÅa ievieÅ”anai, mÄs nolÄmÄm aprakstÄ«t visas galvenÄs Kubernetes entÄ«tijas, ar kurÄm strÄdÄsim TypeScript klaÅ”u veidÄ: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Katra no Ŕīm klasÄm ir mantota no kopÄjÄs BaseModel klases, kas apraksta konstruktoru, destruktoru, redzamÄ«bas atjauninÄÅ”anas un pÄrslÄgÅ”anas metodes. Katra no klasÄm apraksta ligzdotas attiecÄ«bas ar citÄm entÄ«tijÄm, piemÄram, izvietoÅ”anas veida entÄ«tijas bloku sarakstu.
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 = [];
}
}
Ar ieguvÄju un iestatÄ«tÄju palÄ«dzÄ«bu mÄs varam parÄdÄ«t vai iestatÄ«t mums nepiecieÅ”amo entÄ«tiju metriku ÄrtÄ un lasÄmÄ formÄ. PiemÄram, pieŔķiramo CPU mezglu formatÄta izvade:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
lapas
Visu mÅ«su spraudÅu lapu saraksts sÄkotnÄji ir aprakstÄ«ts failÄ pluing.json atkarÄ«bu sadaļÄ:
Katras lapas blokÄ jÄnorÄda LAPAS NOSAUKUMS (pÄc tam tas tiks pÄrveidots par sliÅÄ·i, ar kuru Ŕī lapa bÅ«s pieejama); par Ŕīs lapas darbÄ«bu atbildÄ«gÄs komponentes nosaukums (komponentu saraksts tiek eksportÄts uz module.ts); norÄdot lietotÄja lomu, kurai ir pieejams darbs ar Å”o lapu, un sÄnjoslas navigÄcijas iestatÄ«jumus.
KomponentÄ, kas atbild par lapas darbÄ«bu, mums jÄiestata templateUrl, nododot tur ceļu uz html failu ar marÄ·Äjumu. KontrollerÄ«, izmantojot atkarÄ«bas injekciju, mÄs varam piekļūt lÄ«dz 2 svarÄ«giem leÅÄ·a pakalpojumiem:
- backendSrv - pakalpojums, kas nodroŔina mijiedarbību ar Grafana API serveri;
- datasourceSrv ā pakalpojums, kas nodroÅ”ina lokÄlu mijiedarbÄ«bu ar visiem jÅ«su Grafana instalÄtajiem datu avotiem (piemÄram, metode .getAll() ā atgriež visu instalÄto datu avotu sarakstu; .get( ) - atgriež konkrÄta datu avota instances objektu.
4. daļa: datu avots
No Grafana viedokļa datu avots ir tieÅ”i tÄds pats spraudnis kÄ visi pÄrÄjie: tam ir savs ieejas punkts module.js, ir fails ar metainformÄciju plugin.json. IzstrÄdÄjot spraudni ar type = app, mÄs varam mijiedarboties gan ar esoÅ”ajiem datu avotiem (piemÄram, prometheus-datasource), gan ar saviem, kurus varam glabÄt tieÅ”i spraudÅa direktorijÄ (dist/datasource/*) vai instalÄt kÄ atkarÄ«bu. MÅ«su gadÄ«jumÄ datu avotam ir pievienots spraudÅa kods. Ir nepiecieÅ”ama arÄ« veidne config.html un kontrolieris ConfigCtrl, kas tiks izmantots datu avota instances konfigurÄcijas lapai, un datu avota kontrolleris, kas Ä«steno jÅ«su datu avota loÄ£iku.
KubeGraf spraudnÄ« no lietotÄja interfeisa viedokļa datu avots ir kubernetes klastera gadÄ«jums, kas ievieÅ” Å”Ädas iespÄjas (ir pieejams avota kods
- datu apkopoŔana no k8s api-servera (nosaukumvietu saraksta iegūŔana, izvietoŔana...)
- starpniekservera pieprasÄ«jumi uz prometheus-datasource (kas tiek atlasÄ«ti katra konkrÄtÄ klastera spraudÅa iestatÄ«jumos) un atbilžu formatÄÅ”ana, lai izmantotu datus gan statiskÄs lapÄs, gan informÄcijas paneļos.
- datu atjauninÄÅ”ana statisko spraudÅu lapÄs (ar iestatÄ«tu atsvaidzes intensitÄti).
- vaicÄjumu apstrÄde, lai Ä£enerÄtu veidnes lapu grafana informÄcijas paneļos (metode metriFindQuery())
- savienojuma pÄrbaude ar galÄ«go k8s klasteru.
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"};
})
}
AtseviŔķs interesants punkts, mÅ«suprÄt, ir datu avota autentifikÄcijas un autorizÄcijas mehÄnisma ievieÅ”ana. Parasti mÄs varam izmantot iebÅ«vÄto Grafana komponentu datasourceHttpSettings, lai konfigurÄtu piekļuvi gala datu avotam. Izmantojot Å”o komponentu, mÄs varam konfigurÄt piekļuvi http datu avotam, norÄdot URL un pamata autentifikÄcijas/autorizÄcijas iestatÄ«jumus: login-password vai client-cert/client-key. Lai ieviestu iespÄju konfigurÄt piekļuvi, izmantojot nesÄja marÄ·ieri (de facto standarts k8s), mums bija jÄveic neliela pielÄgoÅ”ana.
Lai atrisinÄtu Å”o problÄmu, varat izmantot iebÅ«vÄto Grafana āPlugin Routesā mehÄnismu (sÄ«kÄka informÄcija
/api/v8/namespaces ar autorizÄcijas: nesÄja galveni.
Protams, lai strÄdÄtu ar k8s api serveri, mums ir nepiecieÅ”ams lietotÄjs ar tikai lasÄ«Å”anas piekļuvi, kuru izveidei varat atrast arÄ«
5. daļa: atbrīvoŔana
Kad esat uzrakstÄ«jis savu Grafana spraudni, jÅ«s, protams, vÄlÄsities to padarÄ«t publiski pieejamu. ProgrammÄ Grafana Ŕī ir Å”eit pieejamo spraudÅu bibliotÄka
Lai jÅ«su spraudnis bÅ«tu pieejams oficiÄlajÄ veikalÄ, jums ir jÄveic PR
kur versija ir jÅ«su spraudÅa versija, url ir saite uz krÄtuvi, un commit ir apstiprinÄjuma jaucÄjvÄrds, kuram bÅ«s pieejama konkrÄta spraudÅa versija.
Un izejÄ jÅ«s redzÄsit brÄ«niŔķīgu attÄlu, piemÄram:
Tam nepiecieÅ”amie dati tiks automÄtiski iegÅ«ti no jÅ«su Readme.md, Changelog.md un faila plugin.json ar spraudÅa aprakstu.
6. daļa: secinÄjumu vietÄ
MÄs nepÄrstÄjÄm izstrÄdÄt mÅ«su spraudni pÄc izlaiÅ”anas. Un tagad mÄs strÄdÄjam pie tÄ, lai pareizi uzraudzÄ«tu klasteru mezglu resursu izmantoÅ”anu, ieviestu jaunas funkcijas UX uzlaboÅ”anai, kÄ arÄ« apkopotu lielu daudzumu atsauksmju, kas saÅemtas pÄc spraudÅa instalÄÅ”anas gan no mÅ«su klientiem, gan no GitHub lietotÄjiem (ja pametÄ«siet JÅ«su problÄma vai izvilkÅ”anas pieprasÄ«jums, es bÅ«Å”u ļoti priecÄ«gs :)
MÄs ceram, ka Å”is raksts palÄ«dzÄs jums izprast tik brÄ«niŔķīgu rÄ«ku kÄ Grafana un, iespÄjams, uzrakstÄ«t savu spraudni.
Paldies!)
Avots: www.habr.com