Razvoj dodatka za Grafanu: povijest velikih hitova

Pozdrav svima! Prije nekoliko mjeseci pokrenuli smo u produkciju naš novi projekt otvorenog koda, Grafana dodatak za praćenje Kubernetes-a. DevOpsProdigy KubeGrafIzvorni kod dodatka dostupan je u javni repozitorij na GitHubuU ovom članku želimo s vama podijeliti priču o tome kako smo stvorili dodatak, alate koje smo koristili i zamke na koje smo naišli tijekom razvoja. Krenimo!

Dio 0 - Uvod: Kako smo stigli ovdje?

Ideja za pisanje vlastitog dodatka za Grafanu došla nam je sasvim slučajno. Naša tvrtka već više od 10 godina prati web projekte različite složenosti. Tijekom tog vremena stekli smo bogato stručno znanje, zanimljive studije slučaja i iskustvo korištenja različitih sustava za praćenje. U nekom trenutku smo se pitali: "Postoji li čarobni alat za praćenje Kubernetesa koji možete, kako kažu, 'postaviti i zaboraviti'"? Naravno, kombinacija Prometheus + Grafana dugo je bila industrijski standard za praćenje K8S-a. Postoji širok raspon gotovih alata za ovaj paket, uključujući prometheus-operator, kubernetes-mixin dashboard suite i grafana-kubernetes-app.

Dodatak grafana-kubernetes-app činio nam se najzanimljivijom opcijom, ali nije podržan već više od godinu dana i, štoviše, ne radi s novim verzijama node-exportera i kube-state-metrics. U nekom trenutku smo odlučili: "Zašto ne bismo stvorili vlastito rješenje?"

Koje smo ideje odlučili implementirati u naš dodatak?

  • Vizualizacija mape aplikacija: prikladan prikaz aplikacija u klasteru, grupiranih po imenskim prostorima, implementacijama itd.;
  • vizualizacija veza tipa "raspoređivanje - usluga (+portovi)".
  • vizualizacija distribucije klaster aplikacija po klasterskim čvorovima.
  • prikupljanje metrika i informacija iz više izvora: Prometheus i k8s API poslužitelj.
  • Praćenje infrastrukture (korištenje CPU vremena, memorije, diskovnog podsustava, mreže) i logike aplikacije - zdravstveno stanje podova, broj dostupnih replika i informacije o napretku testova živosti/spremnosti.

Dio 1: Što je Grafana dodatak?

S tehničkog gledišta, dodatak za Grafanu je Angular kontroler koji je pohranjen u Grafaninom direktoriju podataka (/var/grafana/plugins/ /dist/module.js) i može se učitati kao SystemJS modul. Ovaj direktorij također bi trebao sadržavati datoteku plugin.json koja sadrži sve metapodatke o vašem dodatku: naziv, verziju, vrstu dodatka, poveznice na repozitorij/web-stranicu/licencu, ovisnosti i tako dalje.

Razvoj dodatka za Grafanu: povijest velikih hitova
modul.ts

Razvoj dodatka za Grafanu: povijest velikih hitova
plugin.json

Kao što možete vidjeti na snimci zaslona, ​​naveli smo plugin.type = app. To je zato što postoje tri vrste dodataka za Grafanu:

ploča: najčešći tip dodatka - to je ploča za vizualizaciju određenih metrika i koristi se za izradu raznih nadzornih ploča.
izvor podataka: konektor dodatka za bilo koji izvor podataka (na primjer, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
aplikacijaDodatak koji vam omogućuje izradu vlastite frontend aplikacije unutar Grafane, stvaranje vlastitih HTML stranica i ručni pristup izvoru podataka za vizualizaciju različitih podataka. Druge vrste dodataka (izvor podataka, panel) i razne nadzorne ploče također se mogu koristiti kao ovisnosti.

Razvoj dodatka za Grafanu: povijest velikih hitova
Primjer ovisnosti dodataka s tipom = aplikacija.

Kao programski jezik možete koristiti JavaScript ili TypeScript (mi smo odabrali TypeScript). Možete kreirati predloške za bilo koju vrstu hello-world dodatka. pronađi putem povezniceOvaj repozitorij sadrži veliki broj početnih paketa (postoji čak i eksperimentalni primjer React dodatka) s unaprijed instaliranim i konfiguriranim alatima za izradu.

2. dio: Priprema lokalnog okruženja

Za rad na dodatku, naravno će nam trebati Kubernetes klaster sa svim unaprijed instaliranim alatima: prometheus, node-exporter, kube-state-metrics i grafana. Okruženje bi trebalo biti brzo, jednostavno i bez problema za postavljanje, a kako bi se osiguralo vruće ponovno učitavanje, Grafana direktorij podataka trebao bi se montirati izravno s računala programera.

Po našem mišljenju, najpogodniji način lokalnog rada s Kubernetesom je minikubeSljedeći korak je instalacija Prometheus + Grafana paketa pomoću prometheus-operator-a. ovaj članak Postupak instaliranja prometheus-operatora na minikube detaljno je opisan. Da biste omogućili perzistenciju, potrebno je postaviti parametar upornost: istina U datoteci charts/grafana/values.yaml dodajte vlastite PV i PVC vrijednosti i navedite ih u parametru persistence.existingClaim.

Naš konačni skript za pokretanje minikubea izgleda ovako:

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

Dio 3: Izravni razvoj

Objektni model

U pripremi za implementaciju dodatka, odlučili smo definirati sve osnovne Kubernetes entitete s kojima ćemo raditi kao TypeScript klase: pod, deployment, daemonset, statefulset, job, cronjob, service, node i namespace. Svaka od ovih klasa nasljeđuje zajedničku klasu BaseModel, koja definira konstruktor, destruktor i metode za ažuriranje i promjenu vidljivosti. Svaka klasa također definira ugniježđene odnose s drugim entitetima, kao što je popis podova za entitet deploymenta.

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

Pomoću gettera i settera možemo prikazati ili postaviti željene metrike entiteta u prikladnom i čitljivom formatu. Na primjer, formatirani izlaz dodijelivih CPU čvorova:

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

Stranice

Popis svih stranica našeg dodatka je inicijalno opisan u našoj pluing.json datoteci u odjeljku ovisnosti:

Razvoj dodatka za Grafanu: povijest velikih hitova

U bloku za svaku stranicu moramo navesti NAZIV STRANICE (ovo će se zatim pretvoriti u slug pomoću kojeg će ta stranica biti dostupna); naziv komponente odgovorne za rad ove stranice (popis komponenti se izvozi u module.ts); oznaku korisničke uloge za koju je dostupan rad s ovom stranicom i postavke navigacije za bočnu traku.

U komponenti odgovornoj za rad stranice moramo postaviti templateUrl, prosljeđujući mu putanju do HTML datoteke koja sadrži oznake. Unutar kontrolera, putem ubrizgavanja ovisnosti, možemo pristupiti dvjema važnim Angular servisima:

  • backendSrv je servis koji omogućuje interakciju s Grafana API poslužiteljem;
  • datasourceSrv je usluga koja omogućuje lokalnu interakciju sa svim izvorima podataka instaliranim u vašoj Grafani (na primjer, metoda .getAll() vraća popis svih instaliranih izvora podataka; .get( ) — vraća objekt instance određenog izvora podataka.

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Dio 4: Izvor podataka

Iz Grafanine perspektive, izvor podataka je dodatak kao i svaki drugi: ima vlastitu ulaznu točku, module.js, i datoteku plugin.json s metapodacima. Prilikom razvoja dodatka s type = app, možemo komunicirati s postojećim izvorima podataka (na primjer, prometheus-datasource) ili vlastitim, koje možemo izravno pohraniti u direktorij dodatka (dist/datasource/*) ili instalirati kao ovisnost. U našem slučaju, izvor podataka je u paketu s kodom dodatka. Također su potrebni predložak config.html i kontroler ConfigCtrl, koji će se koristiti za konfiguracijsku stranicu instance izvora podataka i kontroler izvora podataka, koji implementira logiku za vaš izvor podataka.

U dodatku KubeGraf, iz perspektive korisničkog sučelja, izvor podataka je instanca Kubernetes klastera koja implementira sljedeće mogućnosti (izvorni kod dostupan по ссылке):

  • dohvaćanje podataka s k8s API poslužitelja (dobivanje popisa imenskih prostora, implementacija itd.)
  • Proksiranje zahtjeva prema prometheus-datasourceu (koji je odabran u postavkama dodatka za svaki specifični klaster) i formatiranje odgovora za korištenje podataka i na statičkim stranicama i na nadzornim pločama.
  • ažuriranje podataka na statičkim stranicama dodatka (s postavljenom frekvencijom osvježavanja).
  • Obrada upita za generiranje predloška lista u grafana-dashboards (metoda .metriFindQuery())

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

  • test veze s konačnim k8s klasterom.
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"};
       })
}

Posebno zanimljiv aspekt, po našem mišljenju, je implementacija mehanizma za autentifikaciju i autorizaciju izvora podataka. Obično, odmah po instalaciji, možemo koristiti Grafaninu ugrađenu komponentu datasourceHttpSettings za konfiguriranje pristupa konačnom izvoru podataka. Pomoću ove komponente možemo konfigurirati pristup HTTP izvoru podataka određivanjem URL-a i osnovnih postavki autentifikacije/autorizacije: prijava/lozinka ili client-cert/client-key. Implementacija mogućnosti konfiguriranja pristupa pomoću tokena nosioca (de facto standard za k8s) zahtijevala je malo petljanja.

Za rješavanje ovog problema možete koristiti Grafanino ugrađeno mehanizmo "Plugin Routes" (više detalja na službena stranica s dokumentacijom). U postavkama izvora podataka možemo deklarirati skup pravila usmjeravanja koja će obrađivati ​​grafana proxy poslužitelj. Na primjer, za svaku pojedinačnu krajnju točku postoji mogućnost postavljanja zaglavlja ili URL-ova s ​​podrškom za predloške, čiji se podaci mogu preuzeti iz polja jsonData i secureJsonData (za pohranjivanje lozinki ili tokena u šifriranom obliku). U našem primjeru, zahtjevi oblika /__proxy/api/v1/imenski prostori bit će proxyiran na URL-ove sljedeće vrste
/api/v1/namespaces sa postavljenim zaglavljem Authorization: Bearer.

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Naravno, za rad s k8s API poslužiteljem potreban nam je korisnik s pristupom samo za čitanje, manifeste za čije kreiranje možete pronaći i u izvorni kod dodatka.

Dio 5: Objava

Razvoj dodatka za Grafanu: povijest velikih hitova

Nakon što napišete vlastiti Grafana dodatak, prirodno je da ga želite učiniti otvorenog koda. U Grafani, ovo je biblioteka dodataka dostupna na grafana.com/grafana/plugins

Da bi vaš dodatak bio dostupan u službenoj trgovini, morate napraviti PR u ovo spremište, dodavanjem sadržaja poput ovog u datoteku repo.json:

Razvoj dodatka za Grafanu: povijest velikih hitova

gdje je version verzija vašeg dodatka, url je poveznica na repozitorij, a commit je hash commita koji će učiniti određenu verziju dodatka dostupnom.

I na izlazu ćete vidjeti prekrasnu sliku poput ove:

Razvoj dodatka za Grafanu: povijest velikih hitova

Podaci za njega će se automatski preuzeti iz vaših datoteka Readme.md, Changelog.md i datoteke plugin.json s opisom dodatka.

Dio 6: Umjesto zaključaka

Nismo prestali razvijati naš dodatak od njegovog izlaska. Trenutno radimo na pravilnom praćenju korištenja resursa čvorova klastera, implementaciji novih značajki za poboljšanje korisničkog iskustva i sortiranju velike količine povratnih informacija koje smo primili od naših kupaca i od korisnika na GitHubu nakon instalacije dodatka (ako ostavite zahtjev za problem ili povlačenje, bio bih jako sretan :)).

Nadamo se da će vam ovaj članak pomoći da shvatite tako divan alat kao što je Grafana i možda napišete vlastiti dodatak.

Спасибо!)

Izvor: www.habr.com

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster