Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Aloha kākou! I kekahi mau mahina i hala aku nei, ua hoʻomaka mākou i kā mākou papahana open-source hou i ka hana - ka plugin Grafana no ka nānā ʻana i nā kubernetes, a mākou i kapa ai. DevOpsProdigy KubeGraf. Loaʻa ka code source plugin ma waihona waihona lehulehu ma GitHub. A ma kēia ʻatikala makemake mākou e kaʻana like iā ʻoe i ka moʻolelo o ke ʻano o kā mākou hana ʻana i ka plugin, he aha nā mea hana a mākou i hoʻohana ai a he aha nā pitfalls i loaʻa iā mākou i ka wā o ka hoʻomohala ʻana. E hele kāua!

Mahele 0 - hoʻolauna: pehea mākou i hiki ai i kēia wahi?

ʻO ka manaʻo e kākau i kā mākou plugin ponoʻī no Grafan i hiki mai iā mākou me ka pōʻino. Ke nānā nei kā mākou hui i nā papahana pūnaewele o nā pae like ʻole o ka paʻakikī no nā makahiki he 10. I loko o kēia manawa, ua hōʻiliʻili mākou i ka nui o ka ʻike, nā hihia hoihoi, a me ka ʻike i ka hoʻohana ʻana i nā ʻōnaehana nānā like ʻole. A i kekahi manawa ua nīnau mākou iā mākou iho: "He mea hana kilokilo no ka nānā ʻana i nā Kubernetes, no laila, e like me kā lākou e ʻōlelo nei, "hoʻonoho a poina iā ia"?". ʻO ka hui pū ʻana o Prometheus + Grafana. A ma ke ʻano he hoʻonā mākaukau no kēia waihona, aia kahi pūʻulu nui o nā ʻano mea hana like ʻole: prometheus-operator, kahi papa kubernetes-mixin dashboards, grafana-kubernetes-app.

ʻO ka grafana-kubernetes-app plugin ka mea i koho maikaʻi loa iā mākou, akā ʻaʻole i kākoʻo ʻia no hoʻokahi makahiki a ʻoi aku, ʻaʻole hiki ke hana me nā mana hou o ka node-exporter a me kube-state-metrics. A i kekahi manawa ua hoʻoholo mākou: "ʻAʻole anei mākou e hoʻoholo i kā mākou hoʻoholo?"

He aha nā manaʻo a mākou i hoʻoholo ai e hoʻokō i kā mākou plugin:

  • ʻike ʻia o ka "palapala palapala noi": hōʻike maʻalahi o nā noi i loko o ka pūʻulu, i hui pū ʻia e nā inoa inoa, nā hoʻolālā ...;
  • ʻike ʻia o nā pilina e like me "deployment - service (+ports)".
  • ka ʻike ʻana i ka hāʻawi ʻana i nā noi puʻupuʻu ma waena o nā nodes cluster.
  • ka hōʻiliʻili ʻana o nā metric a me nā ʻike mai kekahi mau kumu: Prometheus a me k8s api server.
  • ka nānā ʻana i nā ʻāpana hana ʻelua (ka hoʻohana ʻana i ka manawa CPU, ka hoʻomanaʻo, ka subsystem disk, ka pūnaewele) a me ka loiloi noi - nā kūlana olakino, ka helu o nā replicas i loaʻa, ka ʻike e pili ana i ka hele ʻana i nā hoʻokolohua ola / mākaukau.

Mahele 1: He aha ka "Grafana plugin"?

Mai kahi hiʻohiʻona ʻenehana, ʻo ka plugin no Grafana he mea hoʻokele angular, i mālama ʻia ma ka papa kuhikuhi data Grafana (/var/grafana/plugins/ /dist/module.js) a hiki ke hoʻouka ʻia ma ke ʻano he module SystemJS. Ma loko o kēia papa kuhikuhi pono e loaʻa kahi faila plugin.json i loaʻa nā ʻike meta āpau e pili ana i kāu plugin: inoa, mana, ʻano plugin, nā loulou i ka waihona / kahua / laikini, nā hilinaʻi, a pēlā aku.

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui
module.ts

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui
plugin.json

E like me kāu e ʻike ai ma ke kiʻi kiʻi, ua kuhikuhi mākou i plugin.type = app. No ka mea hiki i nā plugins no Grafana ke ʻekolu ʻano:

panel: ke ʻano maʻamau o ka plugin - he panel ia no ka ʻike ʻana i nā metric, hoʻohana ʻia e kūkulu i nā dashboards like ʻole.
kumu ʻikepili: mea hoʻohui plugin i kekahi kumu ʻikepili (no ka laʻana, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
mail app: ʻO kahi plugin e hiki ai iā ʻoe ke kūkulu i kāu noi mua i loko o Grafana, hana i kāu ʻaoʻao html ponoʻī a komo lima i ka ʻikepili e nānā i nā ʻikepili like ʻole. Eia kekahi, hiki ke hoʻohana ʻia nā plugins o nā ʻano ʻē aʻe (datasource, panel) a me nā dashboard like ʻole ma ke ʻano he hilinaʻi.

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui
Hoʻohālike i nā hilinaʻi plugin me type=app.

Hiki iā ʻoe ke hoʻohana i ka JavaScript a me TypeScript ma ke ʻano he ʻōlelo papahana (ua koho mākou iā ia). Hoʻomākaukau no nā plugins hello-world o kēlā me kēia ʻano āu e hiki ai huli i ka loulou: Aia i loko o kēia waihona kahi helu nui o ka starter-packs (aia kekahi hiʻohiʻona hoʻokolohua o kahi plugin i React) me nā mea kūkulu i hoʻonohonoho mua ʻia a hoʻonohonoho ʻia.

Māhele 2: ka hoʻomākaukau ʻana i ke kaiapuni kūloko

No ka hana ʻana i ka plugin, pono mākou i kahi puʻupuʻu kubernetes me nā mea hana i kau mua ʻia: prometheus, node-exporter, kube-state-metrics, grafana. Pono e hoʻonohonoho koke ʻia ke kaiapuni, maʻalahi a kūlohelohe, a no ka hōʻoia ʻana i ka hoʻouka hou ʻana, pono e kau pololei ʻia ka papa kuhikuhi ʻikepili Grafana mai ka mīkini o ka mea hoʻomohala.

ʻO ke ala maʻalahi loa, i ko mākou manaʻo, e hana ma ka ʻāina me nā kubernetes minikube. ʻO ka hana aʻe e hoʻokomo i ka hui Prometheus + Grafana me ka hoʻohana ʻana i ka prometheus-operator. IN keia 'atikala ʻO ke kaʻina hana o ka hoʻokomo ʻana i ka prometheus-operator ma minikube e wehewehe kikoʻī ʻia. I mea e hiki ai ke hoʻomau, pono ʻoe e hoʻonohonoho i ka ʻāpana hoomau: oiaio i loko o ka waihona palapala/grafana/values.yaml, e hoʻohui i kāu PV ponoʻī a me ka PVC a kuhikuhi iā lākou ma ka ʻāpana persistence.existingClaim.

ʻO kā mākou hōʻailona minikube hoʻomaka hope e like me kēia:

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

Mahele 3: hoʻomohala maoli

Mea Hoʻohālike

I ka hoʻomākaukau ʻana no ka hoʻokō ʻana i ka plugin, ua hoʻoholo mākou e wehewehe i nā hui Kubernetes kumu a mākou e hana pū ai ma ke ʻano o nā papa TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Loaʻa kēlā me kēia papa mai ka papa BaseModel maʻamau, e wehewehe ana i ka mea hana, mea luku, nā ala no ka hoʻonui ʻana a me ka hoʻololi ʻana i ka ʻike. Hōʻike kēlā me kēia papa i nā pilina pūnana me nā hui ʻē aʻe, no ka laʻana, he papa inoa o nā pods no kahi hui o ke ʻano hoʻolaha.

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

Me ke kōkua o nā getters a me nā mea hoʻonohonoho, hiki iā mākou ke hōʻike a hoʻonohonoho i nā metric entity e pono ai mākou ma kahi ʻano kūpono a hiki ke heluhelu ʻia. No ka laʻana, puka i hoʻohālikelike ʻia o nā node cpu hiki ke hoʻokaʻawale ʻia:

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

Pages

Ua wehewehe mua ʻia kahi papa inoa o kā mākou ʻaoʻao plugin i kā mākou pluing.json ma ka ʻāpana hilinaʻi:

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ma ka poloka no kēlā me kēia ʻaoʻao pono mākou e hōʻike i ka PAGE NAME (a laila e hoʻololi ʻia i kahi slug e hiki ai ke ʻike i kēia ʻaoʻao); ka inoa o ka ʻāpana kuleana no ka hana ʻana o kēia ʻaoʻao (ua lawe ʻia ka papa inoa o nā ʻāpana i module.ts); e hōʻike ana i ke kuleana o ka mea hoʻohana e loaʻa ai ka hana me kēia ʻaoʻao a me nā hoʻonohonoho hoʻokele no ka ʻaoʻao ʻaoʻao.

Ma ka ʻāpana kuleana no ka hana ʻana o ka ʻaoʻao, pono mākou e hoʻonohonoho i templateUrl, e hele ana ma laila ke ala i ka faila html me ka markup. I loko o ka mea hoʻoponopono, ma o ka hoʻokele hilinaʻi, hiki iā mākou ke komo i nā lawelawe angular koʻikoʻi 2:

  • backendSrv - he lawelawe e hāʻawi ana i ka launa pū me ka server Grafana API;
  • datasourceSrv - he lawelawe e hāʻawi ana i ka pilina kūloko me nā kumu ʻikepili a pau i hoʻokomo ʻia ma kāu Grafana (no ka laʻana, ke ʻano .getAll() - hoʻihoʻi i kahi papa inoa o nā kumu ʻikepili i hoʻokomo ʻia; .get( ) - hoʻihoʻi i kahi mea hoʻohālike o kahi kumu ʻikepili kikoʻī.

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Mahele 4: kumu ʻikepili

Mai ka manaʻo o Grafana, ʻokoʻa like ka waihona ʻikepili me nā mea ʻē aʻe a pau: aia kāna module.js ponoʻī, aia kahi faila me ka meta information plugin.json. I ka hoʻomohala ʻana i kahi plugin me type = app, hiki iā mākou ke launa pū me nā kumu ʻikepili i loaʻa (no ka laʻana, prometheus-datasource) a me kā mākou ponoʻī, hiki iā mākou ke mālama pono i ka papa kuhikuhi plugin (dist/datasource/*) a i ʻole e hoʻokomo ma ke ʻano he hilinaʻi. I kā mākou hihia, hele mai ka ʻikepili me ka code plugin. Pono nō hoʻi e loaʻa i kahi hoʻoponopono config.html a me kahi mea hoʻoponopono ConfigCtrl, e hoʻohana ʻia no ka ʻaoʻao hoʻonohonoho hoʻonohonoho kumu ʻikepili a me ka mea hoʻoponopono Datasource, nāna e hoʻokō i ka loiloi hana o kāu kumu ʻikepili.

I loko o ka plugin KubeGraf, mai ka manaʻo o ka mea hoʻohana, ʻo ka ʻikepili kahi kumu o kahi puʻupuʻu kubernetes e hoʻokō nei i nā mana aʻe (loaʻa ka code kumu. loulou):

  • e hōʻiliʻili i ka ʻikepili mai ka k8s api-server (loaʻa i kahi papa inoa o nā papa inoa, hoʻolālā ...)
  • noi proxying i prometheus-datasource (i koho ʻia ma nā hoʻonohonoho plugin no kēlā me kēia pūʻulu kikoʻī) a me ka hoʻopili ʻana i nā pane e hoʻohana i ka ʻikepili ma nā ʻaoʻao static a ma nā dashboards.
  • hōʻano hou i ka ʻikepili ma nā ʻaoʻao plugin static (me ka helu hoʻomaha hoʻonohonoho).
  • ka hoʻoponopono ʻana i nā nīnau no ka hoʻopuka ʻana i kahi pepa maʻamau i nā grafana-dashboards (metriFindQuery() ala)

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

  • ho'āʻo pili me ka puʻupuʻu k8s hope loa.
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"};
       })
}

ʻO kahi mea hoihoi ʻē aʻe, i ko mākou manaʻo, ʻo ia ka hoʻokō ʻana i kahi ʻano hōʻoia a me ka ʻae ʻana no ka ʻikepili. ʻO ka mea maʻamau, ma waho o ka pahu, hiki iā mākou ke hoʻohana i ka mea i kūkulu ʻia ʻo Grafana datasourceHttpSettings e hoʻonohonoho i ke komo ʻana i ke kumu ʻikepili hope loa. Ke hoʻohana nei i kēia ʻāpana, hiki iā mākou ke hoʻonohonoho i ke komo ʻana i ke kumu ʻikepili http ma ka wehewehe ʻana i ka url a me nā hoʻonohonoho hōʻoia / ʻae kumu: login-password, a i ʻole client-cert/client-key. I mea e hoʻokō ai i ka hiki ke hoʻonohonoho i ke komo ʻana me ka hoʻohana ʻana i ka mea lawe hōʻailona (ke kūlana de facto no k8s), pono mākou e hoʻololi iki.

No ka hoʻoponopono ʻana i kēia pilikia, hiki iā ʻoe ke hoʻohana i ka mīkini hana "Plugin Routes" i kūkulu ʻia (nā kikoʻī hou aku ma ʻaoʻao palapala kūhelu). Ma nā hoʻonohonoho o kā mākou kumu ʻikepili, hiki iā mākou ke haʻi aku i kahi hoʻonohonoho o nā lula ala e hoʻokele ʻia e ka server proxy grafana. No ka laʻana, no kēlā me kēia helu hope hiki ke hoʻonohonoho i nā poʻomanaʻo a i ʻole nā ​​​​url me ka hiki ke hoʻohālikelike ʻia, hiki ke lawe ʻia nā ʻikepili mai nā kahua jsonData a secureJsonData (no ka mālama ʻana i nā huaʻōlelo a i ʻole nā ​​​​hōʻailona ma ke ʻano i hoʻopili ʻia). I kā mākou laʻana, nā nīnau like /__proxy/api/v1/namespaces e hoʻopili ʻia i ka url o ka palapala
/api/v8/namespaces me ka Mana: Ke poʻo poʻomanaʻo.

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ma keʻano maʻamau, e hana me ka k8s api server pono mākou i kahi mea hoʻohana me ka heluhelu wale nō, nā hōʻike no ka hana ʻana i hiki iā ʻoe ke loaʻa ma hoʻopili kumu kumu.

Mahele 5: hoʻokuʻu

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

Ke kākau ʻoe i kāu plugin Grafana ponoʻī, makemake maoli ʻoe e hoʻolaha i ka lehulehu. Ma Grafana he waihona kēia o nā plugins i loaʻa ma aneʻi grafana.com/grafana/plugins

I mea e loaʻa ai kāu plugin ma ka hale kūʻai kūhelu, pono ʻoe e hana i kahi PR i loko keia waihonama ka hoʻohui ʻana i nā ʻike e like me kēia i ka faila repo.json:

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

kahi o ka mana o kāu plugin, url he loulou i ka waihona, a ʻo commit ka hash o ka commit e loaʻa ai kahi mana kikoʻī o ka plugin.

A ma ka hopena e ʻike ʻoe i kahi kiʻi nani e like me:

Ka hoʻomohala ʻana i kahi plugin no Grafana: kahi moʻolelo o nā kiʻi nui

E hopu ʻia ka ʻikepili no ia mea mai kāu Readme.md, Changelog.md a me ka plugin.json file me ka wehewehe plugin.

Mahele 6: ma kahi o nā hopena

ʻAʻole mākou i ho'ōki i ka hoʻomohala ʻana i kā mākou plugin ma hope o ka hoʻokuʻu ʻana. A i kēia manawa ke hana nei mākou i ka nānā pono ʻana i ka hoʻohana ʻana i nā kumuwaiwai o nā nodes cluster, e hoʻolauna ana i nā hiʻohiʻona hou e hoʻomaikaʻi ai i ka UX, a me ka ʻohi ʻana i ka nui o nā manaʻo i loaʻa ma hope o ka hoʻokomo ʻana i ka plugin e kā mākou mea kūʻai aku a mai nā poʻe ma GitHub (inā haʻalele ʻoe. kou pilikia a huki noi paha, e hauʻoli nui wau :)

Manaʻo mākou e kōkua kēia ʻatikala iā ʻoe e hoʻomaopopo i kahi mea hana kupanaha e like me Grafana a, malia paha, e kākau i kāu plugin ponoʻī.

Mahalo iā ʻoe!)

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka