Салом ба ҳама! Чанд моҳ пеш, мо лоиҳаи нави сарчашмаи кушодаи худро дар истеҳсолот оғоз кардем - плагини Grafana барои мониторинги кубернетҳо, ки мо онро номида будем.
Қисми 0 - муқаддима: чӣ гуна мо ба ин нукта расидем?
Идеяи навиштани плагини шахсии худ барои Grafan ба мо тасодуфан пайдо шуд. Ширкати мо зиёда аз 10 сол аст, ки лоиҳаҳои вебҳои сатҳҳои гуногуни мураккабиро назорат мекунад. Дар ин муддат мо миқдори зиёди таҷриба, ҳолатҳои ҷолиб ва таҷрибаи истифодаи системаҳои гуногуни мониторинг ҷамъ кардем. Ва дар баъзе мавридҳо мо аз худ пурсидем: "Оё асбоби ҷодугарӣ барои мониторинги Кубернетес вуҷуд дорад, то чунон ки мегӯянд, "инро насб кунед ва фаромӯш кунед"?".. Стандарти саноатӣ барои мониторинги k8s, албатта, кайҳост. Прометей + комбинатсияи Графана. Ва ҳамчун ҳалли омода барои ин стек, маҷмӯи васеи навъҳои гуногуни асбобҳо мавҷуданд: prometheus-operator, маҷмӯи панелҳои kubernetes-mixin, grafana-kubernetes-app.
Васлкунаки grafana-kubernetes-app барои мо ҷолибтарин вариант ба назар мерасид, аммо он зиёда аз як сол дастгирӣ намешавад ва илова бар ин, бо версияҳои нави node-exporter ва kube-state-metrics кор карда наметавонад. Ва дар як лаҳза мо тасмим гирифтем: "Оё мо набояд худамон тасмим гирем?"
Кадом ғояҳоро мо тасмим гирифтем, ки дар плагини худ татбиқ кунем:
- визуализатсияи "харитаи барномаҳо": муаррифии қулайи барномаҳо дар кластер, ки аз рӯи фазоҳои номҳо гурӯҳбандӣ шудаанд, ҷойгиркунӣ...;
- визуализатсияи пайвастагиҳо ба монанди "ҷойгиркунӣ - хидмат (+портҳо)".
- визуализатсияи тақсимоти замимаҳои кластер дар гиреҳҳои кластер.
- ҷамъоварии метрика ва маълумот аз якчанд манбаъҳо: Prometheus ва k8s api сервер.
- мониторинги ҳам қисми инфрасохтор (истифодаи вақти CPU, хотира, зерсистемаи диск, шабака) ва мантиқи барнома - подкҳои ҳолати саломатӣ, шумораи репликаҳои дастрас, маълумот дар бораи гузаштани санҷишҳои зинда/тайёрӣ.
Қисми 1: "Васлкунаки Grafana" чист?
Аз нуқтаи назари техникӣ, плагин барои Grafana як контролери кунҷӣ мебошад, ки дар феҳристи маълумотҳои Grafana нигоҳ дошта мешавад (/var/grafana/plugins/ /dist/module.js) ва ҳамчун модули SystemJS бор кардан мумкин аст. Инчунин дар ин феҳрист бояд файли plugin.json мавҷуд бошад, ки дорои ҳама маълумоти мета дар бораи плагини шумо мебошад: ном, версия, навъи плагин, истинодҳо ба анбор/сайт/литсензия, вобастагӣ ва ғайра.
module.ts
plugin.json
Тавре ки шумо дар скриншот мебинед, мо plugin.type = барномаро муайян кардем. Зеро плагинҳо барои Grafana метавонанд се намуд бошанд:
панел: намуди маъмултарини плагин - он панел барои визуализатсияи ҳама гуна ченакҳо мебошад, ки барои сохтани панелҳои гуногун истифода мешавад.
манбаи маълумот: пайвасткунаки плагин ба баъзе манбаи маълумот (масалан, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
барнома: Васлкунак, ки ба шумо имкон медиҳад, ки замимаи пешинаи худро дар дохили Grafana созед, саҳифаҳои html-и худро созед ва ба манбаи маълумот дастӣ дастрасӣ пайдо кунед, то маълумоти гуногунро визуалӣ кунед. Инчунин, плагинҳои намудҳои дигар (манбаи маълумот, панел) ва панелҳои гуногун метавонанд ҳамчун вобастагӣ истифода шаванд.
Намунаи вобастагии плагинҳо бо type=app.
Шумо метавонед ҳам JavaScript ва ҳам TypeScript ҳамчун забони барномасозӣ истифода баред (мо онро интихоб кардем). Омодагӣ барои плагинҳои ҷаҳонии ҳама гуна намуди шумо метавонед
Қисми 2: омодасозии муҳити маҳаллӣ
Барои кор дар плагин, ба мо табиатан кластери кубернетҳо лозим аст, ки дорои ҳама абзорҳои қаблан насбшуда: 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: рушди воқеӣ
Модели объект
Ҳангоми омодагӣ ба татбиқи плагин, мо тасмим гирифтем, ки ҳамаи объектҳои асосии Kubernetes-ро тавсиф кунем, ки бо онҳо дар шакли синфҳои TypeScript кор хоҳем кард: pod, deployment, demonset, statefulset, job, cronjob, service, node, space name. Ҳар яке аз ин синфҳо аз синфи умумии 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 дар бахши вобастагӣ тасвир шудааст:
Дар блоки ҳар як саҳифа мо бояд НОМИ САХИФА-ро нишон диҳем (баъдан он ба slug табдил дода мешавад, ки тавассути он ин саҳифа дастрас мешавад); номи ҷузъе, ки барои кори ин саҳифа масъул аст (рӯйхати ҷузъҳо ба module.ts содир карда мешавад); бо нишон додани нақши корбар, ки барои он кор бо ин саҳифа дастрас аст ва танзимоти паймоиш барои панели паҳлӯ.
Дар ҷузъе, ки барои кори саҳифа масъул аст, мо бояд templateUrl-ро насб кунем ва ба он ҷо роҳ ба файли html бо аломатгузорӣ гузарем. Дар дохили контроллер, тавассути тазриқи вобастагӣ, мо метавонем то 2 хидмати муҳими кунҷӣ дастрас кунем:
- backendSrv - хидмате, ки ҳамкорӣ бо сервери Grafana API-ро таъмин мекунад;
- datasourceSrv - хидмате, ки ҳамкории маҳаллиро бо ҳамаи манобеи додаҳои дар Grafana насбшуда таъмин мекунад (масалан, усули .getAll() - рӯйхати ҳамаи манбаъҳои насбшудаи маълумотро бармегардонад; .get( ) - объекти мисоли манбаи маълумотро бармегардонад.
Қисми 4: манбаи маълумот
Аз нуқтаи назари Grafana, манбаи додаҳо маҳз як плагини дигар аст: он дорои модули вуруди худро дорад.js, файл бо мета-маълумот plugin.json мавҷуд аст. Ҳангоми таҳияи плагин бо type = барнома, мо метавонем ҳам бо манбаъҳои мавҷудаи додаҳо (масалан, prometheus-datasource) ва ҳам худамон, ки мо метавонем онҳоро мустақиман дар директорияи плагинҳо (dist/datasource/*) нигоҳ дорем ё ҳамчун вобастагӣ насб кунем. Дар ҳолати мо, манбаи маълумот бо рамзи плагин меояд. Инчунин дорои қолаби config.html ва контролери ConfigCtrl лозим аст, ки барои саҳифаи конфигуратсияи мисоли манбаи додаҳо ва контролери манбаи додаҳо, ки мантиқи манбаи додаҳои шуморо амалӣ мекунад, истифода мешавад.
Дар плагини KubeGraf, аз нуқтаи назари интерфейси корбар, манбаи маълумот як намунаи кластери kubernetes мебошад, ки қобилиятҳои зеринро амалӣ мекунад (рамзи манбаъ дастрас аст
- ҷамъоварии маълумот аз api-сервери k8s (гирифтани рӯйхати фазоҳои номҳо, ҷойгиркунӣ ...)
- дархостҳои прокси ба prometheus-datasource (ки дар танзимоти плагин барои ҳар як кластери мушаххас интихоб карда мешавад) ва форматкунии посухҳо барои истифодаи маълумот ҳам дар саҳифаҳои статикӣ ва ҳам дар панелҳои идоракунӣ.
- навсозии маълумот дар саҳифаҳои плагинҳои статикӣ (бо суръати муқарраршудаи навсозӣ).
- коркарди дархостҳо барои тавлиди варақи шаблон дар панелҳои графана (методи 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-ро барои танзими дастрасӣ ба манбаи ниҳоии маълумот истифода барем. Бо истифода аз ин ҷузъ, мо метавонем дастрасӣ ба манбаи маълумоти http тавассути муайян кардани url ва танзимоти аслии аутентификатсия/авторизатсия: login-password, or client-cert/client-key. Барои амалӣ кардани қобилияти конфигуратсияи дастрасӣ бо истифода аз аломати баранда (стандарти воқеии k8s), ба мо лозим омад, ки каме ислоҳ кунем.
Барои ҳалли ин мушкилот шумо метавонед механизми дарунсохташудаи Grafana "Routes Plugin" -ро истифода баред (тафсилоти бештар дар
/api/v8/namespaces бо Авторизатсия: Сарлавҳаи баранда.
Табиист, ки барои кор бо сервери api k8s ба мо корбаре лозим аст, ки дастрасии танҳо барои хондан дорад, манифест барои эҷод, ки шумо инчунин метавонед дар он пайдо кунед.
Қисми 5: озод кардан
Пас аз он ки шумо плагини Grafana-и худро навиштед, шумо табиатан мехоҳед, ки онро дастраси омма гардонед. Дар Grafana ин китобхонаи плагинҳост, ки дар ин ҷо дастрасанд
Барои он ки плагини шумо дар мағозаи расмӣ дастрас бошад, шумо бояд дар PR кор кунед
ки версия версияи плагини шумост, url истинод ба анбор аст ва commit хэши ӯҳдадорӣ мебошад, ки барои он версияи мушаххаси плагин дастрас хоҳад буд.
Ва дар баромад шумо тасвири аҷиберо хоҳед дид, ба монанди:
Маълумот барои он ба таври худкор аз Readme.md, Changelog.md ва файли plugin.json бо тавсифи плагин гирифта мешавад.
Қисми 6: ба ҷои хулосаҳо
Мо пас аз баромадан аз таҳияи плагини худ даст накашидем. Ва ҳоло мо дар бораи мониторинги дурусти истифодаи захираҳои гиреҳҳои кластерӣ, ҷорӣ кардани хусусиятҳои нав барои беҳтар кардани UX кор карда истодаем ва инчунин миқдори зиёди фикру мулоҳизаҳоеро, ки пас аз насб кардани плагин ҳам аз ҷониби мизоҷони мо ва ҳам аз одамони GitHub гирифта шудаанд (агар шумо тарк кунед) кор карда истодаем. масъалаи шумо ё дархости шумо, ман хеле хушҳолам :)
Умедворем, ки ин мақола ба шумо дар фаҳмидани чунин асбоби олиҷаноб ба мисли Grafana ва шояд плагини шахсии худро нависед.
Сипос!)
Манбаъ: will.com