Grafana плагинін әзірлеу: үлкен кадрлардың тарихы

Бәріңе сәлем! Бірнеше ай бұрын біз жаңа ашық бастапқы жобамызды - кубернеттерді бақылауға арналған Grafana плагинін іске қостық. DevOpsProdigy KubeGraf. Плагиннің бастапқы коды мына жерден қол жетімді GitHub-тағы жалпыға ортақ репозиторий. Осы мақалада біз плагинді қалай жасағанымыз, қандай құралдарды пайдаланғанымыз және әзірлеу барысында қандай қателіктерге тап болғанымыз туралы тарихпен бөліскіміз келеді. Барайық!

0-бөлім – кіріспе: біз бұл деңгейге қалай жеттік?

Grafan үшін жеке плагин жазу идеясы бізге кездейсоқ келді. Біздің компания 10 жылдан астам күрделілік деңгейі әртүрлі веб-жобаларға мониторинг жүргізіп келеді. Осы уақыт ішінде біз әртүрлі бақылау жүйелерін пайдалану бойынша көптеген сараптамалар, қызықты жағдайлар және тәжірибе жинақтадық. Бір кезде біз өзімізден сұрадық: «Кубернеттерді бақылаудың сиқырлы құралы бар ма, олар айтқандай, «оны орнатыңыз және оны ұмытыңыз»?.. K8s мониторингінің салалық стандарты, әрине, бұрыннан бар. Прометей + Графана комбинациясы. Бұл стек үшін дайын шешімдер ретінде әртүрлі құралдардың үлкен жиынтығы бар: прометей-оператор, кубернет-миксин бақылау тақталарының жинағы, grafana-kubernetes-app.

grafana-kubernetes-app плагині біз үшін ең қызықты нұсқа болып көрінді, бірақ оған бір жылдан астам қолдау көрсетілмейді, сонымен қатар түйін-экспорттаушы және kube-state-метрикасының жаңа нұсқаларымен жұмыс істей алмайды. Бір кезде біз: «Шешімді өзіміз қабылдауымыз керек емес пе?» деп шештік.

Плагинімізде қандай идеяларды іске асыруды шештік:

  • «қолданбалар картасының» визуализациясы: аттар кеңістігі, орналастырулар... бойынша топтастырылған кластердегі қолданбаларды ыңғайлы көрсету;
  • «орналастыру - қызмет (+порттар)» сияқты қосылымдарды визуализациялау.
  • кластерлік қосымшалардың кластер түйіндері бойынша таралуын визуализациялау.
  • бірнеше көздерден алынған көрсеткіштер мен ақпарат жинағы: Prometheus және k8s api сервері.
  • инфрақұрылымдық бөлікті де (процессор уақытын, жадты, дискінің ішкі жүйесін, желіні пайдалану) және қолданба логикасын бақылау - денсаулық күйі подкасттары, қолжетімді көшірмелер саны, белсенділік/дайындық сынақтарынан өту туралы ақпарат.

1-бөлім: «Графана плагині» дегеніміз не?

Техникалық тұрғыдан алғанда, 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 деректер каталогын әзірлеушінің машинасынан тікелей орнату керек.

Біздің ойымызша, кубернеттермен жергілікті жұмыс істеудің ең қолайлы жолы миникубе. Келесі қадам - ​​прометей-операторды пайдаланып Prometheus + Grafana комбинациясын орнату. IN Бұл мақала 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-бөлім: нақты даму

Объектілік модель

Плагинді енгізуге дайындық кезінде біз TypeScript сыныптары түрінде жұмыс істейтін барлық негізгі Kubernetes нысандарын сипаттауды шештік: pod, deployment, demonset, statefulset, job, cronjob, service, tode, 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 = [];
   }
}

Қабылдаушылардың және орнатушылардың көмегімен біз қажетті нысан өлшемдерін ыңғайлы және оқылатын пішінде көрсете аламыз немесе орната аламыз. Мысалы, бөлінген процессор түйіндерінің пішімделген шығысы:

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-деректер көзіне (әрбір нақты кластер үшін плагин параметрлерінде таңдалған) прокси сұрауларды және деректерді статикалық беттерде де, бақылау тақталарында да пайдалану үшін пішімдеу жауаптары.
  • статикалық плагин беттеріндегі деректерді жаңарту (белгіленген жаңарту жылдамдығымен).
  • grafana-бақылау тақталарында үлгі парағын жасау үшін сұрауларды өңдеу (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 мекенжайын және негізгі аутентификация/авторизация параметрлерін көрсету арқылы конфигурациялай аламыз: логин-құпия сөз немесе клиент-серт/клиент-кілт. Тасымалдаушы таңбалауышы арқылы қол жеткізуді конфигурациялау мүмкіндігін жүзеге асыру үшін (k8s үшін іс жүзінде стандарт), біз оны аздап өзгертуге тура келді.

Бұл мәселені шешу үшін сіз кірістірілген Grafana «Plugin Routes» механизмін пайдалана аласыз (толығырақ мына жерде ресми құжаттама беті). Деректер көзінің параметрлерінде grafana прокси сервері өңдейтін маршруттау ережелерінің жинағын жариялай аламыз. Мысалы, әрбір жеке соңғы нүкте үшін үлгілеу мүмкіндігі бар тақырыптарды немесе URL мекенжайларын орнатуға болады, олар үшін деректер jsonData және securityJsonData өрістерінен алынуы мүмкін (құпия сөздерді немесе таңбалауыштарды шифрланған пішінде сақтау үшін). Біздің мысалда сұраулар сияқты /__proxy/api/v1/namespaces пішіннің url мекенжайына прокси болады
Авторизациясы бар /api/v8/аттар кеңістігі: Тасымалдаушы тақырыбы.

Grafana плагинін әзірлеу: үлкен кадрлардың тарихы

Grafana плагинін әзірлеу: үлкен кадрлардың тарихы

Әрине, k8s api серверімен жұмыс істеу үшін бізге тек оқуға рұқсаты бар пайдаланушы қажет, оны жасау үшін манифесттерді де таба аласыз. плагиннің бастапқы коды.

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 сияқты тамаша құралды түсінуге және, мүмкін, өзіңіздің плагиніңізді жазуға көмектеседі деп үміттенеміз.

рахмет!)

Ақпарат көзі: www.habr.com

пікір қалдыру