Grafana spraudņa izstrāde: lielo kadru vēsture

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 DevOpsProdigy KubeGraf. Spraudņa pirmkods ir pieejams vietnē publiskajā repozitorijā vietnē GitHub. Un Å”ajā rakstā mēs vēlamies dalÄ«ties ar jums stāstā par to, kā mēs izveidojām spraudni, kādus rÄ«kus izmantojām un ar kādām nepilnÄ«bām mēs saskārāmies izstrādes procesā. Ejam!

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.

Grafana spraudņa izstrāde: lielo kadru vēsture
modulis.ts

Grafana spraudņa izstrāde: lielo kadru vēsture
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.

Grafana spraudņa izstrāde: lielo kadru vēsture
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 atrast pēc saites: Å”ajā krātuvē ir liels skaits sākuma pakotņu (react ir pat eksperimentāls spraudņa piemērs) ar iepriekÅ” instalētiem un konfigurētiem veidotājiem.

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 minikube. Nākamais solis ir Prometheus + Grafana kombinācijas instalÄ“Å”ana, izmantojot prometheus-operatoru. IN Å is raksts Prometheus-operatora instalÄ“Å”anas process minikube ir detalizēti aprakstÄ«ts. Lai iespējotu noturÄ«bu, ir jāiestata parametrs noturÄ«ba: taisnÄ«ba failā charts/grafana/values.yaml pievienojiet savu PV un PVC un norādiet tos parametrā persistence.existingClaim

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ļā:

Grafana spraudņa izstrāde: lielo kadru vēsture

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.

Grafana spraudņa izstrāde: lielo kadru vēsture

Grafana spraudņa izstrāde: lielo kadru vēsture

Grafana spraudņa izstrāde: lielo kadru vēsture

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())

Grafana spraudņa izstrāde: lielo kadru vēsture

Grafana spraudņa izstrāde: lielo kadru vēsture

Grafana spraudņa izstrāde: lielo kadru vēsture

  • 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 oficiālā dokumentācijas lapa). MÅ«su datu avota iestatÄ«jumos mēs varam deklarēt marÅ”rutÄ“Å”anas noteikumu kopu, ko apstrādās grafana starpniekserveris. Piemēram, katram atseviŔķam galapunktam ir iespējams iestatÄ«t galvenes vai urls ar veidņu iespēju, par kuriem datus var ņemt no laukiem jsonData un secureJsonData (paroļu vai marÄ·ieru glabāŔanai Å”ifrētā veidā). MÅ«su piemērā tādi vaicājumi kā /__proxy/api/v1/namespaces tiks nosÅ«tÄ«ts uz veidlapas URL
/api/v8/namespaces ar autorizācijas: nesēja galveni.

Grafana spraudņa izstrāde: lielo kadru vēsture

Grafana spraudņa izstrāde: lielo kadru vēsture

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Ä« spraudņa pirmkods.

5. daļa: atbrīvoŔana

Grafana spraudņa izstrāde: lielo kadru vēsture

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 grafana.com/grafana/plugins

Lai jūsu spraudnis būtu pieejams oficiālajā veikalā, jums ir jāveic PR Ŕo repozitorijupievienojot failu repo.json Ŕādu saturu:

Grafana spraudņa izstrāde: lielo kadru vēsture

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:

Grafana spraudņa izstrāde: lielo kadru vēsture

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

Pievieno komentāru