Таҳияи плагин барои Grafana: таърихи аксҳои калон

Салом ба ҳама! Чанд моҳ пеш, мо лоиҳаи нави сарчашмаи кушодаи худро дар истеҳсолот оғоз кардем - плагини Grafana барои мониторинги кубернетҳо, ки мо онро номида будем. DevOpsProdigy KubeGraf. Рамзи сарчашмаи плагин дар ин ҷо дастрас аст анбори ҷамъиятӣ дар GitHub. Ва дар ин мақола мо мехоҳем бо шумо нақл кунем, ки мо плагинро чӣ гуна сохтаем, кадом асбобҳоро истифода мебарем ва дар ҷараёни таҳия бо кадом домҳо дучор шудем. Рафтем!

Қисми 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 мавҷуд бошад, ки дорои ҳама маълумоти мета дар бораи плагини шумо мебошад: ном, версия, навъи плагин, истинодҳо ба анбор/сайт/литсензия, вобастагӣ ва ғайра.

Таҳияи плагин барои Grafana: таърихи аксҳои калон
module.ts

Таҳияи плагин барои Grafana: таърихи аксҳои калон
plugin.json

Тавре ки шумо дар скриншот мебинед, мо plugin.type = барномаро муайян кардем. Зеро плагинҳо барои Grafana метавонанд се намуд бошанд:

панел: намуди маъмултарини плагин - он панел барои визуализатсияи ҳама гуна ченакҳо мебошад, ки барои сохтани панелҳои гуногун истифода мешавад.
манбаи маълумот: пайвасткунаки плагин ба баъзе манбаи маълумот (масалан, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
барнома: Васлкунак, ки ба шумо имкон медиҳад, ки замимаи пешинаи худро дар дохили Grafana созед, саҳифаҳои html-и худро созед ва ба манбаи маълумот дастӣ дастрасӣ пайдо кунед, то маълумоти гуногунро визуалӣ кунед. Инчунин, плагинҳои намудҳои дигар (манбаи маълумот, панел) ва панелҳои гуногун метавонанд ҳамчун вобастагӣ истифода шаванд.

Таҳияи плагин барои Grafana: таърихи аксҳои калон
Намунаи вобастагии плагинҳо бо type=app.

Шумо метавонед ҳам JavaScript ва ҳам TypeScript ҳамчун забони барномасозӣ истифода баред (мо онро интихоб кардем). Омодагӣ барои плагинҳои ҷаҳонии ҳама гуна намуди шумо метавонед пайвандро пайдо кунед: ин анбор дорои шумораи зиёди бастаҳои ибтидоӣ мебошад (ҳатто як мисоли таҷрибавии плагин дар React вуҷуд дорад) бо бинокорони пешакӣ насбшуда ва танзимшуда.

Қисми 2: омодасозии муҳити маҳаллӣ

Барои кор дар плагин, ба мо табиатан кластери кубернетҳо лозим аст, ки дорои ҳама абзорҳои қаблан насбшуда: prometheus, node-exporter, kube-state-metrics, grafana. Муҳити зист бояд зуд, ба осонӣ ва табиӣ танзим карда шавад ва барои аз нав боркунии гарм, феҳристи маълумотҳои Grafana бояд мустақиман аз мошини таҳиякунанда насб карда шавад.

Роҳи аз ҳама мувофиқ, ба андешаи мо, кор бо кубернетҳо дар маҳал аст миникуб. Қадами навбатӣ насб кардани комбинатсияи Prometheus + Grafana бо истифода аз prometheus-operator мебошад. ДАР Ин мақола Раванди насби прометей-оператор дар minikube муфассал тасвир шудааст. Барои фаъол кардани устуворӣ, шумо бояд параметрро муқаррар кунед устуворӣ: дуруст дар файли charts/grafana/values.yaml, PV ва PVC-и худро илова кунед ва онҳоро дар параметри persistence.existingClaim муайян кунед

Скрипти ниҳоии оғози 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 дар бахши вобастагӣ тасвир шудааст:

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Дар блоки ҳар як саҳифа мо бояд НОМИ САХИФА-ро нишон диҳем (баъдан он ба slug табдил дода мешавад, ки тавассути он ин саҳифа дастрас мешавад); номи ҷузъе, ки барои кори ин саҳифа масъул аст (рӯйхати ҷузъҳо ба module.ts содир карда мешавад); бо нишон додани нақши корбар, ки барои он кор бо ин саҳифа дастрас аст ва танзимоти паймоиш барои панели паҳлӯ.

Дар ҷузъе, ки барои кори саҳифа масъул аст, мо бояд templateUrl-ро насб кунем ва ба он ҷо роҳ ба файли html бо аломатгузорӣ гузарем. Дар дохили контроллер, тавассути тазриқи вобастагӣ, мо метавонем то 2 хидмати муҳими кунҷӣ дастрас кунем:

  • backendSrv - хидмате, ки ҳамкорӣ бо сервери Grafana API-ро таъмин мекунад;
  • datasourceSrv - хидмате, ки ҳамкории маҳаллиро бо ҳамаи манобеи додаҳои дар Grafana насбшуда таъмин мекунад (масалан, усули .getAll() - рӯйхати ҳамаи манбаъҳои насбшудаи маълумотро бармегардонад; .get( ) - объекти мисоли манбаи маълумотро бармегардонад.

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Қисми 4: манбаи маълумот

Аз нуқтаи назари Grafana, манбаи додаҳо маҳз як плагини дигар аст: он дорои модули вуруди худро дорад.js, файл бо мета-маълумот plugin.json мавҷуд аст. Ҳангоми таҳияи плагин бо type = барнома, мо метавонем ҳам бо манбаъҳои мавҷудаи додаҳо (масалан, prometheus-datasource) ва ҳам худамон, ки мо метавонем онҳоро мустақиман дар директорияи плагинҳо (dist/datasource/*) нигоҳ дорем ё ҳамчун вобастагӣ насб кунем. Дар ҳолати мо, манбаи маълумот бо рамзи плагин меояд. Инчунин дорои қолаби config.html ва контролери ConfigCtrl лозим аст, ки барои саҳифаи конфигуратсияи мисоли манбаи додаҳо ва контролери манбаи додаҳо, ки мантиқи манбаи додаҳои шуморо амалӣ мекунад, истифода мешавад.

Дар плагини KubeGraf, аз нуқтаи назари интерфейси корбар, манбаи маълумот як намунаи кластери kubernetes мебошад, ки қобилиятҳои зеринро амалӣ мекунад (рамзи манбаъ дастрас аст пайванд):

  • ҷамъоварии маълумот аз api-сервери k8s (гирифтани рӯйхати фазоҳои номҳо, ҷойгиркунӣ ...)
  • дархостҳои прокси ба prometheus-datasource (ки дар танзимоти плагин барои ҳар як кластери мушаххас интихоб карда мешавад) ва форматкунии посухҳо барои истифодаи маълумот ҳам дар саҳифаҳои статикӣ ва ҳам дар панелҳои идоракунӣ.
  • навсозии маълумот дар саҳифаҳои плагинҳои статикӣ (бо суръати муқарраршудаи навсозӣ).
  • коркарди дархостҳо барои тавлиди варақи шаблон дар панелҳои графана (методи metriFindQuery())

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Таҳияи плагин барои Grafana: таърихи аксҳои калон

  • санҷиши пайвастшавӣ бо кластери ниҳоӣ 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" -ро истифода баред (тафсилоти бештар дар саҳифаи расмии ҳуҷҷатҳо). Дар танзимоти манбаи додаҳои мо, мо метавонем маҷмӯи қоидаҳои масирро эълон кунем, ки аз ҷониби сервери прокси графана коркард карда мешаванд. Масалан, барои ҳар як нуқтаи ниҳоии инфиродӣ мумкин аст сарлавҳаҳо ё URL-ҳо бо имкони шаблонсозӣ муқаррар карда шаванд, ки маълумотро аз майдонҳои jsonData ва securityJsonData гирифтан мумкин аст (барои нигоҳ доштани парол ё нишонаҳо дар шакли рамзгузорӣ). Дар мисоли мо, дархостҳо ба монанди /__proxy/api/v1/namespaces ба URL-и форма прокси карда мешавад
/api/v8/namespaces бо Авторизатсия: Сарлавҳаи баранда.

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Табиист, ки барои кор бо сервери api k8s ба мо корбаре лозим аст, ки дастрасии танҳо барои хондан дорад, манифест барои эҷод, ки шумо инчунин метавонед дар он пайдо кунед. рамзи сарчашмаи плагин.

Қисми 5: озод кардан

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Пас аз он ки шумо плагини Grafana-и худро навиштед, шумо табиатан мехоҳед, ки онро дастраси омма гардонед. Дар Grafana ин китобхонаи плагинҳост, ки дар ин ҷо дастрасанд grafana.com/grafana/plugins

Барои он ки плагини шумо дар мағозаи расмӣ дастрас бошад, шумо бояд дар PR кор кунед ин анборбо илова кардани мундариҷаи монанди ин ба файли repo.json:

Таҳияи плагин барои Grafana: таърихи аксҳои калон

ки версия версияи плагини шумост, url истинод ба анбор аст ва commit хэши ӯҳдадорӣ мебошад, ки барои он версияи мушаххаси плагин дастрас хоҳад буд.

Ва дар баромад шумо тасвири аҷиберо хоҳед дид, ба монанди:

Таҳияи плагин барои Grafana: таърихи аксҳои калон

Маълумот барои он ба таври худкор аз Readme.md, Changelog.md ва файли plugin.json бо тавсифи плагин гирифта мешавад.

Қисми 6: ба ҷои хулосаҳо

Мо пас аз баромадан аз таҳияи плагини худ даст накашидем. Ва ҳоло мо дар бораи мониторинги дурусти истифодаи захираҳои гиреҳҳои кластерӣ, ҷорӣ кардани хусусиятҳои нав барои беҳтар кардани UX кор карда истодаем ва инчунин миқдори зиёди фикру мулоҳизаҳоеро, ки пас аз насб кардани плагин ҳам аз ҷониби мизоҷони мо ва ҳам аз одамони GitHub гирифта шудаанд (агар шумо тарк кунед) кор карда истодаем. масъалаи шумо ё дархости шумо, ман хеле хушҳолам :)

Умедворем, ки ин мақола ба шумо дар фаҳмидани чунин асбоби олиҷаноб ба мисли Grafana ва шояд плагини шахсии худро нависед.

Сипос!)

Манбаъ: will.com

Илова Эзоҳ