Баарына салам! Бир нече ай мурун биз жаңы ачык булактуу долбоорубузду - кубернеттерди көзөмөлдөө үчүн Grafana плагинин ишке киргиздик.
0-бөлүк - киришүү: биз бул деңгээлге кантип жеттик?
Grafan үчүн өзүбүздүн плагинибизди жазуу идеясы бизге кокусунан келди. Биздин компания 10 жылдан ашык убакыттан бери ар кандай татаалдыктагы веб-долбоорлорго мониторинг жүргүзүп келет. Бул убакыттын ичинде биз ар кандай мониторинг системаларын колдонуу боюнча көп сандагы тажрыйбаларды, кызыктуу учурларды жана тажрыйба топтодук. Жана кайсы бир учурда биз өзүбүзгө суроо бердик: "Кубернетеске мониторинг жүргүзүү үчүн сыйкырдуу курал барбы, алар айткандай, "аны коюп, унутуп калгыла"?".. Албетте, k8s мониторингинин тармактык стандарты эчак эле Prometheus + Grafana айкалышы. Жана бул стек үчүн даяр чечимдер катары ар кандай куралдардын чоң топтому бар: prometheus-operator, kubernetes-mixin панелдеринин топтому, grafana-kubernetes-app.
grafana-kubernetes-app плагини биз үчүн эң кызыктуу вариант болуп көрүндү, бирок ал бир жылдан ашык убакыттан бери колдоого алынган эмес жана андан тышкары, түйүн-экспорттордун жана kube-state-метрикалардын жаңы версиялары менен иштей албайт. Анан кандайдыр бир учурда: "Биз өзүбүз чечим чыгарбашыбыз керекпи?"
Плагинибизде кандай идеяларды ишке ашырууну чечтик:
- “колдонмо картасынын” визуализациясы: аттар мейкиндиктери, жайылтуулар боюнча топтоштурулган кластердеги тиркемелерди ыңгайлуу көрсөтүү;
- "жайгаштыруу - кызмат (+порттор)" сыяктуу байланыштардын визуализациясы.
- кластердик тиркемелерди кластердик түйүндөр боюнча бөлүштүрүүнү визуализациялоо.
- бир нече булактардан алынган метрика жана маалымат чогултуу: Prometheus жана k8s api сервери.
- инфраструктуралык бөлүгүнө да (процессордун убактысын, эстутумун, дисктин подсистемасын, тармакты пайдалануу) жана колдонмо логикасына мониторинг жүргүзүү - ден соолук абалынын подкасттары, колдо болгон репликалардын саны, жандуу/даярдык тесттеринен өтүү жөнүндө маалымат.
1-бөлүк: "Grafana плагини" деген эмне?
Техникалык көз караштан алганда, Grafana плагини Grafana маалымат каталогунда сакталган бурчтук контроллер (/var/grafana/plugins/ /dist/module.js) жана SystemJS модулу катары жүктөөгө болот. Ошондой эле бул каталогдо сиздин плагиңиз тууралуу бардык мета маалымат камтылган plugin.json файлы болушу керек: аты, версиясы, плагин түрү, репозиторийге/сайтка/лицензияга шилтемелер, көз карандылыктар жана башкалар.
модуль.ц
plugin.json
Скриншоттон көрүнүп тургандай, биз plugin.type = колдонмосун көрсөттүк. Анткени Grafana үчүн плагиндер үч түрдүү болушу мүмкүн:
панели: плагиндин эң кеңири таралган түрү - бул ар кандай көрсөткүчтөрдү визуалдаштыруу үчүн панель, ар кандай панелдерди куруу үчүн колдонулат.
маалымат булагы: кээ бир маалымат булагына плагин туташтыргычы (мисалы, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
колдонмо: Grafana ичинде өзүңүздүн фронталдык тиркемеңизди түзүүгө, өзүңүздүн html баракчаларыңызды түзүүгө жана ар кандай маалыматтарды визуалдаштыруу үчүн маалымат булагына кол менен кирүүгө мүмкүндүк берген плагин. Ошондой эле, башка типтеги плагиндер (маалымат булагы, панель) жана ар кандай панелдер көз карандылык катары колдонулушу мүмкүн.
Type=app менен плагин көз карандылыктарынын мисалы.
Сиз программалоо тили катары JavaScript жана TypeScript экөөнү тең колдоно аласыз (биз аны тандадык). Сиз каалаган түрдөгү салам дүйнө плагиндерине даярдыктар
2-бөлүк: жергиликтүү чөйрөнү даярдоо
Плагинде иштөө үчүн, албетте, алдын ала орнотулган бардык куралдары бар kubernetes кластери керек: prometheus, node-exporter, kube-state-metrics, grafana. Айлана-чөйрөнү тез, оңой жана табигый түрдө орнотуу керек жана ысык кайра жүктөөнү камсыз кылуу үчүн Grafana маалымат каталогу түз иштеп чыгуучунун машинасынан орнотулушу керек.
Биздин оюбузча, кубернет менен жергиликтүү иштөөнүн эң ыңгайлуу жолу
Биздин акыркы minikube ишке киргизүү скрипт төмөнкүдөй көрүнөт:
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-бөлүк: реалдуу өнүгүү
Объект модели
Плагинди ишке ашырууга даярдануу учурунда биз TypeScript класстары түрүндө иштей турган бардык негизги Kubernetes объекттерин сүрөттөп берүүнү чечтик: pod, deployment, demonset, statefulset, job, cronjob, service, node, namespace. Бул класстардын ар бири жалпы BaseModel классынан мураска алынат, ал конструкторду, деструкторду, көрүү мүмкүнчүлүгүн жаңыртуу жана которуу ыкмаларын сүрөттөйт. Класстардын ар бири башка объектилер менен уяланган мамилелерди сүрөттөйт, мисалы, жайылтуу түрүндөгү объект үчүн поддондордун тизмеси.
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 = [];
}
}
Алуучулардын жана орнотуучулардын жардамы менен биз керектүү объекттин көрсөткүчтөрүн ыңгайлуу жана окула турган формада көрсөтө алабыз. Мисалы, бөлүштүрүлүүчү CPU түйүндөрүнүн форматталган чыгарылышы:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
барактар
Биздин бардык плагин барактарынын тизмеси алгач көз карандылыктар бөлүмүндөгү pluing.json сайтында сүрөттөлөт:
Ар бир барак үчүн блокто биз БАРАКТЫН АТЫ н көрсөтүшүбүз керек (андан кийин ал бул баракка кирүү мүмкүнчүлүгүнө ээ болгон слугга айланат); бул баракчанын иштеши үчүн жооптуу компоненттин аталышы (компоненттердин тизмеси module.ts сайтына экспорттолот); Бул барак менен иштөө мүмкүн болгон колдонуучунун ролун жана каптал тилкесинин навигация орнотууларын көрсөтүү.
Барактын иштеши үчүн жооптуу компонентте биз templateUrl орнотуубуз керек, ал жерге белгилөө менен html файлына жолду өткөрүп. Контроллердин ичинде көз карандылык инъекциясы аркылуу биз 2 маанилүү бурчтук кызматка чейин кире алабыз:
- backendSrv - Grafana API сервери менен өз ара аракеттенүүнү камсыз кылган кызмат;
- datasourceSrv - Grafanaда орнотулган бардык маалымат булактары менен жергиликтүү өз ара аракеттенүүнү камсыз кылган кызмат (мисалы, .getAll() ыкмасы - бардык орнотулган маалымат булактарынын тизмесин кайтарат; .get( ) - белгилүү бир маалымат булагынын инстанция объектисин кайтарат.
4-бөлүк: маалымат булагы
Grafana көз карашы боюнча, маалымат булагы башкалардын бардыгы сыяктуу эле плагин: анын module.js кирүү чекити бар, мета маалыматы бар файл бар plugin.json. Тири = колдонмосу бар плагинди иштеп чыгууда биз учурдагы маалымат булактары (мисалы, prometheus-datasource) жана өзүбүздүн маалымат булактары менен иштеше алабыз, аларды түздөн-түз плагин каталогунда (dist/datasource/*) сактай алабыз же көз карандылык катары орното алабыз. Биздин учурда, маалымат булагы плагин коду менен келет. Ошондой эле маалымат булагынын инстанциясынын конфигурация барагы жана маалымат булагыңыздын логикасын ишке ашырган маалымат булагы контроллери үчүн колдонула турган config.html үлгүсү жана ConfigCtrl контроллери болушу керек.
KubeGraf плагининде, колдонуучу интерфейсинин көз карашынан алганда, маалымат булагы төмөнкү мүмкүнчүлүктөрдү ишке ашырган kubernetes кластеринин бир мисалы (булак коду жеткиликтүү
- k8s api-серверинен маалыматтарды чогултуу (ат мейкиндиктеринин, жайылтуулардын тизмесин алуу...)
- prometheus-маалымат булагы (ар бир конкреттүү кластер үчүн плагин жөндөөлөрүндө тандалган) үчүн прокси суроо-талаптарды жана статикалык баракчалардагы жана башкаруу панелдериндеги маалыматтарды колдонуу үчүн жоопторду форматтоо.
- статикалык плагин беттеринде маалыматтарды жаңыртуу (белгиленген жаңылоо ылдамдыгы менен).
- графана-башкарма такталарында шаблон барагын түзүү үчүн сурамдарды иштетүү (metriFindQuery() ыкмасы)
- акыркы 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"};
})
}
Өзүнчө кызыктуу жагдай, биздин оюбузча, маалымат булагы үчүн аутентификация жана авторизация механизмин ишке ашыруу болуп саналат. Адатта, кутудан тышкары, биз акыркы маалымат булагына кирүү мүмкүнчүлүгүн конфигурациялоо үчүн орнотулган Grafana компоненти datasourceHttpSettings колдоно алабыз. Бул компонентти колдонуу менен, биз url жана негизги аутентификация/авторизация орнотууларын көрсөтүү менен http маалымат булагына кирүү мүмкүнчүлүгүн конфигурациялай алабыз: логин-пароль, же клиент-серт/клиент-ачкычы. Жеткирүү белгисин (k8s үчүн де-факто стандарты) колдонуу менен конфигурациялоо мүмкүнчүлүгүн ишке ашыруу үчүн биз бир аз оңдоп-түзөөгө туура келди.
Бул көйгөйдү чечүү үчүн, сиз орнотулган Grafana "Plugin Routes" механизмин колдонсоңуз болот (толугураак маалымат бул жерде
/api/v8/namespaces авторизациясы менен: алып жүрүүчү аталышы.
Албетте, k8s api сервери менен иштөө үчүн бизге окуу үчүн гана мүмкүнчүлүгү бар колдонуучу керек, аны түзүү үчүн манифесттерди сиз да таба аласыз.
5-бөлүк: чыгаруу
Өзүңүздүн Grafana плагиниңизди жазгандан кийин, аны жалпыга жеткиликтүү кылууну каалайсыз. Grafana-да бул бул жерде жеткиликтүү плагиндердин китепканасы
Сиздин плагин расмий дүкөндө жеткиликтүү болушу үчүн, сиз пиар жасашыңыз керек
бул жерде версия сиздин плагиниңиздин версиясы, url - репозиторийге шилтеме, ал эми commit - плагиндин белгилүү бир версиясы жеткиликтүү боло турган милдеттенменин хэши.
Ал эми жыйынтыкта сиз сонун сүрөттү көрөсүз:
Анын маалыматтары автоматтык түрдө Readme.md, Changelog.md жана плагин сүрөттөмөсү менен plugin.json файлынан алынат.
6-бөлүк: корутундулардын ордуна
Чыгарылгандан кийин плагинибизди иштеп чыгууну токтоткон жокпуз. Эми биз кластердик түйүндөрдүн ресурстарын туура колдонуунун үстүндө иштеп жатабыз, UX өркүндөтүү үчүн жаңы функцияларды киргизип жатабыз, ошондой эле плагинди орноткондон кийин кардарларыбыздан да, GitHub'дагы адамдардан да (эгерде сиз кетип калсаңыз) көп сандагы пикирлерди чогултуп жатабыз. Сиздин маселеңиз же тартуу өтүнүчүңүз, мен абдан кубанычтамын :)
Бул макала сизге Grafana сыяктуу сонун куралды түшүнүүгө жана, балким, өзүңүздүн плагиниңизди жазууга жардам берет деп үмүттөнөбүз.
Рахмат!)
Source: www.habr.com