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.
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.
module.ts
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.
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
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
ʻ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:
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ʻī.
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.
- 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)
- 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
/api/v8/namespaces me ka Mana: Ke poʻo poʻomanaʻo.
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
Mahele 5: hoʻokuʻu
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
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
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:
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