Сайн уу! Хэдэн сарын өмнө бид нээлттэй эхийн шинэ төсөл болох кубернетийг хянах Графана залгаасыг үйлдвэрлэлд нэвтрүүлсэн.
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 файл байх ёстой: нэр, хувилбар, залгаасын төрөл, репозитор/сайт/лицензийн холбоос, хамаарал гэх мэт.
модуль.ц
plugin.json
Дэлгэцийн зургаас харж байгаагаар бид plugin.type = програмыг зааж өгсөн. Учир нь Grafana-д зориулсан залгаасууд гурван төрлийн байж болно:
самбар: хамгийн түгээмэл төрлийн залгаас - энэ нь янз бүрийн хяналтын самбарыг бүтээхэд ашигладаг аливаа хэмжүүрийг дүрслэн харуулах самбар юм.
мэдээллийн эх сурвалж: зарим мэдээллийн эх үүсвэрт залгаас холбогч (жишээ нь, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
програм: Grafana дотор өөрийн гэсэн урд талын програмыг бүтээх, өөрийн html хуудас үүсгэх, янз бүрийн өгөгдлийг дүрслэхийн тулд өгөгдлийн эх үүсвэрт гараар хандах боломжийг олгодог залгаас. Мөн бусад төрлийн залгаасууд (өгөгдлийн эх сурвалж, самбар) болон төрөл бүрийн хяналтын самбаруудыг хамаарал болгон ашиглаж болно.
Type=app-тай залгаас хамаарлын жишээ.
Та JavaScript болон TypeScript хоёрыг програмчлалын хэл болгон ашиглаж болно (бид үүнийг сонгосон). Та ямар ч төрлийн сайн уу ертөнцийн залгаасуудын бэлтгэл
2-р хэсэг: орон нутгийн орчныг бэлтгэх
Залгаас дээр ажиллахын тулд бидэнд урьдчилан суулгасан бүх хэрэгслүүдтэй kubernetes кластер хэрэгтэй: 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-р хэсэг: бодит хөгжил
Объект загвар
Залгаасыг хэрэгжүүлэх бэлтгэл ажлын хүрээнд бид 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-ийн хамаарлын хэсэгт тайлбарласан болно:
Хуудас бүрийн блок дээр бид ХУУДАСНЫ НЭР-ийг зааж өгөх ёстой (дараа нь энэ хуудсанд хандах боломжтой slug болж хувирах болно); энэ хуудасны ажиллагааг хариуцах бүрэлдэхүүн хэсгийн нэр (бүрдэл хэсгүүдийн жагсаалтыг module.ts руу экспортлосон); Энэ хуудастай ажиллах боломжтой хэрэглэгчийн үүрэг, хажуугийн самбарын навигацийн тохиргоог зааж өгнө.
Хуудасны ажиллагааг хариуцдаг бүрэлдэхүүн хэсэгт бид templateUrl-г тохируулах ёстой бөгөөд тэнд тэмдэглэгээ бүхий html файл руу орох замыг дамжуулна. Хянагч дотроос хамаарлын тарилга хийснээр бид 2 хүртэлх чухал өнцгийн үйлчилгээнд хандах боломжтой:
- backendSrv - Grafana API сервертэй харилцах үйлчилгээ;
- datasourceSrv - таны Grafana-д суулгасан бүх өгөгдлийн эх сурвалжтай орон нутгийн харилцан үйлчлэлийг хангадаг үйлчилгээ (жишээ нь .getAll() арга - суулгасан бүх өгөгдлийн эх сурвалжуудын жагсаалтыг буцаана; .get( ) - тодорхой мэдээллийн эх сурвалжийн жишээ объектыг буцаана.
4-р хэсэг: мэдээллийн эх сурвалж
Графанагийн үүднээс авч үзвэл өгөгдлийн эх сурвалж нь бусадтай яг адилхан залгаас юм: энэ нь өөрийн гэсэн модуль.js нэвтрэх цэгтэй, plugin.json мета мэдээллийн файлтай. Төрөл = апп-тай залгаасыг хөгжүүлэхдээ бид одоо байгаа мэдээллийн эх үүсвэрүүд (жишээ нь, prometheus-datasource) болон өөрсдийнхөө аль алинтай нь харилцаж болох бөгөөд тэдгээрийг залгаасын санд (dist/datasource/*) шууд хадгалах эсвэл хамаарал болгон суулгах боломжтой. Манай тохиолдолд өгөгдлийн эх үүсвэр нь залгаас кодтой ирдэг. Мөн config.html загвар болон ConfigCtrl хянагчтай байх шаардлагатай бөгөөд энэ нь өгөгдлийн эх үүсвэрийн жишээний тохиргооны хуудас болон таны өгөгдлийн эх үүсвэрийн үйлдлийн логикийг хэрэгжүүлдэг Datasource хянагчтай байх шаардлагатай.
KubeGraf залгаасын хувьд хэрэглэгчийн интерфэйсийн үүднээс авч үзвэл өгөгдлийн эх үүсвэр нь дараах боломжуудыг хэрэгжүүлдэг kubernetes кластер юм (эх кодыг ашиглах боломжтой)
- k8s api-серверээс өгөгдөл цуглуулах (нэрийн зай, байршуулалтын жагсаалтыг авах...)
- prometheus-өгөгдлийн эх сурвалж руу (тодорхой кластер бүрийн залгаасын тохиргоонд сонгосон) прокси хийх хүсэлтүүд болон статик хуудас болон хяналтын самбарт өгөгдлийг ашиглахын тулд форматлах хариултууд.
- статик залгаасын хуудсууд дээрх өгөгдлийг шинэчлэх (тогтоосон сэргээх хурдтай).
- grafana-хяналтын самбарт загвар хуудас үүсгэхийн тулд асуулга боловсруулах (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 болон баталгаажуулалт/зөвшөөрлийн үндсэн тохиргоог зааж өгч болно: нэвтрэх-нууц үг, эсвэл клиент-серт/клиент-түлхүүр. Хамгаалагч токен (k8-ийн дефакто стандарт) ашиглан хандалтыг тохируулах чадварыг хэрэгжүүлэхийн тулд бид бага зэрэг засвар хийх шаардлагатай болсон.
Энэ асуудлыг шийдэхийн тулд та суулгасан Grafana "Plugin Routes" механизмыг ашиглаж болно (дэлгэрэнгүй мэдээллийг эндээс авна уу.
/api/v8/ Зөвшөөрөлтэй нэрийн орон зай: Bearer толгой.
Мэдээжийн хэрэг, k8s api сервертэй ажиллахын тулд бидэнд зөвхөн унших эрхтэй хэрэглэгч хэрэгтэй бөгөөд манифест үүсгэх боломжтой.
5-р хэсэг: суллах
Та өөрийн Grafana залгаасыг бичсэнийхээ дараа үүнийг олон нийтэд нээлттэй болгохыг хүсэх нь ойлгомжтой. Grafana-д энэ нь энд байгаа залгаасуудын номын сан юм
Таны залгаасыг албан ёсны дэлгүүрт авахын тулд та PR хийх хэрэгтэй
хувилбар нь таны залгаасын хувилбар, url нь репозиторын холбоос, commit нь залгаасын тодорхой хувилбарыг ашиглах боломжтой амлалтын хэш юм.
Гаралт дээр та гайхалтай зургийг харах болно:
Үүний өгөгдлийг таны Readme.md, Changelog.md болон залгаасын тайлбар бүхий plugin.json файлаас автоматаар татаж авах болно.
6-р хэсэг: Дүгнэлтийн оронд
Гарсны дараа бид нэмэлт өргөтгөлөө хөгжүүлэхээ зогсоосонгүй. Одоо бид кластер зангилааны нөөцийн ашиглалтыг зөв хянах, UX-ийг сайжруулах шинэ боломжуудыг нэвтрүүлэх, мөн залгаасыг суулгасны дараа үйлчлүүлэгчид болон GitHub дээрх хүмүүсээс хүлээн авсан их хэмжээний санал хүсэлтийг авахаар ажиллаж байна (хэрэв та орхих юм бол). Таны асуудал эсвэл татах хүсэлт, би маш их баяртай байх болно :)
Энэ нийтлэл нь Grafana гэх мэт гайхалтай хэрэгслийг ойлгох, магадгүй өөрийн залгаасыг бичихэд тусална гэж найдаж байна.
Баярлалаа танд!)
Эх сурвалж: www.habr.com