Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Баарына салам! Бир нече ай мурун биз жаңы ачык булактуу долбоорубузду - кубернеттерди көзөмөлдөө үчүн Grafana плагинин ишке киргиздик. DevOpsProdigy KubeGraf. Плагиндин булак коду бул жерден жеткиликтүү GitHubдагы коомдук репозиторий. Жана бул макалада биз сиз менен плагинди кантип жаратканыбыз, кандай куралдарды колдонгонубуз жана иштеп чыгуу процессинде кандай тузактарга туш болгонубуз тууралуу айтып бергибиз келет. Кеттик!

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 файлы болушу керек: аты, версиясы, плагин түрү, репозиторийге/сайтка/лицензияга шилтемелер, көз карандылыктар жана башкалар.

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы
модуль.ц

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы
plugin.json

Скриншоттон көрүнүп тургандай, биз plugin.type = колдонмосун көрсөттүк. Анткени Grafana үчүн плагиндер үч түрдүү болушу мүмкүн:

панели: плагиндин эң кеңири таралган түрү - бул ар кандай көрсөткүчтөрдү визуалдаштыруу үчүн панель, ар кандай панелдерди куруу үчүн колдонулат.
маалымат булагы: кээ бир маалымат булагына плагин туташтыргычы (мисалы, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
колдонмо: Grafana ичинде өзүңүздүн фронталдык тиркемеңизди түзүүгө, өзүңүздүн html баракчаларыңызды түзүүгө жана ар кандай маалыматтарды визуалдаштыруу үчүн маалымат булагына кол менен кирүүгө мүмкүндүк берген плагин. Ошондой эле, башка типтеги плагиндер (маалымат булагы, панель) жана ар кандай панелдер көз карандылык катары колдонулушу мүмкүн.

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы
Type=app менен плагин көз карандылыктарынын мисалы.

Сиз программалоо тили катары JavaScript жана TypeScript экөөнү тең колдоно аласыз (биз аны тандадык). Сиз каалаган түрдөгү салам дүйнө плагиндерине даярдыктар шилтеме аркылуу табуу: бул репозиторийде алдын ала орнотулган жана конфигурацияланган куруучулары бар көп сандагы башталгыч топтомдор камтылган (React-те плагиндин эксперименталдык мисалы да бар).

2-бөлүк: жергиликтүү чөйрөнү даярдоо

Плагинде иштөө үчүн, албетте, алдын ала орнотулган бардык куралдары бар kubernetes кластери керек: prometheus, node-exporter, kube-state-metrics, grafana. Айлана-чөйрөнү тез, оңой жана табигый түрдө орнотуу керек жана ысык кайра жүктөөнү камсыз кылуу үчүн Grafana маалымат каталогу түз иштеп чыгуучунун машинасынан орнотулушу керек.

Биздин оюбузча, кубернет менен жергиликтүү иштөөнүн эң ыңгайлуу жолу minikube. Кийинки кадам - ​​prometheus-оператордун жардамы менен Prometheus + Grafana айкалышын орнотуу. IN Бул макала minikube боюнча prometheus-оператор орнотуу жараяны майда-чүйдөсүнө чейин сүрөттөлгөн. Туруктуулукту иштетүү үчүн, сиз параметрди коюшуңуз керек туруктуулук: чын 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-бөлүк: реалдуу өнүгүү

Объект модели

Плагинди ишке ашырууга даярдануу учурунда биз 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 сайтында сүрөттөлөт:

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Ар бир барак үчүн блокто биз БАРАКТЫН АТЫ н көрсөтүшүбүз керек (андан кийин ал бул баракка кирүү мүмкүнчүлүгүнө ээ болгон слугга айланат); бул баракчанын иштеши үчүн жооптуу компоненттин аталышы (компоненттердин тизмеси module.ts сайтына экспорттолот); Бул барак менен иштөө мүмкүн болгон колдонуучунун ролун жана каптал тилкесинин навигация орнотууларын көрсөтүү.

Барактын иштеши үчүн жооптуу компонентте биз templateUrl орнотуубуз керек, ал жерге белгилөө менен html файлына жолду өткөрүп. Контроллердин ичинде көз карандылык инъекциясы аркылуу биз 2 маанилүү бурчтук кызматка чейин кире алабыз:

  • backendSrv - Grafana API сервери менен өз ара аракеттенүүнү камсыз кылган кызмат;
  • datasourceSrv - Grafanaда орнотулган бардык маалымат булактары менен жергиликтүү өз ара аракеттенүүнү камсыз кылган кызмат (мисалы, .getAll() ыкмасы - бардык орнотулган маалымат булактарынын тизмесин кайтарат; .get( ) - белгилүү бир маалымат булагынын инстанция объектисин кайтарат.

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

4-бөлүк: маалымат булагы

Grafana көз карашы боюнча, маалымат булагы башкалардын бардыгы сыяктуу эле плагин: анын module.js кирүү чекити бар, мета маалыматы бар файл бар plugin.json. Тири = колдонмосу бар плагинди иштеп чыгууда биз учурдагы маалымат булактары (мисалы, prometheus-datasource) жана өзүбүздүн маалымат булактары менен иштеше алабыз, аларды түздөн-түз плагин каталогунда (dist/datasource/*) сактай алабыз же көз карандылык катары орното алабыз. Биздин учурда, маалымат булагы плагин коду менен келет. Ошондой эле маалымат булагынын инстанциясынын конфигурация барагы жана маалымат булагыңыздын логикасын ишке ашырган маалымат булагы контроллери үчүн колдонула турган config.html үлгүсү жана ConfigCtrl контроллери болушу керек.

KubeGraf плагининде, колдонуучу интерфейсинин көз карашынан алганда, маалымат булагы төмөнкү мүмкүнчүлүктөрдү ишке ашырган kubernetes кластеринин бир мисалы (булак коду жеткиликтүү байланыш):

  • k8s api-серверинен маалыматтарды чогултуу (ат мейкиндиктеринин, жайылтуулардын тизмесин алуу...)
  • prometheus-маалымат булагы (ар бир конкреттүү кластер үчүн плагин жөндөөлөрүндө тандалган) үчүн прокси суроо-талаптарды жана статикалык баракчалардагы жана башкаруу панелдериндеги маалыматтарды колдонуу үчүн жоопторду форматтоо.
  • статикалык плагин беттеринде маалыматтарды жаңыртуу (белгиленген жаңылоо ылдамдыгы менен).
  • графана-башкарма такталарында шаблон барагын түзүү үчүн сурамдарды иштетүү (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 колдоно алабыз. Бул компонентти колдонуу менен, биз url жана негизги аутентификация/авторизация орнотууларын көрсөтүү менен http маалымат булагына кирүү мүмкүнчүлүгүн конфигурациялай алабыз: логин-пароль, же клиент-серт/клиент-ачкычы. Жеткирүү белгисин (k8s үчүн де-факто стандарты) колдонуу менен конфигурациялоо мүмкүнчүлүгүн ишке ашыруу үчүн биз бир аз оңдоп-түзөөгө туура келди.

Бул көйгөйдү чечүү үчүн, сиз орнотулган Grafana "Plugin Routes" механизмин колдонсоңуз болот (толугураак маалымат бул жерде расмий документ баракчасы). Биздин маалымат булагыбыздын жөндөөлөрүндө биз grafana прокси сервери тарабынан иштетиле турган маршруттук эрежелердин топтомун жарыялай алабыз. Мисалы, ар бир жеке акыркы чекит үчүн шаблондоо мүмкүнчүлүгү бар аталыштарды же URL даректерин коюуга болот, алар үчүн маалыматтар jsonData жана securityJsonData талааларынан алынышы мүмкүн (паролдорду же токендерди шифрленген түрдө сактоо үчүн). Биздин мисалда, сыяктуу суроолор /__proxy/api/v1/namespaces форманын url дарегине прокси болот
/api/v8/namespaces авторизациясы менен: алып жүрүүчү аталышы.

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Албетте, k8s api сервери менен иштөө үчүн бизге окуу үчүн гана мүмкүнчүлүгү бар колдонуучу керек, аны түзүү үчүн манифесттерди сиз да таба аласыз. плагин булак коду.

5-бөлүк: чыгаруу

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Өзүңүздүн Grafana плагиниңизди жазгандан кийин, аны жалпыга жеткиликтүү кылууну каалайсыз. Grafana-да бул бул жерде жеткиликтүү плагиндердин китепканасы grafana.com/grafana/plugins

Сиздин плагин расмий дүкөндө жеткиликтүү болушу үчүн, сиз пиар жасашыңыз керек бул репозиторийrepo.json файлына ушул сыяктуу мазмунду кошуу менен:

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

бул жерде версия сиздин плагиниңиздин версиясы, url - репозиторийге шилтеме, ал эми commit - плагиндин белгилүү бир версиясы жеткиликтүү боло турган милдеттенменин хэши.

Ал эми жыйынтыкта ​​сиз сонун сүрөттү көрөсүз:

Grafana үчүн плагинди иштеп чыгуу: чоң кадрлардын тарыхы

Анын маалыматтары автоматтык түрдө Readme.md, Changelog.md жана плагин сүрөттөмөсү менен plugin.json файлынан алынат.

6-бөлүк: корутундулардын ордуна

Чыгарылгандан кийин плагинибизди иштеп чыгууну токтоткон жокпуз. Эми биз кластердик түйүндөрдүн ресурстарын туура колдонуунун үстүндө иштеп жатабыз, UX өркүндөтүү үчүн жаңы функцияларды киргизип жатабыз, ошондой эле плагинди орноткондон кийин кардарларыбыздан да, GitHub'дагы адамдардан да (эгерде сиз кетип калсаңыз) көп сандагы пикирлерди чогултуп жатабыз. Сиздин маселеңиз же тартуу өтүнүчүңүз, мен абдан кубанычтамын :)

Бул макала сизге Grafana сыяктуу сонун куралды түшүнүүгө жана, балким, өзүңүздүн плагиниңизди жазууга жардам берет деп үмүттөнөбүз.

Рахмат!)

Source: www.habr.com

Комментарий кошуу