Grafana-laajennuksen kehittäminen: suurten osumien historia

Hei kaikki! Muutama kuukausi sitten käynnistimme tuotantoon uuden avoimen lähdekoodin projektimme - Grafana-laajennuksen kubernetes-valvontaan, jota kutsuimme DevOpsProdigy KubeGraf. Laajennuksen lähdekoodi on saatavilla osoitteessa julkinen arkisto GitHubissa. Ja tässä artikkelissa haluamme jakaa kanssasi tarinan siitä, kuinka loimme laajennuksen, mitä työkaluja käytimme ja mitä sudenkuoppia kohtasimme kehitysprosessin aikana. Mennään!

Osa 0 - johdanto: miten pääsimme tähän pisteeseen?

Ajatus oman lisäosan kirjoittamisesta Grafanille syntyi meille aivan vahingossa. Yrityksemme on seurannut monimutkaisia ​​verkkoprojekteja yli 10 vuoden ajan. Tänä aikana meille on kertynyt runsaasti asiantuntemusta, mielenkiintoisia tapauksia ja kokemusta erilaisten valvontajärjestelmien käytöstä. Ja jossain vaiheessa kysyimme itseltämme: "Onko olemassa taikatyökalua Kubernetesin tarkkailuun, jotta, kuten sanotaan, "aseta se ja unohda"?" Prometheus + Grafana yhdistelmä. Ja valmiina ratkaisuina tähän pinoon on olemassa suuri joukko erilaisia ​​työkaluja: prometheus-operaattori, joukko kubernetes-mixin-kojetauluja, grafana-kubernetes-app.

Grafana-kubernetes-app-laajennus vaikutti mielenkiintoisimmalta vaihtoehdolta meille, mutta sitä ei ole tuettu yli vuoteen, eikä se myöskään toimi uusien node-exporter- ja kube-state-metrics-versioiden kanssa. Ja jossain vaiheessa päätimme: "Eikö meidän pitäisi tehdä oma päätös?"

Mitä ideoita päätimme toteuttaa laajennuksessamme:

  • "sovelluskartan" visualisointi: sovellusten kätevä esitys klusterissa ryhmiteltynä nimiavaruuksien, käyttöönottojen mukaan...;
  • yhteyksien visualisointi, kuten "käyttöönotto - palvelu (+portit)".
  • klusterisovellusten jakautumisen visualisointi klusterin solmujen välillä.
  • kokoelma mittareita ja tietoja useista lähteistä: Prometheus ja k8s api server.
  • sekä infrastruktuuriosan (prosessoriajan, muistin, levyalijärjestelmän, verkon käyttö) että sovelluslogiikan seuranta - kunto-tilatyypit, käytettävissä olevien replikoiden määrä, tiedot elävyys-/valmiustestien läpäisystä.

Osa 1: Mikä on "Grafana-laajennus"?

Teknisestä näkökulmasta Grafanan lisäosa on kulmaohjain, joka on tallennettu Grafanan tietohakemistoon (/var/grafana/plugins/ /dist/module.js) ja se voidaan ladata SystemJS-moduulina. Myös tässä hakemistossa pitäisi olla plugin.json-tiedosto, joka sisältää kaikki laajennuksen metatiedot: nimi, versio, laajennuksen tyyppi, linkit arkistoon/sivustoon/lisenssiin, riippuvuudet ja niin edelleen.

Grafana-laajennuksen kehittäminen: suurten osumien historia
module.ts

Grafana-laajennuksen kehittäminen: suurten osumien historia
plugin.json

Kuten kuvakaappauksesta näet, määritimme plugin.type = app. Koska Grafana-laajennukset voivat olla kolmenlaisia:

paneeli: yleisin laajennustyyppi - se on paneeli minkä tahansa mittareiden visualisointiin, jota käytetään erilaisten kojelaudoiden rakentamiseen.
tietolähde: liitin johonkin tietolähteeseen (esimerkiksi Prometheus-tietolähde, ClickHouse-tietolähde, ElasticSearch-tietolähde).
sovelluksen: Laajennus, jonka avulla voit rakentaa oman käyttöliittymäsovelluksesi Grafanan sisällä, luoda omia html-sivuja ja käyttää tietolähdettä manuaalisesti erilaisten tietojen visualisoimiseksi. Riippuvuuksina voidaan käyttää myös muun tyyppisiä laajennuksia (tietolähde, paneeli) ja erilaisia ​​kojelaudat.

Grafana-laajennuksen kehittäminen: suurten osumien historia
Esimerkki liitännäisriippuvuuksista type=app.

Voit käyttää sekä JavaScriptiä että TypeScriptiä ohjelmointikielenä (valitsimme sen). Valmistelut kaikentyyppisille hello-world-laajennuksille löydä linkki: tämä arkisto sisältää suuren määrän aloituspaketteja (Reactissa on jopa kokeellinen esimerkki laajennuksesta), joissa on esiasennettuja ja määritettyjä rakentajia.

Osa 2: Paikallisen ympäristön valmistelu

Laajennuksen työskentelyyn tarvitsemme luonnollisesti kubernetes-klusterin, jossa on kaikki esiasennetut työkalut: prometheus, node-exporter, kube-state-metrics, grafana. Ympäristö tulee perustaa nopeasti, helposti ja luonnollisesti, ja kuuman uudelleenlatauksen varmistamiseksi Grafana-tietohakemisto tulee asentaa suoraan kehittäjän koneelta.

Mielestämme kätevin tapa työskennellä paikallisesti kubernetesin kanssa on minikube. Seuraava vaihe on Prometheus + Grafana -yhdistelmän asentaminen käyttämällä prometheus-operaattoria. SISÄÄN tämä artikkeli Prometheus-operatorin asennusprosessi minikubeen on kuvattu yksityiskohtaisesti. Jos haluat sallia pysyvyyden, sinun on asetettava parametri pysyvyys: totta lisää omat PV- ja PVC-tiedostosi charts/grafana/values.yaml-tiedostoon ja määritä ne persistence.existingClaim-parametrissa

Viimeinen minikube-käynnistysskriptimme näyttää tältä:

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

Osa 3: todellinen kehitys

Objekti malli

Valmistellessamme laajennuksen käyttöönottoa päätimme kuvata kaikki Kubernetes-perusentiteetit, joiden kanssa työskentelemme TypeScript-luokkien muodossa: pod, käyttöönotto, daemonset, statefulset, työ, cronjob, service, node, namespace. Jokainen näistä luokista perii yhteisen BaseModel-luokan, joka kuvaa rakentajan, tuhoajan ja näkyvyyden päivittämisen ja vaihtamisen menetelmät. Jokainen luokka kuvaa sisäkkäisiä suhteita muiden entiteettien kanssa, esimerkiksi luettelon tyypiltään käyttöönottotyypin entiteetistä.

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

Getterien ja setterien avulla voimme näyttää tai asettaa tarvitsemamme kokonaisuuden mittareita kätevässä ja luettavassa muodossa. Esimerkiksi allokoitavien suoritinsolmujen muotoiltu tulos:

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

sivut

Luettelo kaikista laajennussivuistamme on alun perin kuvattu pluing.json-tiedostossamme riippuvuudet-osiossa:

Grafana-laajennuksen kehittäminen: suurten osumien historia

Jokaisen sivun lohkossa meidän on ilmoitettava SIVUN NIMI (se muunnetaan sitten sivuksi, jonka kautta tämä sivu on käytettävissä); tämän sivun toiminnasta vastaavan komponentin nimi (komponenttiluettelo viedään osoitteeseen module.ts); ilmaisee käyttäjäroolin, jolle tämä sivu on käytettävissä, ja sivupalkin navigointiasetukset.

Sivun toiminnasta vastaavassa komponentissa meidän on asetettava templateUrl ja välitettävä sinne polku html-tiedostoon merkinnällä. Ohjaimen sisällä pääsemme riippuvuuden lisäämisen kautta jopa kahteen tärkeään kulmapalveluun:

  • backendSrv - palvelu, joka tarjoaa vuorovaikutuksen Grafana API -palvelimen kanssa;
  • datasourceSrv - palvelu, joka tarjoaa paikallisen vuorovaikutuksen kaikkien Grafanaan asennettujen tietolähteiden kanssa (esimerkiksi .getAll()-metodi - palauttaa luettelon kaikista asennetuista tietolähteistä; .get( ) - palauttaa tietyn tietolähteen ilmentymäobjektin.

Grafana-laajennuksen kehittäminen: suurten osumien historia

Grafana-laajennuksen kehittäminen: suurten osumien historia

Grafana-laajennuksen kehittäminen: suurten osumien historia

Osa 4: Tietolähde

Grafanan näkökulmasta tietolähde on täsmälleen sama plugin kuin kaikki muutkin: sillä on oma sisääntulokohtansa module.js, siellä on tiedosto metatiedoilla plugin.json. Kun kehitämme liitännäistä type = app, voimme olla vuorovaikutuksessa sekä olemassa olevien tietolähteiden (esim. prometheus-datasource) että omien tietolähteiden kanssa, jotka voimme tallentaa suoraan laajennushakemistoon (dist/datasource/*) tai asentaa riippuvuutena. Meidän tapauksessamme tietolähteen mukana tulee laajennuskoodi. Lisäksi tarvitaan config.html-malli ja ConfigCtrl-ohjain, joita käytetään tietolähteen ilmentymän määrityssivulle ja Datasource-ohjain, joka toteuttaa tietolähteesi logiikan.

KubeGraf-laajennuksessa käyttöliittymän näkökulmasta tietolähde on kubernetes-klusterin esiintymä, joka toteuttaa seuraavat ominaisuudet (lähdekoodi on saatavilla по ссылке):

  • tietojen kerääminen k8s api-palvelimelta (nimiavaruuksien luettelon saaminen, käyttöönotot...)
  • välityspalvelinpyyntöjen prometheus-datasource (joka on valittu kunkin klusterin laajennusasetuksissa) ja vastausten muotoilu niin, että tietoja voidaan käyttää sekä staattisilla sivuilla että kojelaudoilla.
  • staattisten liitännäissivujen tietojen päivittäminen (asetettu virkistystaajuus).
  • kyselyjen käsittely mallitaulukon luomiseksi grafana-dashboardsissa (metriFindQuery()-menetelmä)

Grafana-laajennuksen kehittäminen: suurten osumien historia

Grafana-laajennuksen kehittäminen: suurten osumien historia

Grafana-laajennuksen kehittäminen: suurten osumien historia

  • yhteystesti lopullisen k8s-klusterin kanssa.
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"};
       })
}

Mielestämme erillinen mielenkiintoinen seikka on tietolähteen todennus- ja valtuutusmekanismin käyttöönotto. Tyypillisesti, valmiina, voimme käyttää sisäänrakennettua Grafana-komponenttia datasourceHttpSettings määrittääksemme pääsyn lopulliseen tietolähteeseen. Tämän komponentin avulla voimme määrittää pääsyn http-tietolähteeseen määrittämällä URL-osoitteen ja perustodennus-/valtuutusasetukset: login-password tai client-cert/client-key. Jotta pystyisimme määrittämään pääsyn siirtotietunnuksella (de facto standardi k8s:lle), meidän piti tehdä vähän säätämistä.

Tämän ongelman ratkaisemiseksi voit käyttää sisäänrakennettua Grafanan "Plugin Routes" -mekanismia (lisätietoja osoitteessa virallinen dokumentaatiosivu). Tietolähteemme asetuksissa voimme ilmoittaa joukon reitityssääntöjä, jotka grafana-välityspalvelin käsittelee. Esimerkiksi jokaiselle yksittäiselle päätepisteelle on mahdollista asettaa otsikoita tai URL-osoitteita, joissa on mallipohja, joiden tiedot voidaan ottaa jsonData- ja secureJsonData-kentistä (salasanojen tai tunnuksien tallentamista varten salatussa muodossa). Esimerkissämme kyselyt kuten /__proxy/api/v1/namespaces välitetään lomakkeen URL-osoitteeseen
/api/v8/namespaces, joissa on Authorization: Bearer -otsikko.

Grafana-laajennuksen kehittäminen: suurten osumien historia

Grafana-laajennuksen kehittäminen: suurten osumien historia

Luonnollisesti k8s api-palvelimen kanssa työskentelyyn tarvitsemme käyttäjän, jolla on vain luku -käyttöoikeus, jonka luomista varten löydät myös laajennuksen lähdekoodi.

Osa 5: julkaisu

Grafana-laajennuksen kehittäminen: suurten osumien historia

Kun olet kirjoittanut oman Grafana-laajennuksen, haluat luonnollisesti tehdä sen julkisesti saataville. Grafanassa tämä on kirjasto laajennuksista, jotka ovat saatavilla täältä grafana.com/grafana/plugins

Jotta laajennuksesi olisi saatavilla virallisessa kaupassa, sinun on tehtävä PR tämä arkistolisäämällä tällaista sisältöä repo.json-tiedostoon:

Grafana-laajennuksen kehittäminen: suurten osumien historia

jossa versio on laajennuksen versio, url on linkki arkistoon ja commit on vahvistuksen tiiviste, jolle on saatavana tietty versio laajennuksesta.

Ja ulostulossa näet upean kuvan, kuten:

Grafana-laajennuksen kehittäminen: suurten osumien historia

Sen tiedot noudetaan automaattisesti Readme.md-, Changelog.md- ja plugin.json-tiedostosta, jossa on laajennuksen kuvaus.

Osa 6: johtopäätösten sijaan

Emme lopettaneet laajennuksen kehittämistä julkaisun jälkeen. Ja nyt pyrimme seuraamaan oikein klusterisolmujen resurssien käyttöä, ottamaan käyttöön uusia ominaisuuksia UX:n parantamiseksi ja keräämään myös suuren määrän palautetta, joka on saatu laajennuksen asennuksen jälkeen sekä asiakkailtamme että GitHubin ihmisiltä (jos poistut). ongelmasi tai vetopyyntösi, olen erittäin iloinen :)

Toivomme, että tämä artikkeli auttaa sinua ymmärtämään niin upean työkalun kuin Grafana ja ehkä kirjoittamaan oman laajennuksen.

Kiitos!)

Lähde: will.com

Lisää kommentti