Jambo kila mtu! Miezi michache iliyopita, tulizindua mradi wetu mpya wa chanzo huria, programu-jalizi ya Grafana ya ufuatiliaji wa Kubernetes, katika uzalishaji. Msimbo wa chanzo cha programu-jalizi unapatikana ndani Katika makala haya, tungependa kushiriki nawe hadithi ya jinsi tulivyounda programu-jalizi, zana tulizotumia, na mitego tuliyokumbana nayo wakati wa utayarishaji. Hebu tuanze!
Sehemu ya 0 - Utangulizi: Tulifikaje hapa?
Wazo la kuandika programu-jalizi yetu wenyewe kwa Grafana lilikuja kwetu kwa bahati. Kampuni yetu imekuwa ikifuatilia miradi ya wavuti ya ugumu tofauti kwa zaidi ya miaka 10. Katika wakati huu, tumekusanya wingi wa utaalamu, tafiti za kuvutia na uzoefu wa kutumia mifumo mbalimbali ya ufuatiliaji. Wakati fulani, tulijiuliza: "Je, kuna zana ya kichawi ya kufuatilia Kubernetes ambayo unaweza, kama wanasema, 'kuiweka na kuisahau,'"? Kwa kawaida, mchanganyiko wa Prometheus + Grafana kwa muda mrefu imekuwa kiwango cha sekta ya ufuatiliaji wa K8S. Kuna anuwai ya zana zilizotengenezwa tayari za rafu hii, ikijumuisha prometheus-operator, suite ya dashibodi ya kubernetes-mixin, na programu ya grafana-kubernetes.
Programu-jalizi ya grafana-kubernetes-programu ilionekana kuwa chaguo la kuvutia zaidi kwetu, lakini haijaauniwa kwa zaidi ya mwaka mmoja na, zaidi ya hayo, haifanyi kazi na matoleo mapya ya nodi-exporter na kube-state-metrics. Wakati fulani, tuliamua, "Kwa nini tusitengeneze suluhisho letu?"
Ni mawazo gani tuliamua kutekeleza katika programu-jalizi yetu?
- Taswira ya ramani ya programu: uwakilishi unaofaa wa programu katika kundi, iliyopangwa kwa nafasi za majina, kupelekwa, n.k.;
- taswira ya viunganisho vya aina "kupeleka - huduma (+bandari)".
- taswira ya usambazaji wa programu za nguzo kwenye nodi za nguzo.
- kukusanya vipimo na taarifa kutoka kwa vyanzo vingi: Prometheus na seva ya k8s api.
- Ufuatiliaji wa miundombinu yote miwili (matumizi ya muda wa CPU, kumbukumbu, mfumo mdogo wa diski, mtandao) na mantiki ya programu—hali ya afya ya maganda, idadi ya nakala zinazopatikana, na taarifa kuhusu maendeleo ya majaribio ya uhai/utayari.
Sehemu ya 1: Programu-jalizi ya Grafana ni nini?
Kwa mtazamo wa kiufundi, programu-jalizi ya Grafana ni kidhibiti cha angular ambacho kimehifadhiwa kwenye saraka ya data ya Grafana (/var/grafana/plugins/ /dist/module.js) na inaweza kupakiwa kama moduli ya SystemJS. Saraka hii inapaswa pia kuwa na faili ya plugin.json, ambayo ina metadata yote kuhusu programu-jalizi yako: jina, toleo, aina ya programu-jalizi, hazina/viungo vya tovuti/leseni, vitegemezi, na kadhalika.

moduli.ts

plugin.json
Kama unavyoona kwenye picha ya skrini, tulibainisha plugin.type = programu. Hii ni kwa sababu kuna aina tatu za programu-jalizi za Grafana:
jopo: aina ya kawaida ya programu-jalizi - ni paneli ya kuibua vipimo fulani na hutumiwa kuunda dashibodi mbalimbali.
chanzo cha data: kiunganishi cha programu-jalizi kwa chanzo chochote cha data (kwa mfano, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
programu: Programu-jalizi inayokuruhusu kuunda programu yako ya mbele ndani ya Grafana, unda kurasa zako za HTML, na ufikie mwenyewe chanzo cha data ili kuibua data mbalimbali. Aina zingine za programu-jalizi (chanzo cha data, paneli) na dashibodi mbalimbali pia zinaweza kutumika kama vitegemezi.

Mfano wa utegemezi wa programu-jalizi na aina = programu.
Unaweza kutumia JavaScript au TypeScript kama lugha ya programu (tulichagua TypeScript). Unaweza kuunda violezo vya aina yoyote ya programu-jalizi ya hello-world. : Hifadhi hii ina idadi kubwa ya vifurushi vya kuanza (kuna hata mfano wa majaribio wa programu-jalizi ya React) yenye vijenzi vilivyosakinishwa awali na vilivyosanidiwa.
Sehemu ya 2: Kutayarisha Mazingira ya Eneo
Ili kufanya kazi kwenye programu-jalizi, kwa kawaida tutahitaji kundi la Kubernetes lenye zana zote zilizosakinishwa awali: prometheus, nodi-exporter, kube-state-metrics, na grafana. Mazingira yanapaswa kuwa ya haraka, rahisi, na bila shida kusanidi, na ili kuhakikisha kuwa inapakia upya, saraka ya data ya Grafana inapaswa kupachikwa moja kwa moja kutoka kwa mashine ya msanidi.
Kwa maoni yetu, njia rahisi zaidi ya kufanya kazi ndani ya nchi na Kubernetes ni Hatua inayofuata ni kusakinisha kifungu cha Prometheus + Grafana kwa kutumia prometheus-operator. Mchakato wa kusanidi prometheus-operator kwenye minikube umeelezewa kwa undani. Ili kuwezesha kuendelea, unahitaji kuweka parameter kuendelea: kweli Katika faili ya charts/grafana/values.yaml, ongeza PV na PVC yako na uzibainishe katika kigezo cha persistence.existingClaim.
Hati yetu ya mwisho ya uzinduzi wa minikube inaonekana kama hii:
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.LSehemu ya 3: Ukuzaji wa moja kwa moja
Mfano wa kitu
Katika kujiandaa kwa ajili ya utekelezaji wa programu-jalizi, tuliamua kufafanua huluki zote za msingi za Kubernetes tutakuwa tukifanya kazi nazo kama madarasa ya TypeScript: pod, uwekaji, daemoset, statefulset, job, cronjob, service, nodi, na namespace. Kila moja ya madarasa haya hurithi kutoka kwa darasa la kawaida la BaseModel, ambalo hufafanua mjenzi, mharibifu, na mbinu za kusasisha na kugeuza mwonekano. Kila darasa pia hufafanua uhusiano uliowekwa na vyombo vingine, kama vile orodha ya maganda ya huluki ya kusambaza.
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 = [];
}
}Kwa kutumia vichungi na seti, tunaweza kuonyesha au kuweka vipimo vya huluki unavyotaka katika umbizo linalofaa na linalosomeka. Kwa mfano, matokeo yaliyoumbizwa ya nodi za CPU zinazoweza kugawiwa:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}kuhusiana
Orodha ya kurasa zote za programu-jalizi yetu imeelezewa mwanzoni katika pluing.json yetu katika sehemu ya utegemezi:

Katika kizuizi cha kila ukurasa, lazima tubainishe PAGE NAME (hii itabadilishwa kuwa koa ambayo ukurasa huu utaweza kufikiwa); jina la sehemu inayohusika na uendeshaji wa ukurasa huu (orodha ya vipengele inasafirishwa kwa module.ts); dalili ya jukumu la mtumiaji ambalo kazi yake na ukurasa huu inapatikana na mipangilio ya kusogeza kwa utepe.
Katika sehemu inayohusika na uendeshaji wa ukurasa, lazima tuweke templateUrl, tukipitisha njia ya faili ya HTML iliyo na alama. Ndani ya kidhibiti, kupitia sindano ya utegemezi, tunaweza kufikia huduma mbili muhimu za Angular:
- backendSrv ni huduma ambayo hutoa mwingiliano na seva ya API ya Grafana;
- datasourceSrv ni huduma ambayo hutoa mwingiliano wa ndani na vyanzo vyote vya data vilivyosakinishwa kwenye Grafana yako (kwa mfano, mbinu ya .getAll() hurejesha orodha ya vyanzo vyote vya data vilivyosakinishwa; .get( ) - hurejesha kitu cha mfano cha chanzo maalum cha data.



Sehemu ya 4: Chanzo cha Data
Kwa mtazamo wa Grafana, chanzo cha data ni programu-jalizi kama nyingine yoyote: ina sehemu yake ya kuingilia, module.js, na faili ya plugin.json yenye metadata. Wakati wa kuunda programu-jalizi yenye type = app, tunaweza kuingiliana na vyanzo vya data vilivyopo (kwa mfano, prometheus-datasource) au zetu, ambazo tunaweza kuhifadhi moja kwa moja kwenye saraka ya programu-jalizi (dist/datasource/*) au kusakinisha kama tegemezi. Kwa upande wetu, chanzo cha data kimefungwa na nambari ya programu-jalizi. Pia inahitajika ni kiolezo cha config.html na kidhibiti cha ConfigCtrl, ambacho kitatumika kwa ukurasa wa usanidi wa mfano wa chanzo cha data na kidhibiti cha Datasource, ambacho hutekeleza mantiki ya chanzo chako cha data.
Katika programu-jalizi ya KubeGraf, kutoka kwa mtazamo wa kiolesura cha mtumiaji, chanzo cha data ni mfano wa nguzo ya Kubernetes inayotekeleza uwezo ufuatao (msimbo wa chanzo unapatikana. ):
- kuchota data kutoka kwa seva ya api ya k8s (kupata orodha ya nafasi za majina, upelekaji, n.k.)
- Kutuma maombi kwa hifadhidata ya prometheus (ambayo imechaguliwa katika mipangilio ya programu-jalizi kwa kila kundi mahususi) na uumbizaji wa majibu ya kutumia data katika kurasa tuli na dashibodi.
- kusasisha data kwenye kurasa tuli za programu-jalizi (kwa kiwango kilichowekwa cha kuonyesha upya).
- Inachakata maswali ili kuunda laha ya kiolezo katika dashibodi za grafana (mbinu .metriFindQuery())



- mtihani wa unganisho na nguzo ya mwisho 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"};
})
}Kipengele cha kuvutia hasa, kwa maoni yetu, ni utekelezaji wa utaratibu wa uthibitishaji na uidhinishaji wa chanzo cha data. Kwa kawaida, nje ya kisanduku, tunaweza kutumia sehemu ya Grafana ya datasourceHttpSettings iliyojengewa ndani ili kusanidi ufikiaji wa chanzo cha mwisho cha data. Kwa kipengele hiki, tunaweza kusanidi ufikiaji wa chanzo cha data cha HTTP kwa kubainisha URL na mipangilio ya msingi ya uthibitishaji/uidhinishaji: kuingia/nenosiri, au mteja-cert/msimbo-mteja. Utekelezaji wa uwezo wa kusanidi ufikiaji kwa kutumia tokeni ya mtoaji (kiwango cha ukweli cha k8s) kulihitaji kuchezewa.
Ili kutatua tatizo hili, unaweza kutumia utaratibu wa "Njia za programu-jalizi" iliyojengwa ndani ya Grafana (maelezo zaidi juu ya ) Katika mipangilio yetu ya chanzo cha data, tunaweza kutangaza seti ya sheria za uelekezaji ambazo zitachakatwa na seva mbadala ya grafana. Kwa mfano, kwa kila sehemu ya mwisho ya mtu binafsi, kuna chaguo la kuweka vichwa au URL kwa usaidizi wa violezo, data ambayo inaweza kuchukuliwa kutoka kwa sehemu za jsonData na salamaJsonData (kwa kuhifadhi manenosiri au ishara katika fomu iliyosimbwa). Katika mfano wetu, maombi ya fomu /__proxy/api/v1/namespaces itatumwa kwa URL za aina ifuatayo
/api/v1/namespaces na Uidhinishaji: seti ya kichwa cha mbeba.


Kwa kawaida, kufanya kazi na seva ya k8s api, tunahitaji mtumiaji aliye na ufikiaji wa kusoma tu, maonyesho ya kuunda ambayo unaweza pia kupata ndani. .
Sehemu ya 5: Kutolewa

Mara tu unapoandika programu-jalizi yako ya Grafana, kwa kawaida utataka kuifanya iwe chanzo wazi. Huko Grafana, hii ni maktaba ya programu-jalizi, inayopatikana kwa
Ili programu-jalizi yako ipatikane katika duka rasmi, unahitaji kufanya PR ndani , na kuongeza yaliyomo kama hii kwenye faili ya repo.json:

ambapo toleo ni toleo la programu-jalizi yako, url ndio kiunga cha hazina, na ahadi ni heshi ya ahadi ambayo itafanya toleo maalum la programu-jalizi lipatikane.
Na kwenye pato utaona picha nzuri kama hii:

Data yake itanyakuliwa kiotomatiki kutoka kwa Readme.md, Changelog.md, na faili ya plugin.json yenye maelezo ya programu-jalizi.
Sehemu ya 6: Badala ya hitimisho
Hatujaacha kutengeneza programu-jalizi yetu tangu ilipotolewa. Kwa sasa tunashughulika kufuatilia ipasavyo matumizi ya rasilimali ya nodi za nguzo, kutekeleza vipengele vipya ili kuboresha hali ya utumiaji, na kupanga idadi kubwa ya maoni ambayo tumepokea kutoka kwa wateja wetu na kutoka kwa watumiaji kwenye GitHub baada ya kusakinisha programu-jalizi (ukiacha suala au ombi la kuvuta, nitafurahi sana :)).
Tunatumahi kuwa nakala hii itakusaidia kuelewa zana nzuri kama Grafana na, labda, andika programu-jalizi yako mwenyewe.
Asante!)
Chanzo: mapenzi.com
