Grafana įskiepio kūrimas: didelių pasiekimų istorija

Sveiki visi! Prieš kelis mėnesius pradėjome gaminti naują atvirojo kodo projektą – kubernetes stebėjimo įskiepį Grafana, kurį pavadinome. DevOpsProdigy KubeGraf. Papildinio šaltinio kodas pasiekiamas adresu viešoji saugykla „GitHub“.. O šiame straipsnyje norime pasidalinti su jumis istorija, kaip kūrėme papildinį, kokius įrankius naudojome ir su kokiais spąstais susidūrėme kurdami. Eime!

0 dalis – įžanginė: kaip mes pasiekėme šį tašką?

Idėja parašyti savo įskiepį Grafan mums kilo visai atsitiktinai. Mūsų įmonė jau daugiau nei 10 metų stebi įvairaus sudėtingumo interneto projektus. Per šį laiką sukaupėme daug patirties, įdomių atvejų, patirties naudojant įvairias stebėjimo sistemas. Ir kažkuriuo metu mes savęs paklausėme: „Ar yra stebuklingas įrankis Kubernetes stebėti, kad, kaip sakoma, „nustatyk ir pamiršk“? Prometėjas + Grafana derinys. Ir kaip paruošti sprendimai šiam krūvui, yra didelis įvairių įrankių rinkinys: „prometheus-operator“, „kubernetes-mixin“ prietaisų skydelių rinkinys, „grafana-kubernetes-app“.

Įskiepis grafana-kubernetes-app mums atrodė įdomiausias variantas, tačiau jis nepalaikomas daugiau nei metus ir, be to, negali veikti su naujomis node-exporter ir kube-state-metrics versijomis. Ir tam tikru momentu nusprendėme: „Ar neturėtume patys priimti sprendimo?

Kokias idėjas nusprendėme įgyvendinti savo papildinyje:

  • „aplikacijų žemėlapio“ vizualizacija: patogus programų pateikimas klasteryje, sugrupuotas pagal vardų sritis, diegimus...;
  • jungčių vizualizacija, pvz., „diegimas – paslauga (+prievadai)“.
  • klasterio programų pasiskirstymo tarp klasterio mazgų vizualizacija.
  • metrikos ir informacijos rinkimas iš kelių šaltinių: Prometheus ir k8s api serverio.
  • tiek infrastruktūros dalies (procesoriaus laiko, atminties, disko posistemio, tinklo panaudojimas), tiek taikomųjų programų logikos stebėjimas – sveikatos būklės blokai, galimų kopijų skaičius, informacija apie gyvumo/parengties testų atlikimą.

1 dalis: Kas yra „Grafana“ papildinys?

Techniniu požiūriu Grafana įskiepis yra kampinis valdiklis, kuris saugomas Grafana duomenų kataloge (/var/grafana/plugins/ /dist/module.js) ir gali būti įkeltas kaip SystemJS modulis. Taip pat šiame kataloge turėtų būti failas plugin.json, kuriame yra visa meta informacija apie jūsų papildinį: pavadinimas, versija, papildinio tipas, nuorodos į saugyklą/svetainę/licenciją, priklausomybės ir pan.

Grafana įskiepio kūrimas: didelių pasiekimų istorija
modulis.ts

Grafana įskiepio kūrimas: didelių pasiekimų istorija
plugin.json

Kaip matote ekrano kopijoje, nurodėme plugin.type = app. Kadangi „Grafana“ papildiniai gali būti trijų tipų:

plokštė: labiausiai paplitęs įskiepio tipas – tai skydelis, skirtas bet kokiai metrikai vizualizuoti, naudojamas įvairiems prietaisų skydeliams kurti.
duomenų šaltinis: papildinio jungtis prie tam tikro duomenų šaltinio (pavyzdžiui, Prometheus-duomenų šaltinis, ClickHouse-duomenų šaltinis, ElasticSearch-duomenų šaltinis).
programa: papildinys, leidžiantis sukurti savo sąsajos programą „Grafana“, kurti savo html puslapius ir rankiniu būdu pasiekti duomenų šaltinį, kad būtų galima vizualizuoti įvairius duomenis. Taip pat kaip priklausomybės gali būti naudojami kitų tipų įskiepiai (duomenų šaltinis, skydelis) ir įvairios prietaisų skydeliai.

Grafana įskiepio kūrimas: didelių pasiekimų istorija
Papildinio priklausomybių pavyzdžiai su type=app.

Kaip programavimo kalbą galite naudoti ir JavaScript, ir TypeScript (mes ją pasirinkome). Pasiruošimas bet kokio tipo hello-world papildiniams rasti pagal nuorodą: šioje saugykloje yra daug pradinių paketų (yra net eksperimentinis „React“ papildinio pavyzdys) su iš anksto įdiegtais ir sukonfigūruotais kūrėjais.

2 dalis: vietos aplinkos paruošimas

Norint dirbti su papildiniu, mums natūraliai reikia kubernetes klasterio su visais iš anksto įdiegtais įrankiais: prometheus, node-exporter, kube-state-metrics, grafana. Aplinka turi būti sukonfigūruota greitai, lengvai ir natūraliai, o norint užtikrinti karštą perkrovimą, Grafana duomenų katalogas turi būti montuojamas tiesiai iš kūrėjo įrenginio.

Patogiausias būdas, mūsų nuomone, dirbti vietoje su kubernetes yra minikube. Kitas žingsnis yra įdiegti „Prometheus + Grafana“ derinį naudojant „prometheus-operator“. IN Šis straipsnis Prometheus-operatoriaus diegimo procesas minikube yra išsamiai aprašytas. Norėdami įjungti patvarumą, turite nustatyti parametrą atkaklumas: tiesa į diagramas/grafana/values.yaml failą pridėkite savo PV ir PVC ir nurodykite juos parametre persistence.existingClaim

Mūsų galutinis minikube paleidimo scenarijus atrodo taip:

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 dalis: faktinė plėtra

Objekto modelis

Ruošdamiesi įdiegti papildinį, nusprendėme aprašyti visus pagrindinius Kubernetes objektus, su kuriais dirbsime TypeScript klasių forma: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Kiekviena iš šių klasių paveldima iš bendros BaseModel klasės, kuri aprašo konstruktorių, naikintuvą, matomumo atnaujinimo ir perjungimo metodus. Kiekviena klasė aprašo įdėtus ryšius su kitais objektais, pavyzdžiui, išdėstymo tipo objekto grupių sąrašą.

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 = [];
   }
}

Getters ir setters pagalba galime patogia ir skaitoma forma rodyti arba nustatyti mums reikalingų objektų metriką. Pavyzdžiui, suformatuota paskirstomų procesoriaus mazgų išvestis:

get cpuAllocatableFormatted(){
   let cpu = this.data.status.allocatable.cpu;
   if(cpu.indexOf('m') > -1){
       cpu = parseInt(cpu)/1000;
   }
   return cpu;
}

Puslapiai

Visų mūsų papildinių puslapių sąrašas iš pradžių aprašytas pluing.json priklausomybių skiltyje:

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Kiekvieno puslapio bloke turime nurodyti PUSLAPIO PAVADINIMĄ (paskui jis bus paverstas šliužu, kuriuo šis puslapis bus pasiekiamas); komponento, atsakingo už šio puslapio veikimą, pavadinimas (komponentų sąrašas eksportuojamas į module.ts); nurodant vartotojo vaidmenį, kuriam galima dirbti su šiuo puslapiu, ir šoninės juostos naršymo nustatymus.

Komponente, atsakingame už puslapio veikimą, turime nustatyti templateUrl, perduodant kelią į html failą su žymėjimu. Valdiklio viduje, naudodami priklausomybės įpurškimą, galime pasiekti iki 2 svarbių kampinių paslaugų:

  • backendSrv – paslauga, teikianti sąveiką su Grafana API serveriu;
  • datasourceSrv – paslauga, teikianti vietinę sąveiką su visais „Grafana“ įdiegtais duomenų šaltiniais (pvz., metodas .getAll() – pateikia visų įdiegtų duomenų šaltinių sąrašą; .get( ) – grąžina konkretaus duomenų šaltinio egzemplioriaus objektą.

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Grafana įskiepio kūrimas: didelių pasiekimų istorija

4 dalis: duomenų šaltinis

Grafanos požiūriu, duomenų šaltinis yra lygiai toks pat įskiepis kaip ir visi kiti: jis turi savo įėjimo tašką module.js, yra failas su metainformacija plugin.json. Kurdami įskiepį su type = app, galime sąveikauti tiek su esamais duomenų šaltiniais (pvz., prometheus-datasource), tiek su savo, kuriuos galime saugoti tiesiai įskiepių kataloge (dist/datasource/*) arba įdiegti kaip priklausomybę. Mūsų atveju duomenų šaltinis pateikiamas su papildinio kodu. Taip pat būtina turėti config.html šabloną ir ConfigCtrl valdiklį, kuris bus naudojamas duomenų šaltinio egzemplioriaus konfigūracijos puslapyje ir duomenų šaltinio valdiklį, kuris įgyvendina jūsų duomenų šaltinio veikimo logiką.

„KubeGraf“ papildinyje vartotojo sąsajos požiūriu duomenų šaltinis yra „kubernetes“ klasterio egzempliorius, įgyvendinantis šias galimybes (galimas šaltinio kodas по ссылке):

  • rinkti duomenis iš k8s api serverio (gaunant vardų erdvių sąrašą, diegimus...)
  • tarpinio serverio užklausų siuntimas į prometheus-datasource (kuris pasirenkamas kiekvieno konkretaus klasterio papildinio nustatymuose) ir atsakymų formatavimas, kad duomenys būtų naudojami tiek statiniuose puslapiuose, tiek informacijos suvestinėse.
  • duomenų atnaujinimas statinių papildinių puslapiuose (su nustatytu atnaujinimo dažniu).
  • užklausų apdorojimas, kad būtų sukurtas šablono lapas grafana prietaisų skydeliuose (metodas „metriFindQuery()“)

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Grafana įskiepio kūrimas: didelių pasiekimų istorija

  • ryšio testas su galutine k8s grupe.
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"};
       })
}

Atskiras įdomus dalykas, mūsų nuomone, yra duomenų šaltinio autentifikavimo ir autorizacijos mechanizmo įgyvendinimas. Paprastai, norėdami sukonfigūruoti prieigą prie galutinio duomenų šaltinio, galime naudoti integruotą Grafana komponentą datasourceHttpSettings. Naudodami šį komponentą galime sukonfigūruoti prieigą prie http duomenų šaltinio, nurodydami URL ir pagrindinius autentifikavimo / autorizacijos nustatymus: prisijungimo slaptažodis arba kliento sertifikatas / kliento raktas. Norėdami įdiegti galimybę konfigūruoti prieigą naudojant nešiklio prieigos raktą (de facto standartą k8s), turėjome šiek tiek pakoreguoti.

Norėdami išspręsti šią problemą, galite naudoti integruotą Grafana „Plugin Routes“ mechanizmą (daugiau informacijos rasite adresu oficialus dokumentacijos puslapis). Savo duomenų šaltinio nustatymuose galime deklaruoti maršruto parinkimo taisyklių rinkinį, kurį apdoros grafana tarpinis serveris. Pavyzdžiui, kiekvienam atskiram galutiniam taškui galima nustatyti antraštes arba URL adresus su šablono galimybe, kurių duomenis galima paimti iš laukų jsonData ir safeJsonData (slaptažodžiams ar prieigos raktams saugoti šifruota forma). Mūsų pavyzdyje tokios užklausos kaip /__proxy/api/v1/namespaces bus įtrauktas į formos URL
/api/v8/vardų erdvės su leidimu: nešiklio antraštė.

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Natūralu, kad norint dirbti su k8s api serveriu, mums reikia vartotojo, turinčio tik skaitymo prieigą, kūrimo manifestus, kuriuos taip pat galite rasti įskiepio šaltinio kodas.

5 dalis: išleidimas

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Kai parašysite savo „Grafana“ papildinį, jūs, žinoma, norėsite padaryti jį viešai prieinamą. „Grafana“ tai čia yra papildinių biblioteka grafana.com/grafana/plugins

Kad jūsų papildinys būtų pasiekiamas oficialioje parduotuvėje, turite pateikti PR šią saugykląpridedant tokį turinį į repo.json failą:

Grafana įskiepio kūrimas: didelių pasiekimų istorija

kur versija yra jūsų papildinio versija, url yra nuoroda į saugyklą, o commit yra įsipareigojimo, kuriam bus galima konkreti papildinio versija, maiša.

Ir išvestyje pamatysite nuostabų vaizdą, pavyzdžiui:

Grafana įskiepio kūrimas: didelių pasiekimų istorija

Jo duomenys bus automatiškai paimti iš jūsų Readme.md, Changelog.md ir plugin.json failo su papildinio aprašu.

6 dalis: vietoj išvadų

Išleidę papildinį nenustojome kurti. Dabar stengiamės tinkamai stebėti klasterio mazgų išteklių naudojimą, pristatyti naujas funkcijas, skirtas pagerinti UX, taip pat surinkti daugybę atsiliepimų, gautų įdiegus papildinį tiek mūsų klientams, tiek GitHub žmonių (jei išeisite Jūsų problema ar užklausa, aš būsiu labai patenkintas :)

Tikimės, kad šis straipsnis padės suprasti tokį nuostabų įrankį kaip „Grafana“ ir galbūt parašyti savo papildinį.

Ačiū!)

Šaltinis: www.habr.com

Pirkite patikimą prieglobą svetainėms su DDoS apsauga, VPS VDS serveriais 🔥 Įsigykite patikimą svetainių talpinimą su DDoS apsauga, VPS VDS serveriais | ProHoster