Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Silav hemû! Çend meh berê, me projeya xweya çavkaniya vekirî ya nû dest bi hilberînê kir - pêveka Grafana ji bo şopandina kubernetes, ku me jê re digotin. DevOpsProdigy KubeGraf. Koda çavkaniya pêvekê li vir heye depoya giştî ya li ser GitHub. Û di vê gotarê de em dixwazin bi we re parve bikin ka me pêvek çawa çêkir, me kîjan amûr bikar anî û di pêvajoya pêşkeftinê de em rastî çi xeletiyan hatin. De em herin!

Beş 0 - destpêk: em çawa gihîştin vê xalê?

Fikra nivîsandina pêveka xwe ya ji bo Grafan bi tesadufî ji me re hat. Pargîdaniya me zêdetirî 10 sal in projeyên malperê yên astên cihêreng ên tevliheviyê dişopîne. Di vê demê de, me di karanîna pergalên cihêreng ên çavdêriyê de gelek pisporî, dozên balkêş û ezmûn berhev kiriye. Û di demekê de me ji xwe pirsî: "Gelo amûrek efsûnî heye ji bo şopandina Kubernetes, da ku, wekî ku dibêjin, "wê saz bike û wê ji bîr bike"?".. Standarda pîşesaziyê ji bo çavdêrîkirina k8-an, bê guman, ji mêj ve ye. Kombînasyona Prometheus + Grafana. Û wekî çareseriyên amade yên ji bo vê stakê, komek mezin a cûrbecûr amûran hene: prometheus-operator, komek dashboardên kubernetes-mixin, grafana-kubernetes-app.

Pêveka grafana-kubernetes-app ji me re vebijarka herî balkêş xuya bû, lê ji salek zêdetir e ku ew piştgirî nade û, ji bilî vê, nikare bi guhertoyên nû yên node-exporter û kube-state-metrîka re bixebite. Û di demekê de me biryar da: "Gelo divê em biryara xwe nedin?"

Çi ramanên me biryar da ku di pêveka xwe de bicîh bikin:

  • dîtbarîkirina "nexşeya serîlêdanê": pêşkêşkirina hêsan a serîlêdanên di komê de, ku ji hêla navan ve têne kom kirin, veqetandin ...;
  • dîtbarkirina girêdanên mîna "dabeşkirin - karûbar (+port)".
  • dîtbarîkirina belavkirina sepanên komê li ser girêkên komê.
  • berhevkirina metrîk û agahdariya ji çend çavkaniyan: Prometheus û servera api k8s.
  • çavdêrîkirina her du beşê binesaziyê (bikaranîna dema CPU, bîranîn, binepergala dîskê, torê) û mantiqa serîlêdanê - podên rewşa tenduristî, hejmara kopiyên berdest, agahdariya di derbarê derbasbûna ceribandinên zindîtî / amadebûnê de.

Beş 1: "Pêveka Grafana" çi ye?

Ji hêla teknîkî ve, pêveka ji bo Grafana kontrolkerek goşe ye, ku di pelrêça daneya Grafana de tête hilanîn (/var/grafana/plugins/ /dist/module.js) û dikare wekî modulek SystemJS were barkirin. Her weha di vê pelrêçê de divê pelek plugin.json hebe ku tê de hemî agahdariya meta di derheqê pêveka we de hebe: nav, guherto, celebê pêvekê, lînkên depo/malper/lîsans, girêdayîbûn û hwd.

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin
module.ts

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin
plugin.json

Wekî ku hûn di dîmenderê de dibînin, me plugin.type = app destnîşan kir. Ji ber ku pêvekên ji bo Grafana dikarin sê celeb bin:

panel: Cûreya pêvekê ya herî berbelav - ew panelek e ji bo dîtina her metrîkan, ku ji bo avakirina tabloyên cihêreng tê bikar anîn.
çavkaniya daneyê: girêdana pêvekê ji hin çavkaniya daneyê re (mînak, Prometheus-çavkaniya daneyê, ClickHouse-çavkaniya daneyê, ElasticSearch-çavkaniya daneyê).
app: Pêvekek ku dihêle hûn di hundurê Grafana de serîlêdana pêşiya xwe ava bikin, rûpelên xwe yên html-ê biafirînin û bi desta xwe bigihînin çavkaniya daneyê da ku daneyên cihêreng xuyang bikin. Di heman demê de, pêvekên cûreyên din (çavkaniya daneyê, panel) û tabloyên cihêreng dikarin wekî pêwendiyê werin bikar anîn.

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin
Nimûne girêdanên pêvekê bi type=app.

Hûn dikarin hem JavaScript û hem jî TypeScript wekî zimanek bernamekirinê bikar bînin (me ew hilbijart). Amadekariyên ji bo pêvekên hello-cîhanê yên her cûre ku hûn dikarin girêdanê bibînin: ev depo hejmareke mezin ji pakêtên destpêker dihewîne (tewra di React de mînakek ceribandinek pêvekek heye) bi avakerên pêş-sazkirî û mîhengkirî.

Beş 2: amadekirina jîngeha herêmî

Ji bo ku em li ser pêvekê bixebitin, em bi xwezayî hewceyê komek kubernetes bi hemî amûrên pêş-sazkirî hene: prometheus, node-exporter, kube-state-metrics, grafana. Pêdivî ye ku jîngeh zû, bi hêsanî û xwezayî were saz kirin, û ji bo ku ji nû ve barkirina germ were bicîh kirin, pelrêça daneya Grafana rasterast ji makîneya pêşdebiran were saz kirin.

Awayê herî hêsan, li gorî me, xebata herêmî bi kuberneteyan re ye minikube. Pêngava paşîn ev e ku hûn bi karanîna prometheus-operatorê kombînasyona Prometheus + Grafana saz bikin. LI vê gotarê Pêvajoya sazkirina prometheus-operatorê li ser minikube bi hûrgulî tête diyar kirin. Ji bo çalakkirina berdewamiyê, divê hûn pîvanê saz bikin domdar: rast di pelê nexşeyan/grafana/values.yaml de, PV û PVC-ya xwe zêde bikin û wan di pîvana persistence.existingClaim de diyar bikin.

Nivîsara meya destpêkirina minikube ya paşîn bi vî rengî xuya dike:

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

Beş 3: pêşveçûna rastîn

Modela Object

Di amadekirina pêkanîna pêvekê de, me biryar da ku em hemî pêkhateyên bingehîn ên Kubernetes ku em ê bi wan re di şiklê dersên TypeScript de bixebitin vebêjin: pod, deployment, daemonset, statefulset, kar, cronjob, karûbar, node, navan. Her yek ji van çînên ji çîna hevpar a BaseModel, ku çêker, wêranker, rêbazên nûvekirin û guheztina dîtinê vedibêje, mîras digire. Her yek ji çînan têkiliyên hêlînkirî yên bi hebûnên din re vedibêje, mînakî, navnîşek potan ji bo saziyek birêkûpêk a celebê.

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

Bi alîkariya wergir û sazkeran, em dikarin metrîkên sazûmanê yên ku em hewce ne bi rengek hêsan û xwendinê nîşan bidin an destnîşan bikin. Mînakî, derana formatkirî ya girêkên cpu-ya veqetandî:

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

Rûpelan,

Navnîşek hemî rûpelên pêvekên me di destpêkê de di pluing.json me de di beşa pêwendiyan de têne diyar kirin:

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Di bloka her rûpelê de divê em NAVÊ RÛpelê nîşan bidin (ew ê paşê veguhezîne şikilek ku ev rûpel dê bigihîje); navê pêkhateya ku ji xebata vê rûpelê berpirsiyar e (lîsteya pêkhateyan ji module.ts re tê şandin); nîşan dide ku rola bikarhêner ji bo ku xebata bi vê rûpelê re heye û mîhengên navîgasyonê ji bo kêlekê.

Di beşa ku berpirsiyarê xebata rûpelê de ye, divê em templateUrl saz bikin, li wir riya pelê html bi nîşankirinê re derbas bikin. Di hundurê kontrolkerê de, bi derzîlêdana girêdayîbûnê, em dikarin bigihîjin 2 karûbarên goşeyî yên girîng:

  • backendSrv - karûbarek ku bi servera Grafana API-ê re danûstendinê peyda dike;
  • datasourceSrv - karûbarek ku pêwendiya herêmî bi hemî çavkaniyên daneya ku di Grafana we de hatine saz kirin peyda dike (mînak, rêbaza .getAll() - navnîşek hemî çavkaniyên daneya sazkirî vedigerîne; .get( ) - nimûneyek ji çavkaniyek daneya taybetî vedigerîne.

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Beş 4: çavkaniya daneyê

Li gorî nêrîna Grafana, çavkaniya daneyê bi tevahî heman pêveka din e: module.js xala xweya têketinê heye, pelek bi agahdariya meta plugin.json heye. Dema ku pêvekek bi celeb = sepanê pêşve dixin, em dikarin hem bi çavkaniyên daneya heyî (mînakî, hem jî bi ya xwe re, ku em dikarin rasterast di pelrêça pêvekê de hilînin (dist/çavkaniya daneyê/*) re têkilî daynin an jî wekî girêdayî saz bikin. Di doza me de, çavkaniya daneyê bi koda pêvekê re tê. Di heman demê de pêdivî ye ku şablonek config.html û kontrolkerek ConfigCtrl hebe, ku dê ji bo rûpela veavakirina mînaka çavkaniya daneyê û kontrolkera Datasource, ku mantiqa çavkaniya daneya we bicîh tîne, were bikar anîn.

Di pêveka KubeGraf de, ji nêrîna navbeynkariya bikarhêner, çavkaniya daneyê mînakek komek kubernetes e ku kapasîteyên jêrîn bicîh tîne (koda çavkaniyê heye link):

  • berhevkirina daneyan ji k8s api-server (destxistina navnîşek navan, bicihkirin...)
  • daxwazên proxying ji bo prometheus-datasource (ya ku di mîhengên pêvekê de ji bo her komek taybetî tête hilbijartin) û bersivên şekildar kirin da ku daneyan hem di rûpelên statîk û hem jî di tabloyan de bikar bînin.
  • nûvekirina daneyan li ser rûpelên pêveka statîk (bi rêjeya nûvekirina destnîşankirî).
  • lêpirsinan hildiberîne da ku di tabloyên grafana de pelek şablonê çêbike (rêbaza metriFindQuery())

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

  • testa girêdanê bi koma dawî ya k8s.
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"};
       })
}

Xalek balkêş a cihêreng, li gorî me, pêkanîna mekanîzmayek rastkirin û destûrnameyê ji bo çavkaniya daneyê ye. Bi gelemperî, li derveyî qutikê, em dikarin datasourceHttpSettings-a pêkhateya Grafana-ya çêkirî bikar bînin da ku gihîştina çavkaniya daneya paşîn mîheng bikin. Bi karanîna vê hêmanê, em dikarin bi destnîşankirina url û mîhengên bingehîn ên erêkirin/destûrdanê ve gihandina çavkaniya daneya http mîheng bikin: têketin-şîfre, an jî muwekîlê-cert/mifteya xerîdar. Ji bo ku em şiyana mîhengkirina gihîştina bi karanîna nîşanek hilgirê (standarda defakto ya ji bo k8s) bicîh bînin, diviya bû ku em piçek guheztinek bikin.

Ji bo çareserkirina vê pirsgirêkê, hûn dikarin mekanîzmaya çêkirî ya Grafana "Rêyên Pêvekê" bikar bînin (hûrguliyên bêtir li rûpela belgeyên fermî). Di mîhengên çavkaniya daneya me de, em dikarin komek rêzikên rêvekirinê yên ku dê ji hêla servera proxy grafana ve werin hilberandin ragihînin. Mînakî, ji bo her xala dawiya kesane, gengaz e ku sernav an url-ên bi îmkana şablonê werin danîn, daneyên ku dikarin ji qadên jsonData û ewleJsonData bêne girtin (ji bo hilanîna şîfre an nîşanekan bi rengek şîfrekirî). Di mînaka me de, pirsên mîna /__proxy/api/v1/namespaces dê li ser url-ya formê were veguheztin
/api/v8/namespaces bi Desthilatdarî: Sernavê hilgirê.

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Bi xwezayî, ji bo ku em bi servera api k8s re bixebitin, pêdivî bi bikarhênerek bi tenê xwendinê heye, diyardeyên ji bo afirandina ku hûn jî dikarin tê de bibînin. koda çavkaniya pêvekê.

Beş 5: berdan

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Gava ku we pêveka xweya Grafana nivîsand, hûn ê bi xwezayî bixwazin ku wê ji raya giştî re peyda bikin. Li Grafana ev pirtûkxaneyek pêvekan e ku li vir heye grafana.com/grafana/plugins

Ji bo ku pêveka we li firotgeha fermî peyda bibe, hûn hewce ne ku tê de PR-ê çêbikin vê depoyêbi lê zêdekirina naverokek bi vî rengî li pelê repo.json:

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

li ku derê guherto guhertoya pêveka we ye, url zencîreka depoyê ye, û commit haşeya commitê ye ku ji bo wê guhertoyek taybetî ya pêvekê dê peyda bibe.

Û di encam de hûn ê wêneyek ecêb bibînin:

Pêşxistina pêvekek ji bo Grafana: Dîrokek guleyên mezin

Daneyên ji bo wê dê bixweber ji Readme.md, Changelog.md û pelê plugin.json bi danasîna pêvekê were girtin.

Beş 6: li şûna encaman

Me piştî berdanê dest ji pêşvebirina pêveka xwe berneda. Naha em li ser şopandina rast a karanîna çavkaniyên girêkên komê dixebitin, danasîna taybetmendiyên nû ji bo baştirkirina UX-ê, û di heman demê de jimarek mezin ji bertekên ku piştî sazkirina pêvekê hem ji hêla xerîdarên me ve hem jî ji mirovên li ser GitHub-ê ve hatî girtin (heke hûn derkevin pirsgirêka we an daxwaziya we, ez ê pir kêfxweş bim :)

Em hêvî dikin ku ev gotar dê ji we re bibe alîkar ku hûn amûrek wusa ecêb wekî Grafana fam bikin û, dibe ku, pêveka xwe binivîsin.

Sipas ji were!)

Source: www.habr.com

Ji bo malperên bi parastina DDoS, serverên VPS VDS mêvandariya pêbawer bikirin 🔥 Hostinga malperê ya pêbawer bi parastina DDoS, serverên VPS VDS bikirin | ProHoster