Grafana-д зориулсан залгаасын хөгжүүлэлт: том зургуудын түүх

Сайн уу! Хэдэн сарын өмнө бид нээлттэй эхийн шинэ төсөл болох кубернетийг хянах Графана залгаасыг үйлдвэрлэлд нэвтрүүлсэн. DevOpsProdigy KubeGraf. Plugin эх кодыг эндээс авах боломжтой GitHub дээрх нийтийн репозитор. Мөн энэ нийтлэлд бид залгаасыг хэрхэн бүтээсэн, ямар хэрэгсэл ашигласан, хөгжүүлэлтийн явцад ямар бэрхшээл тулгарсан тухай түүхийг хуваалцахыг хүсч байна. Явцгаая!

0-р хэсэг - танилцуулга: бид яаж ийм байдалд хүрсэн бэ?

Графанд зориулж өөрийн залгаасыг бичих санаа бидэнд санамсаргүй байдлаар ирсэн. Манай компани 10 гаруй жилийн турш янз бүрийн түвшний нарийн төвөгтэй вэб төслүүдэд хяналт тавьж ирсэн. Энэ хугацаанд бид янз бүрийн хяналтын системийг ашиглах асар их туршлага, сонирхолтой тохиолдлууд, туршлага хуримтлуулсан. Хэзээ нэгэн цагт бид өөрөөсөө асуусан: "Кубернетесийг хянах шидэт хэрэгсэл байдаг уу, тэгвэл тэдний хэлснээр "түүнийг тохируулаад мартчих". Прометей + Графана хослол. Энэхүү стекийн бэлэн шийдлүүдийн хувьд олон төрлийн хэрэгслүүд байдаг: prometheus-operator, kubernetes-mixin хяналтын самбар, grafana-kubernetes-app.

Grana-kubernetes-app залгаас нь бидний хувьд хамгийн сонирхолтой сонголт мэт санагдаж байсан ч энэ нь нэг жилээс илүү хугацаанд дэмжигдээгүй бөгөөд үүнээс гадна node-exporter болон kube-state-meterics-ийн шинэ хувилбаруудтай ажиллах боломжгүй юм. Тэгээд бид хэзээ нэгэн цагт: "Бид өөрсдөө шийдвэр гаргах ёстой биш үү?"

Бид залгаас дээрээ ямар санаануудыг хэрэгжүүлэхээр шийдсэн:

  • "хэрэглээний газрын зураг" -ын дүрслэл: кластер дахь програмуудыг нэрийн орон зай, байршуулалтаар бүлэглэсэн тохиромжтой танилцуулга;
  • "байрлуулах - үйлчилгээ (+ портууд)" гэх мэт холболтуудын дүрслэл.
  • кластерийн зангилаанууд дахь кластер програмуудын тархалтыг дүрслэн харуулах.
  • Хэд хэдэн эх сурвалжаас авсан хэмжүүр, мэдээллийн цуглуулга: Prometheus болон k8s api сервер.
  • дэд бүтцийн хэсэг (CPU-ийн цаг, санах ой, дискний дэд систем, сүлжээний хэрэглээ) болон хэрэглээний логикийн аль алиных нь хяналт - эрүүл мэндийн төлөвийн хонхорцог, боломжтой хуулбарын тоо, амьдрах чадвар/бэлэн байдлын тестийг давсан тухай мэдээлэл.

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 мэдээллийн санг хөгжүүлэгчийн машинаас шууд холбох хэрэгтэй.

Бидний бодлоор кубернетуудтай орон нутагт ажиллах хамгийн тохиромжтой арга юм minikube. Дараагийн алхам бол prometheus-operator ашиглан Prometheus + Grafana хослолыг суулгах явдал юм. IN энэ нийтлэл Minikube дээр prometheus-operator суулгах үйл явцыг дэлгэрэнгүй тайлбарласан болно. Тогтвортой байдлыг идэвхжүүлэхийн тулд та параметрийг тохируулах ёстой тууштай байдал: үнэн 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 анги хэлбэрээр ажиллах Кубернетес бүх үндсэн байгууллагуудыг тайлбарлахаар шийдсэн: pod, deployment, demonset, statefulset, job, cronjob, service, node, namespace. Эдгээр анги бүр нь үүсгэгч, устгагч, харагдах байдлыг шинэчлэх, солих аргуудыг тодорхойлсон нийтлэг BaseModel ангиас удамшдаг. Анги тус бүр нь бусад аж ахуйн нэгжүүдтэй үүрлэсэн харилцааг тайлбарладаг, тухайлбал, байршуулалтын төрлийн аж ахуйн нэгжийн pods жагсаалт.

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-р хэсэг: мэдээллийн эх сурвалж

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

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

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

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

сэтгэгдэл нэмэх