Hammaga salom! Bir necha oy oldin biz yangi ochiq manbali loyihamizni - kubernetlarni kuzatish uchun Grafana plaginini ishga tushirdik.
0-qism - kirish: bu nuqtaga qanday etib keldik?
Grafan uchun o'z plaginimizni yozish g'oyasi bizga tasodifan paydo bo'ldi. Bizning kompaniyamiz 10 yildan ortiq vaqt davomida turli darajadagi murakkablikdagi veb-loyihalarni kuzatib boradi. Shu vaqt ichida biz turli xil monitoring tizimlaridan foydalanish bo'yicha katta miqdordagi tajriba, qiziqarli holatlar va tajriba to'pladik. Va bir lahzada biz o'zimizga savol berdik: "Kubernetesni kuzatish uchun sehrli vosita bormi, ular aytganidek, "uni o'rnating va unuting"?.. Albatta, k8 monitoringi uchun sanoat standarti uzoq vaqtdan beri mavjud bo'lib kelgan Prometey + Grafana kombinatsiyasi. Va bu stek uchun tayyor echimlar sifatida turli xil vositalarning katta to'plami mavjud: prometey-operator, kubernetlar-mixin asboblar paneli to'plami, grafana-kubernetes-ilovasi.
Grana-kubernetes-ilova plagini biz uchun eng qiziqarli variant bo'lib tuyuldi, lekin u bir yildan ortiq vaqt davomida qo'llab-quvvatlanmaydi va bundan tashqari, tugun-eksportchi va kube-state-metriklarining yangi versiyalari bilan ishlay olmaydi. Va bir nuqtada biz qaror qildik: "O'zimiz qaror qabul qilmasligimiz kerakmi?"
Plaginimizda qanday g'oyalarni amalga oshirishga qaror qildik:
- "ilovalar xaritasi" ning vizualizatsiyasi: klasterdagi ilovalarni nomlar bo'shliqlari, joylashtirishlar bo'yicha guruhlangan qulay taqdimoti ...;
- "joylashtirish - xizmat (+portlar)" kabi ulanishlarni vizuallashtirish.
- klaster ilovalarining klaster tugunlari bo'yicha taqsimlanishini vizualizatsiya qilish.
- bir nechta manbalardan olingan ko'rsatkichlar va ma'lumotlar to'plami: Prometey va k8s api serveri.
- infratuzilma qismini (protsessor vaqti, xotira, disk quyi tizimi, tarmoqdan foydalanish) va dastur mantig'ini kuzatish - sog'liq holati podslari, mavjud replikalar soni, jonlilik/tayyorlik testlaridan o'tish haqidagi ma'lumotlar.
1-qism: "Grafana plagini" nima?
Texnik nuqtai nazardan, Grafana plaginlari Grafana ma'lumotlar katalogida saqlanadigan burchak boshqaruvchisidir (/var/grafana/plugins/ /dist/module.js) va SystemJS moduli sifatida yuklanishi mumkin. Shuningdek, ushbu katalogda plaginingiz haqidagi barcha meta-ma'lumotlarni o'z ichiga olgan plugin.json fayli bo'lishi kerak: ism, versiya, plagin turi, ombor/sayt/litsenziyaga havolalar, bog'liqliklar va boshqalar.
modul.ts
plugin.json
Skrinshotda ko'rib turganingizdek, biz plugin.type = ilovasini ko'rsatdik. Chunki Grafana uchun plaginlar uch xil bo'lishi mumkin:
panel: plaginning eng keng tarqalgan turi - bu har qanday ko'rsatkichlarni vizualizatsiya qilish uchun panel bo'lib, turli xil asboblar panelini yaratish uchun ishlatiladi.
ma'lumotlar manbai: ba'zi ma'lumotlar manbalariga plagin ulagichi (masalan, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
ilova: Grafana ichida oʻz old ilovangizni yaratish, oʻz HTML sahifalaringizni yaratish va turli maʼlumotlarni vizuallashtirish uchun maʼlumotlar manbasiga qoʻlda kirish imkonini beruvchi plagin. Bundan tashqari, boshqa turdagi plaginlar (ma'lumotlar manbai, panel) va turli xil asboblar paneli qaramlik sifatida ishlatilishi mumkin.
Type=app bilan plagin bog'liqliklariga misol.
Siz dasturlash tili sifatida JavaScript va TypeScript dan foydalanishingiz mumkin (biz uni tanladik). Har qanday turdagi salom dunyo plaginlari uchun tayyorgarlik
2-qism: mahalliy muhitni tayyorlash
Plagin ustida ishlash uchun bizga tabiiy ravishda barcha oldindan o'rnatilgan asboblarga ega kubernetlar klasteri kerak: prometey, node-exporter, kube-state-metrikalar, grafana. Atrof-muhit tez, oson va tabiiy ravishda sozlanishi va issiq qayta yuklanishini ta'minlash uchun Grafana ma'lumotlar katalogini to'g'ridan-to'g'ri ishlab chiquvchining mashinasidan o'rnatish kerak.
Bizning fikrimizcha, kubernetlar bilan mahalliy ishlashning eng qulay usuli
Bizning yakuniy minikube ishga tushirish skriptimiz quyidagicha ko'rinadi:
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-qism: haqiqiy rivojlanish
Ob'ekt modeli
Plaginni amalga oshirishga tayyorgarlik ko'rish jarayonida biz TypeScript sinflari ko'rinishida ishlaydigan barcha asosiy Kubernetes ob'ektlarini tavsiflashga qaror qildik: pod, deployment, demonset, statefulset, job, cronjob, service, node, namespace. Ushbu sinflarning har biri umumiy BaseModel sinfidan meros bo'lib, konstruktor, destruktor, ko'rinishni yangilash va almashtirish usullarini tavsiflaydi. Sinflarning har biri boshqa ob'ektlar bilan ichki o'rnatilgan munosabatlarni tavsiflaydi, masalan, joylashtirish turidagi ob'ekt uchun podlar ro'yxati.
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 = [];
}
}
Qabul qiluvchilar va sozlagichlar yordamida biz o'zimizga kerakli ob'ekt ko'rsatkichlarini qulay va o'qiladigan shaklda ko'rsatishimiz yoki o'rnatishimiz mumkin. Masalan, ajratiladigan protsessor tugunlarining formatlangan chiqishi:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
sahifalar
Barcha plagin sahifalarimiz ro'yxati dastlab bog'liqliklar bo'limidagi pluing.json da tasvirlangan:
Har bir sahifa uchun blokda biz SAHIFA NOMIni ko'rsatishimiz kerak (keyin u ushbu sahifaga kirish mumkin bo'lgan slugga aylanadi); ushbu sahifaning ishlashi uchun mas'ul bo'lgan komponentning nomi (komponentlar ro'yxati module.ts ga eksport qilinadi); bu sahifa bilan ishlash mumkin bo'lgan foydalanuvchi rolini va yon panel uchun navigatsiya sozlamalarini ko'rsatadi.
Sahifaning ishlashi uchun mas'ul bo'lgan komponentda biz templateUrl ni o'rnatishimiz kerak, u erda markirovka bilan html fayliga yo'l o'tkazamiz. Tekshirgich ichida, qaramlik in'ektsiyasi orqali biz 2 tagacha muhim burchak xizmatlaridan foydalanishimiz mumkin:
- backendSrv - Grafana API serveri bilan o'zaro aloqani ta'minlovchi xizmat;
- datasourceSrv - Grafana-da o'rnatilgan barcha ma'lumotlar manbalari bilan mahalliy o'zaro aloqani ta'minlaydigan xizmat (masalan, .getAll() usuli - barcha o'rnatilgan ma'lumotlar manbalari ro'yxatini qaytaradi; .get( ) - ma'lum bir ma'lumot manbasining namuna ob'ektini qaytaradi.
4-qism: ma'lumotlar manbai
Grafana nuqtai nazaridan, ma'lumotlar manbasi boshqalar bilan bir xil plagindir: uning modul.js o'z kirish nuqtasi bor, plagin.json meta-ma'lumotli fayl mavjud. Type = ilovali plaginni ishlab chiqishda biz mavjud maʼlumotlar manbalari (masalan, prometheus-datasource) va oʻzimizning maʼlumotlar manbalari bilan oʻzaro aloqada boʻlishimiz mumkin, ularni toʻgʻridan-toʻgʻri plagin katalogida (dist/datasource/*) saqlashimiz yoki bogʻliqlik sifatida oʻrnatishimiz mumkin. Bizning holatda, ma'lumotlar manbai plagin kodi bilan birga keladi. Shuningdek, config.html shabloniga va ConfigCtrl tekshirgichiga ega bo'lish kerak, ular ma'lumotlar manbasi namunasi konfiguratsiya sahifasi va ma'lumotlar manbangizning ishlash mantiqini amalga oshiradigan ma'lumotlar manbasi tekshirgichi uchun ishlatiladi.
KubeGraf plaginida, foydalanuvchi interfeysi nuqtai nazaridan, ma'lumotlar manbai quyidagi imkoniyatlarni amalga oshiradigan kubernetes klasterining namunasidir (manba kodi mavjud)
- k8s api-serveridan ma'lumotlarni yig'ish (nom bo'shliqlari ro'yxatini olish, joylashtirish ...)
- prometheus-ma'lumotlar manbasiga proksi-server so'rovlari (bu har bir maxsus klaster uchun plagin sozlamalarida tanlangan) va statik sahifalarda va asboblar panelida ma'lumotlardan foydalanish uchun javoblarni formatlash.
- statik plagin sahifalarida ma'lumotlarni yangilash (belgilangan yangilash tezligi bilan).
- grafana boshqaruv panelida shablon varag'ini yaratish uchun so'rovlarni qayta ishlash (metriFindQuery() usuli)
- yakuniy k8s klasteri bilan ulanish testi.
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"};
})
}
Alohida qiziqarli nuqta, bizning fikrimizcha, ma'lumotlar manbai uchun autentifikatsiya va avtorizatsiya mexanizmini amalga oshirishdir. Odatda, biz yakuniy ma'lumotlar manbasiga kirishni sozlash uchun o'rnatilgan Grafana komponentining datasourceHttpSettings-dan foydalanishimiz mumkin. Ushbu komponentdan foydalanib, biz url va asosiy autentifikatsiya/avtorizatsiya sozlamalarini belgilash orqali http ma'lumotlar manbasiga kirishni sozlashimiz mumkin: login-parol yoki mijoz-sertifikat/mijoz-kalit. Tashuvchi token (k8s uchun de-fakto standarti) yordamida kirishni sozlash qobiliyatini amalga oshirish uchun biz biroz sozlashimiz kerak edi.
Ushbu muammoni hal qilish uchun siz o'rnatilgan Grafana "Plugin Routes" mexanizmidan foydalanishingiz mumkin (batafsilroq:
Avtorizatsiya bilan /api/v8/namespaces: Tashuvchi sarlavhasi.
Tabiiyki, k8s api serveri bilan ishlash uchun bizga faqat o'qish uchun ruxsatga ega foydalanuvchi kerak, uni yaratish uchun manifestlarni ham topishingiz mumkin.
5-qism: chiqarish
O'zingizning Grafana plaginingizni yozganingizdan so'ng, uni hamma uchun ochiq qilishni xohlaysiz. Grafana'da bu plaginlar kutubxonasi bu yerda mavjud
Plaginingiz rasmiy do'konda mavjud bo'lishi uchun siz PR qilishingiz kerak
bu erda versiya plaginingizning versiyasi, url - omborga havola va commit - plaginning ma'lum bir versiyasi mavjud bo'lgan majburiyat xeshi.
Va chiqishda siz ajoyib rasmni ko'rasiz:
Uning ma'lumotlari avtomatik ravishda Readme.md, Changelog.md va plagin tavsifi bilan plugin.json faylidan olinadi.
6-qism: xulosalar o'rniga
Chiqarilganidan keyin biz plaginimizni ishlab chiqishni to'xtatmadik. Va endi biz klaster tugunlari resurslaridan to'g'ri foydalanishni monitoring qilish, UX-ni yaxshilash uchun yangi xususiyatlarni joriy qilish, shuningdek, plaginni o'rnatgandan so'ng mijozlarimiz va GitHub foydalanuvchilari tomonidan olingan ko'plab fikr-mulohazalarni olish ustida ishlamoqdamiz (agar siz tark etsangiz). Sizning muammoingiz yoki tortishish so'rovingiz, men juda xursand bo'laman :)
Umid qilamizki, ushbu maqola Grafana kabi ajoyib vositani tushunishga yordam beradi va, ehtimol, o'z plaginingizni yozing.
Rahmat!)
Manba: www.habr.com