అందరికి వందనాలు! కొన్ని నెలల క్రితం, మేము మా కొత్త ఓపెన్ సోర్స్ ప్రాజెక్ట్ను ఉత్పత్తిలోకి ప్రారంభించాము - మానిటరింగ్ కుబెర్నెట్ల కోసం గ్రాఫానా ప్లగ్ఇన్, దీనిని మేము పిలిచాము
పార్ట్ 0 - ఉపోద్ఘాతం: మనం ఈ స్థితికి ఎలా చేరుకున్నాము?
గ్రాఫన్ కోసం మా స్వంత ప్లగ్ఇన్ రాయాలనే ఆలోచన చాలా ప్రమాదవశాత్తు మాకు వచ్చింది. మా కంపెనీ 10 సంవత్సరాలకు పైగా సంక్లిష్టత యొక్క వివిధ స్థాయిల వెబ్ ప్రాజెక్ట్లను పర్యవేక్షిస్తోంది. ఈ సమయంలో, మేము వివిధ పర్యవేక్షణ వ్యవస్థలను ఉపయోగించడంలో పెద్ద మొత్తంలో నైపుణ్యం, ఆసక్తికరమైన కేసులు మరియు అనుభవాన్ని సేకరించాము. మరియు ఏదో ఒక సమయంలో మనల్ని మనం ఇలా ప్రశ్నించుకున్నాము: “కుబెర్నెట్లను పర్యవేక్షించడానికి ఏదైనా మ్యాజిక్ సాధనం ఉందా, తద్వారా వారు చెప్పినట్లు, “దీన్ని సెట్ చేసి మర్చిపోండి”?”.. k8 లను పర్యవేక్షించడానికి పరిశ్రమ ప్రమాణం చాలా కాలంగా ఉంది. ప్రోమేతియస్ + గ్రాఫానా కలయిక. మరియు ఈ స్టాక్ కోసం రెడీమేడ్ సొల్యూషన్స్గా, వివిధ రకాల టూల్స్ యొక్క పెద్ద సెట్ ఉంది: ప్రోమేథియస్-ఆపరేటర్, కుబెర్నెట్స్-మిక్సిన్ డాష్బోర్డ్ల సెట్, గ్రాఫనా-కుబెర్నెట్స్-యాప్.
Grafana-kubernetes-app ప్లగ్ఇన్ మాకు అత్యంత ఆసక్తికరమైన ఎంపికగా అనిపించింది, కానీ దీనికి ఒక సంవత్సరం కంటే ఎక్కువ కాలం మద్దతు లేదు మరియు నోడ్-ఎగుమతిదారు మరియు kube-state-metrics యొక్క కొత్త వెర్షన్లతో పని చేయడం సాధ్యపడదు. మరియు ఏదో ఒక సమయంలో మేము నిర్ణయించుకున్నాము: "మన స్వంత నిర్ణయం తీసుకోకూడదా?"
మా ప్లగిన్లో ఏ ఆలోచనలను అమలు చేయాలని మేము నిర్ణయించుకున్నాము:
- “అప్లికేషన్ మ్యాప్” యొక్క విజువలైజేషన్: క్లస్టర్లోని అప్లికేషన్ల అనుకూలమైన ప్రదర్శన, నేమ్స్పేస్లు, విస్తరణల ద్వారా సమూహం చేయబడింది...
- “డిప్లాయ్మెంట్ - సర్వీస్ (+పోర్ట్లు)” వంటి కనెక్షన్ల విజువలైజేషన్.
- క్లస్టర్ నోడ్లలో క్లస్టర్ అప్లికేషన్ల పంపిణీ యొక్క విజువలైజేషన్.
- అనేక మూలాల నుండి కొలమానాలు మరియు సమాచారం యొక్క సేకరణ: ప్రోమేతియస్ మరియు k8s api సర్వర్.
- ఇన్ఫ్రాస్ట్రక్చర్ భాగం (CPU సమయం, మెమరీ, డిస్క్ సబ్సిస్టమ్, నెట్వర్క్ వినియోగం) మరియు అప్లికేషన్ లాజిక్ - హెల్త్-స్టేటస్ పాడ్లు, అందుబాటులో ఉన్న ప్రతిరూపాల సంఖ్య, లైవ్నెస్/సిద్ధత పరీక్షల్లో ఉత్తీర్ణత గురించి సమాచారం రెండింటినీ పర్యవేక్షించడం.
పార్ట్ 1: “గ్రాఫానా ప్లగ్ఇన్” అంటే ఏమిటి?
సాంకేతిక దృక్కోణం నుండి, గ్రాఫానా కోసం ప్లగ్ఇన్ ఒక కోణీయ కంట్రోలర్, ఇది గ్రాఫానా డేటా డైరెక్టరీలో నిల్వ చేయబడుతుంది (/var/grafana/plugins/ /dist/module.js) మరియు SystemJS మాడ్యూల్గా లోడ్ చేయవచ్చు. అలాగే ఈ డైరెక్టరీలో మీ ప్లగిన్ గురించిన మొత్తం మెటా సమాచారాన్ని కలిగి ఉన్న plugin.json ఫైల్ ఉండాలి: పేరు, వెర్షన్, ప్లగిన్ రకం, రిపోజిటరీ/సైట్/లైసెన్స్కి లింక్లు, డిపెండెన్సీలు మొదలైనవి.
module.ts
plugin.json
మీరు స్క్రీన్షాట్లో చూడగలిగినట్లుగా, మేము plugin.type = యాప్ని పేర్కొన్నాము. ఎందుకంటే గ్రాఫానా కోసం ప్లగిన్లు మూడు రకాలుగా ఉంటాయి:
ప్యానెల్: అత్యంత సాధారణమైన ప్లగ్ఇన్ రకం - ఇది వివిధ డాష్బోర్డ్లను రూపొందించడానికి ఉపయోగించే ఏదైనా కొలమానాలను దృశ్యమానం చేయడానికి ఒక ప్యానెల్.
సమాచార మూలం: కొంత డేటా మూలానికి ప్లగ్ఇన్ కనెక్టర్ (ఉదాహరణకు, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
అనువర్తనం: గ్రాఫానాలో మీ స్వంత ఫ్రంటెండ్ అప్లికేషన్ను రూపొందించడానికి, మీ స్వంత html పేజీలను సృష్టించడానికి మరియు వివిధ డేటాను దృశ్యమానం చేయడానికి డేటాసోర్స్ను మాన్యువల్గా యాక్సెస్ చేయడానికి మిమ్మల్ని అనుమతించే ప్లగ్ఇన్. అలాగే, ఇతర రకాల ప్లగిన్లు (డేటాసోర్స్, ప్యానెల్) మరియు వివిధ డాష్బోర్డ్లను డిపెండెన్సీలుగా ఉపయోగించవచ్చు.
టైప్=యాప్తో ఉదాహరణ ప్లగిన్ డిపెండెన్సీలు.
మీరు జావాస్క్రిప్ట్ మరియు టైప్స్క్రిప్ట్ రెండింటినీ ప్రోగ్రామింగ్ లాంగ్వేజ్గా ఉపయోగించవచ్చు (మేము దానిని ఎంచుకున్నాము). మీరు చేయగలిగిన ఏదైనా రకం హలో-వరల్డ్ ప్లగిన్ల కోసం సన్నాహాలు
పార్ట్ 2: స్థానిక వాతావరణాన్ని సిద్ధం చేయడం
ప్లగ్ఇన్పై పని చేయడానికి, మనకు సహజంగానే ముందుగా ఇన్స్టాల్ చేయబడిన అన్ని సాధనాలతో కూడిన కుబెర్నెట్స్ క్లస్టర్ అవసరం: ప్రోమేథియస్, నోడ్-ఎగుమతిదారు, కుబే-స్టేట్-మెట్రిక్స్, గ్రాఫానా. పర్యావరణం త్వరగా, సులభంగా మరియు సహజంగా సెటప్ చేయబడాలి మరియు హాట్-రీలోడ్ని నిర్ధారించడానికి, గ్రాఫానా డేటా డైరెక్టరీని డెవలపర్ మెషీన్ నుండి నేరుగా మౌంట్ చేయాలి.
అత్యంత అనుకూలమైన మార్గం, మా అభిప్రాయం ప్రకారం, కుబెర్నెట్లతో స్థానికంగా పని చేయడం
మా చివరి 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: వాస్తవ అభివృద్ధి
ఆబ్జెక్ట్ మోడల్
ప్లగ్ఇన్ను అమలు చేయడానికి సన్నాహకంగా, మేము టైప్స్క్రిప్ట్ క్లాస్ల రూపంలో పని చేసే అన్ని ప్రాథమిక కుబెర్నెట్స్ ఎంటిటీలను వివరించాలని నిర్ణయించుకున్నాము: పాడ్, డిప్లాయ్మెంట్, డెమోన్సెట్, స్టేట్ఫుల్సెట్, జాబ్, క్రోన్జాబ్, సర్వీస్, నోడ్, నేమ్స్పేస్. ఈ తరగతుల్లో ప్రతి ఒక్కటి సాధారణ బేస్ మోడల్ క్లాస్ నుండి సంక్రమిస్తుంది, ఇది కన్స్ట్రక్టర్, డిస్ట్రక్టర్, విజిబిలిటీని అప్డేట్ చేయడానికి మరియు మార్చడానికి పద్ధతులను వివరిస్తుంది. ప్రతి తరగతి ఇతర ఎంటిటీలతో సమూహ సంబంధాలను వివరిస్తుంది, ఉదాహరణకు, టైప్ డిప్లాయ్మెంట్ ఎంటిటీ కోసం పాడ్ల జాబితా.
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లో డిపెండెన్సీల విభాగంలో వివరించబడింది:
ప్రతి పేజీ కోసం బ్లాక్లో మనం తప్పనిసరిగా PAGE NAMEని సూచించాలి (అది స్లగ్గా మార్చబడుతుంది, దీని ద్వారా ఈ పేజీని యాక్సెస్ చేయవచ్చు); ఈ పేజీ యొక్క ఆపరేషన్కు బాధ్యత వహించే భాగం పేరు (భాగాల జాబితా module.tsకి ఎగుమతి చేయబడుతుంది); ఈ పేజీతో పని చేయడానికి వినియోగదారు పాత్ర అందుబాటులో ఉంది మరియు సైడ్బార్ కోసం నావిగేషన్ సెట్టింగ్లను సూచిస్తుంది.
పేజీ యొక్క ఆపరేషన్కు బాధ్యత వహించే భాగంలో, మేము తప్పనిసరిగా టెంప్లేట్యుఆర్ఎల్ను సెట్ చేయాలి, మార్కప్తో html ఫైల్కి మార్గాన్ని పంపాలి. కంట్రోలర్ లోపల, డిపెండెన్సీ ఇంజెక్షన్ ద్వారా, మేము గరిష్టంగా 2 ముఖ్యమైన కోణీయ సేవలను యాక్సెస్ చేయవచ్చు:
- backendSrv - గ్రాఫానా API సర్వర్తో పరస్పర చర్యను అందించే సేవ;
- datasourceSrv - మీ గ్రాఫానాలో ఇన్స్టాల్ చేయబడిన అన్ని డేటాసోర్స్లతో స్థానిక పరస్పర చర్యను అందించే సేవ (ఉదాహరణకు, .getAll() పద్ధతి - ఇన్స్టాల్ చేయబడిన అన్ని డేటాసోర్స్ల జాబితాను అందిస్తుంది; .get( ) - నిర్దిష్ట డేటాసోర్స్ యొక్క ఉదాహరణ వస్తువును అందిస్తుంది.
పార్ట్ 4: డేటా సోర్స్
గ్రాఫానా యొక్క దృక్కోణం నుండి, డేటాసోర్స్ అన్ని ఇతర ప్లగిన్ల మాదిరిగానే ఉంటుంది: దాని స్వంత ఎంట్రీ పాయింట్ module.jsని కలిగి ఉంది, మెటా ఇన్ఫర్మేషన్ plugin.jsonతో ఫైల్ ఉంది. రకం = యాప్తో ప్లగ్ఇన్ని అభివృద్ధి చేస్తున్నప్పుడు, ఇప్పటికే ఉన్న డేటాసోర్స్లతో (ఉదాహరణకు, ప్రోమేథియస్-డేటాసోర్స్) మరియు మన స్వంత వాటితో పరస్పర చర్య చేయవచ్చు, వీటిని మనం నేరుగా ప్లగిన్ డైరెక్టరీలో (డిస్ట్/డేటాసోర్స్/*) నిల్వ చేయవచ్చు లేదా డిపెండెన్సీగా ఇన్స్టాల్ చేయవచ్చు. మా విషయంలో, డేటాసోర్స్ ప్లగ్ఇన్ కోడ్తో వస్తుంది. config.html టెంప్లేట్ మరియు ConfigCtrl కంట్రోలర్ను కలిగి ఉండటం కూడా అవసరం, ఇది డేటాసోర్స్ ఇన్స్టాన్స్ కాన్ఫిగరేషన్ పేజీ మరియు మీ డేటాసోర్స్ యొక్క లాజిక్ను అమలు చేసే డేటాసోర్స్ కంట్రోలర్ కోసం ఉపయోగించబడుతుంది.
KubeGraf ప్లగ్ఇన్లో, వినియోగదారు ఇంటర్ఫేస్ కోణం నుండి, డేటాసోర్స్ అనేది క్రింది సామర్థ్యాలను అమలు చేసే kubernetes క్లస్టర్ యొక్క ఉదాహరణ (సోర్స్ కోడ్ అందుబాటులో ఉంది
- k8s api-server నుండి డేటాను సేకరిస్తోంది (నేమ్స్పేస్లు, విస్తరణల జాబితాను పొందడం...)
- ప్రోమేథియస్-డేటాసోర్స్కు అభ్యర్థనలను ప్రాక్సీ చేయడం (ఇది ప్రతి నిర్దిష్ట క్లస్టర్కు ప్లగిన్ సెట్టింగ్లలో ఎంపిక చేయబడుతుంది) మరియు స్టాటిక్ పేజీలలో మరియు డాష్బోర్డ్లలో డేటాను ఉపయోగించడానికి ప్రతిస్పందనలను ఫార్మాటింగ్ చేస్తుంది.
- స్టాటిక్ ప్లగిన్ పేజీలలో డేటాను నవీకరిస్తోంది (సెట్ రిఫ్రెష్ రేట్తో).
- గ్రాఫానా-డ్యాష్బోర్డ్లలో టెంప్లేట్ షీట్ను రూపొందించడానికి ప్రశ్నలను ప్రాసెస్ చేయడం (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"};
})
}
ఒక ప్రత్యేక ఆసక్తికరమైన అంశం, మా అభిప్రాయం ప్రకారం, డేటాసోర్స్ కోసం ప్రామాణీకరణ మరియు అధికార యంత్రాంగాన్ని అమలు చేయడం. సాధారణంగా, బాక్స్ వెలుపల, తుది డేటా మూలానికి యాక్సెస్ను కాన్ఫిగర్ చేయడానికి మేము అంతర్నిర్మిత గ్రాఫానా కాంపోనెంట్ డేటాసోర్స్HttpSettingsని ఉపయోగించవచ్చు. ఈ భాగాన్ని ఉపయోగించి, మేము url మరియు ప్రాథమిక ప్రమాణీకరణ/ఆథరైజేషన్ సెట్టింగ్లను పేర్కొనడం ద్వారా http డేటా మూలానికి యాక్సెస్ను కాన్ఫిగర్ చేయవచ్చు: లాగిన్-పాస్వర్డ్ లేదా క్లయింట్-సర్ట్/క్లయింట్-కీ. బేరర్ టోకెన్ (k8s కోసం వాస్తవ ప్రమాణం) ఉపయోగించి యాక్సెస్ను కాన్ఫిగర్ చేసే సామర్థ్యాన్ని అమలు చేయడానికి, మేము కొద్దిగా ట్వీకింగ్ చేయాల్సి ఉంటుంది.
ఈ సమస్యను పరిష్కరించడానికి, మీరు అంతర్నిర్మిత గ్రాఫానా “ప్లగిన్ రూట్స్” మెకానిజంను ఉపయోగించవచ్చు (మరిన్ని వివరాలు ఇక్కడ
ఆథరైజేషన్తో /api/v8/namespaces: బేరర్ హెడర్.
సహజంగానే, k8s api సర్వర్తో పని చేయడానికి మాకు చదవడానికి మాత్రమే యాక్సెస్ ఉన్న వినియోగదారు అవసరం, సృష్టించడానికి మానిఫెస్ట్లు మీరు కూడా కనుగొనవచ్చు
పార్ట్ 5: విడుదల
మీరు మీ స్వంత గ్రాఫానా ప్లగిన్ని వ్రాసిన తర్వాత, మీరు సహజంగానే దాన్ని పబ్లిక్గా అందుబాటులో ఉంచాలని కోరుకుంటారు. గ్రాఫానాలో ఇది ఇక్కడ అందుబాటులో ఉన్న ప్లగిన్ల లైబ్రరీ
మీ ప్లగ్ఇన్ అధికారిక స్టోర్లో అందుబాటులో ఉండాలంటే, మీరు PR ఇన్ చేయాలి
ఇక్కడ వెర్షన్ మీ ప్లగ్ఇన్ యొక్క సంస్కరణ, url అనేది రిపోజిటరీకి లింక్ మరియు కమిట్ అనేది ప్లగ్ఇన్ యొక్క నిర్దిష్ట వెర్షన్ అందుబాటులో ఉండే కమిట్ యొక్క హాష్.
మరియు అవుట్పుట్ వద్ద మీరు ఇలాంటి అద్భుతమైన చిత్రాన్ని చూస్తారు:
దాని కోసం డేటా మీ Readme.md, Changelog.md మరియు ప్లగ్ఇన్ వివరణతో ఉన్న plugin.json ఫైల్ నుండి స్వయంచాలకంగా గ్రాబ్ చేయబడుతుంది.
పార్ట్ 6: ముగింపులకు బదులుగా
విడుదలైన తర్వాత మేము మా ప్లగ్ఇన్ని అభివృద్ధి చేయడాన్ని ఆపలేదు. మరియు ఇప్పుడు మేము క్లస్టర్ నోడ్ల వనరుల వినియోగాన్ని సరిగ్గా పర్యవేక్షించడంలో పని చేస్తున్నాము, UXని మెరుగుపరచడానికి కొత్త ఫీచర్లను పరిచయం చేస్తున్నాము మరియు ప్లగ్ఇన్ను ఇన్స్టాల్ చేసిన తర్వాత మా క్లయింట్లు మరియు GitHub (మీరు విడిచిపెడితే) వ్యక్తుల నుండి పెద్ద మొత్తంలో ఫీడ్బ్యాక్ను పొందడంపై కూడా పని చేస్తున్నాము. మీ సమస్య లేదా పుల్ అభ్యర్థన, నేను చాలా సంతోషిస్తాను :)
గ్రాఫానా వంటి అద్భుతమైన సాధనాన్ని అర్థం చేసుకోవడానికి మరియు బహుశా మీ స్వంత ప్లగ్ఇన్ను వ్రాయడానికి ఈ వ్యాసం మీకు సహాయపడుతుందని మేము ఆశిస్తున్నాము.
ధన్యవాదాలు!)
మూలం: www.habr.com