هيلو سڀ! ڪجھ مھينا اڳ، اسان پنھنجي نئين اوپن سورس پروجيڪٽ کي پيداوار ۾ شروع ڪيو - ڪبرنيٽس جي نگراني لاءِ گرافانا پلگ ان، جنھن کي اسان سڏيون ٿا
حصو 0 - تعارفي: اسان هن نقطي تي ڪيئن حاصل ڪيو؟
گرافن لاءِ اسان جو پنهنجو پلگ ان لکڻ جو خيال اسان وٽ اتفاقي طور تي آيو. اسان جي ڪمپني 10 سالن کان وڌيڪ عرصي تائين پيچيدگي جي مختلف سطحن جي ويب منصوبن جي نگراني ڪري رهي آهي. هن عرصي دوران، اسان وڏي مقدار ۾ ماهر، دلچسپ ڪيس، ۽ مختلف مانيٽرنگ سسٽم استعمال ڪرڻ ۾ تجربو گڏ ڪيو آهي. ۽ ڪجهه نقطي تي اسان پاڻ کان پڇيو: ”ڇا ڪوبرنيٽس جي نگراني لاءِ ڪو جادوئي اوزار آهي، ته جيئن اهي چون ٿا، ”ان کي سيٽ ڪريو ۽ ان کي وساريو“؟“.. K8s جي نگراني لاءِ صنعت جو معيار، يقيناً، ڪافي عرصي کان رهيو آهي. Prometheus + Grafana جو ميلاپ. ۽ هن اسٽيڪ لاءِ تيار ڪيل حلن جي طور تي، اتي مختلف قسمن جي اوزارن جو هڪ وڏو مجموعو آهي: prometheus-operator، kubernetes-mixin deshboards جو هڪ سيٽ، grafana-kubernetes-app.
گرافانا-ڪبرنيٽس-ايپ پلگ ان اسان لاءِ سڀ کان وڌيڪ دلچسپ آپشن لڳي رهيو هو، پر اهو هڪ سال کان وڌيڪ عرصي تائين سپورٽ نه ڪيو ويو آهي ۽ ان کان علاوه، نوڊ-ايڪسپورٽر ۽ ڪوبي-رياست-ميٽرڪس جي نئين ورزن سان ڪم نٿو ڪري سگهي. ۽ ڪجهه نقطي تي اسان فيصلو ڪيو: "ڇا اسان کي پنهنجو فيصلو نه ڪرڻ گهرجي؟"
اسان پنهنجي پلگ ان ۾ ڪهڙا خيال لاڳو ڪرڻ جو فيصلو ڪيو:
- "ايپليڪيشن ميپ" جو تصور: ڪلستر ۾ ايپليڪيشنن جي آسان پيشڪش، نالن جي جڳهن جي ترتيب سان، ترتيب ڏيڻ ...؛
- ڪنيڪشن جو تصور جهڙوڪ "تعيناتي - خدمت (+ بندرگاهن)".
- ڪلستر نوڊس ۾ ڪلستر ايپليڪيشنن جي ورڇ جو تصور.
- ڪيترن ئي ذريعن مان ميٽرڪ ۽ معلومات جو مجموعو: Prometheus ۽ k8s api سرور.
- انفراسٽرڪچر جي ٻنهي حصن جي نگراني (سي پي يو ٽائيم، ميموري، ڊسڪ سب سسٽم، نيٽ ورڪ جو استعمال) ۽ ايپليڪيشن لاجڪ - هيلٿ اسٽيٽس پوڊس، موجود ريپليڪس جو تعداد، جاندار/تياري ٽيسٽ پاس ڪرڻ بابت معلومات.
حصو 1: ”گرافانا پلگ ان“ ڇا آهي؟
ٽيڪنيڪل نقطي نظر کان، گرافانا لاءِ پلگ ان هڪ ڪنولر ڪنٽرولر آهي، جيڪو گرافانا ڊيٽا ڊاريڪٽري ۾ محفوظ ٿيل آهي (/var/grafana/plugins/ /dist/module.js) ۽ هڪ SystemJS ماڊل طور لوڊ ڪري سگهجي ٿو. هن ڊاريڪٽري ۾ پڻ هڪ plugin.json فائل هجڻ گهرجي جنهن ۾ توهان جي پلگ ان بابت سموري معلومات شامل هجي: نالو، نسخو، پلگ ان جو قسم، ريپوزٽري/سائيٽ/لائسنس، انحصار، وغيره.
module.ts
plugin.json
جئين توهان اسڪرين شاٽ ۾ ڏسي سگهو ٿا، اسان وضاحت ڪئي plugin.type = ايپ. ڇاڪاڻ ته گرافانا لاءِ پلگ ان ٽن قسمن جا ٿي سگهن ٿا:
پينل: سڀ کان وڌيڪ عام قسم جو پلگ ان - اهو هڪ پينل آهي ڪنهن به ميٽرڪس کي ڏسڻ لاءِ، مختلف ڊيش بورڊ ٺاهڻ لاءِ استعمال ڪيو ويندو آهي.
ڊيٽا جو ذريعو: پلگ ان ڪنيڪٽر ڪجھ ڊيٽا ماخذ سان (مثال طور، Prometheus-datasource، ClickHouse-datasource، ElasticSearch-datasource).
ائپ: هڪ پلگ ان جيڪو توهان کي اجازت ڏئي ٿو توهان جي پنهنجي فرنٽ اينڊ ايپليڪيشن کي Grafana اندر ٺاهي، پنهنجا پنهنجا html صفحا ٺاهي ۽ دستي طور تي ڊيٽا ماخذ تائين رسائي ڪري مختلف ڊيٽا کي ڏسڻ لاءِ. انهي سان گڏ، ٻين قسمن جا پلگ ان (ڊيٽا سورس، پينل) ۽ مختلف ڊيش بورڊ استعمال ڪري سگھجن ٿا انحصار طور.
مثال پلگ ان انحصار ٽائپ = ايپ سان.
توھان ٻئي استعمال ڪري سگھوٿا JavaScript ۽ TypeScript ھڪ پروگرامنگ ٻولي طور (اسان ان کي چونڊيو). هيلو ورلڊ پلگ ان لاءِ تياريون ڪنهن به قسم جي توهان ڪري سگهو ٿا
حصو 2: مقامي ماحول تيار ڪرڻ
پلگ ان تي ڪم ڪرڻ لاءِ، اسان کي قدرتي طور تي سڀني اڳ ۾ نصب ٿيل اوزارن سان گڏ ڪبرنيٽس ڪلستر جي ضرورت آھي: پروميٿيوس، نوڊ-ايڪسپورٽر، ڪبي-اسٽيٽ-ميٽرڪس، گرافانا. ماحول کي جلدي، آساني سان ۽ قدرتي طور تي ترتيب ڏيڻ گهرجي، ۽ گرم ٻيهر لوڊ ڪرڻ کي يقيني بڻائڻ لاء، گرافانا ڊيٽا ڊاريڪٽري کي سڌو سنئون ڊولپر جي مشين مان نصب ڪيو وڃي.
سڀ کان وڌيڪ آسان طريقو، اسان جي راء ۾، مقامي طور تي ڪبرنيٽس سان ڪم ڪرڻ آهي
اسان جي فائنل مينيڪوب لانچ اسڪرپٽ هن طرح نظر اچي ٿي:
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: حقيقي ترقي
آبجیکٹ ماڊل
پلگ ان کي لاڳو ڪرڻ جي تياري ۾، اسان سڀني بنيادي ڪبرنيٽس ادارن کي بيان ڪرڻ جو فيصلو ڪيو جن سان اسان ٽائپ اسڪرپٽ ڪلاسن جي صورت ۾ ڪم ڪنداسين: پوڊ، ڊيپلائيمينٽ، ڊيمونسيٽ، اسٽيٽفول سيٽ، نوڪري، ڪرونجوب، سروس، نوڊ، نيمس اسپيس. انهن طبقن مان هر هڪ عام بيس ماڊل ڪلاس مان ورثي ۾ ملي ٿو، جيڪو بيان ڪري ٿو تعمير ڪندڙ، تباهي ڪندڙ، تازه ڪاري ڪرڻ ۽ ڏسڻ جي سوئچنگ جا طريقا. هر هڪ طبقو بيان ڪري ٿو nested رشتا ٻين ادارن سان، مثال طور، قسم جي مقرري جي اداري لاءِ پوڊ جي هڪ فهرست.
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 ۾ بيان ڪيل آهي انحصار سيڪشن ۾:
هر صفحي جي بلاڪ ۾ اسان کي PAGE NAME جي نشاندهي ڪرڻ گهرجي (اهو پوءِ هڪ سلگ ۾ تبديل ڪيو ويندو جنهن ذريعي هي صفحو پهچندو)؛ هن صفحي جي آپريشن لاء ذميوار جزو جو نالو (جزا جي فهرست module.ts ڏانهن برآمد ڪئي وئي آهي)؛ صارف جي ڪردار کي اشارو ڪندي جنهن لاءِ هن صفحي سان ڪم موجود آهي ۽ سائڊبار لاءِ نيويگيشن سيٽنگون.
صفحي جي آپريشن جي ذميوار حصي ۾، اسان کي templateUrl مقرر ڪرڻ گهرجي، اتي html فائل ڏانهن رستو مارڪ اپ سان گذري ٿو. ڪنٽرولر جي اندر، انحصار انجيڪشن ذريعي، اسان 2 اهم ڪنولر خدمتن تائين رسائي ڪري سگھون ٿا:
- backendSrv - هڪ خدمت جيڪا مهيا ڪري ٿي رابطي سان Grafana API سرور؛
- datasourceSrv - هڪ خدمت جيڪا توهان جي گرافانا ۾ نصب ڪيل سڀني ڊيٽا ذريعن سان مقامي رابطي کي فراهم ڪري ٿي (مثال طور، .getAll() طريقو - سڀني نصب ڪيل ڊيٽا ذريعن جي فهرست واپس ڪري ٿو؛ .get( ) - ھڪڙي خاص ڊيٽا جي ذريعن جو ھڪڙو مثال اعتراض موٽائي ٿو.
حصو 4: ڊيٽا جو ذريعو
گرافانا جي نقطي نظر کان، ڊيٽا جو ذريعو بلڪل ساڳيو پلگ ان آهي جيئن سڀني ٻين: ان جي پنهنجي داخلا پوائنٽ module.js آهي، اتي ميٽا معلومات plugin.json سان گڏ هڪ فائل آهي. جڏهن ٽائپ = ايپ سان هڪ پلگ ان ٺاهي رهيا آهيون، اسان ٻنهي موجوده ڊيٽا ذريعن سان رابطو ڪري سگهون ٿا (مثال طور، پروميٿيوس-ڊيٽا سورس) ۽ اسان جو پنهنجو، جنهن کي اسان سڌو سنئون پلگ ان ڊاريڪٽري (dist/datasource/*) ۾ ذخيرو ڪري سگهون ٿا يا انحصار جي طور تي انسٽال ڪري سگهون ٿا. اسان جي صورت ۾، ڊيٽا جو ذريعو اچي ٿو پلگ ان ڪوڊ سان. اهو پڻ ضروري آهي ته هڪ config.html ٽيمپليٽ ۽ هڪ ConfigCtrl ڪنٽرولر، جيڪو ڊيٽا سورس مثال جي ترتيب واري صفحي ۽ ڊيٽا سورس ڪنٽرولر لاءِ استعمال ڪيو ويندو، جيڪو توهان جي ڊيٽا ذريعن جي منطق کي لاڳو ڪري ٿو.
KubeGraf پلگ ان ۾، صارف جي انٽرنيٽ جي نقطي نظر کان، ڊيٽا جو ذريعو ڪبرنيٽس ڪلستر جو ھڪڙو مثال آھي جيڪو ھيٺين صلاحيتن کي لاڳو ڪري ٿو (ذريعو ڪوڊ موجود آھي
- k8s api-server کان ڊيٽا گڏ ڪرڻ (نالن جي جڳھن جي لسٽ حاصل ڪرڻ، مقرري...)
- prometheus-datasource ڏانهن پراڪسنگ درخواستون (جيڪو هر مخصوص ڪلستر لاءِ پلگ ان سيٽنگن ۾ چونڊيو ويو آهي) ۽ ڊيٽا کي استعمال ڪرڻ لاءِ فارميٽنگ جوابن ٻنهي جامد صفحن ۽ ڊيش بورڊن ۾.
- جامد پلگ ان صفحن تي ڊيٽا کي اپڊيٽ ڪرڻ (سيٽ ريفريش جي شرح سان).
- گرافانا-ڊيش بورڊز (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"};
})
}
هڪ الڳ دلچسپ نقطو، اسان جي راء ۾، ڊيٽا جي ذريعن لاء هڪ تصديق ۽ اختيار جي ميڪانيزم تي عمل درآمد آهي. عام طور تي، دٻي کان ٻاهر، اسان استعمال ڪري سگھون ٿا تعمير ٿيل گرافانا جزو datasourceHttp سيٽنگون حتمي ڊيٽا ماخذ تائين رسائي کي ترتيب ڏيڻ لاءِ. هن جزو کي استعمال ڪندي، اسان url ۽ بنيادي تصديق / اختيار جي سيٽنگن کي بيان ڪندي http ڊيٽا ماخذ تائين رسائي کي ترتيب ڏئي سگھون ٿا: لاگ ان-پاسورڊ، يا client-cert/client-key. بيئرر ٽوڪن استعمال ڪندي پهچ کي ترتيب ڏيڻ جي صلاحيت کي لاڳو ڪرڻ لاءِ (k8s لاءِ ڊي فيڪٽو معيار)، اسان کي ٿورڙي ٽوڪ ڪرڻي پوندي.
هن مسئلي کي حل ڪرڻ لاء، توهان استعمال ڪري سگهو ٿا تعمير ٿيل گرافانا "پلگ ان روٽس" ميڪانيزم (وڌيڪ تفصيلات تي
اختيار سان گڏ /api/v8/namespaces: Bearer header.
قدرتي طور تي، k8s api سرور سان ڪم ڪرڻ لاءِ اسان کي هڪ صارف جي ضرورت آهي جنهن ۾ صرف پڙهڻ جي رسائي آهي، ٺاهڻ لاءِ ظاهر آهي جنهن ۾ توهان پڻ ڳولي سگهو ٿا.
حصو 5: ڇڏڻ
هڪ دفعو توهان پنهنجو گرافانا پلگ ان لکيو آهي، توهان قدرتي طور تي ان کي عوامي طور تي دستياب ڪرڻ چاهيندا. گرافانا ۾ هي پلگ ان جي هڪ لائبريري آهي هتي دستياب آهي
توھان جي پلگ ان کي سرڪاري اسٽور تي دستياب ڪرڻ لاءِ، توھان کي پي آر ان ڪرڻ جي ضرورت آھي
جتي نسخو توهان جي پلگ ان جو نسخو آهي، url مخزن جي هڪ لنڪ آهي، ۽ ڪمٽٽ جو هيش آهي جنهن لاءِ پلگ ان جو هڪ مخصوص نسخو دستياب هوندو.
۽ ٻاھر نڪرڻ تي توھان ھڪڙي شاندار تصوير ڏسندا جھڙوڪ:
ان لاءِ ڊيٽا خودڪار طريقي سان پڪڙي ويندي توھان جي Readme.md، Changelog.md ۽ plugin.json فائل مان پلگ ان جي تفصيل سان.
حصو 6: نتيجن جي بدران
اسان ڇڏڻ کان پوء اسان جي پلگ ان کي ترقي ڪرڻ بند نه ڪيو. ۽ ھاڻي اسان ڪلسٽر نوڊس جي وسيلن جي استعمال جي صحيح نگراني تي ڪم ڪري رھيا آھيون، UX کي بھتر ڪرڻ لاءِ نوان فيچر متعارف ڪرائڻ، ۽ پلگ ان کي انسٽال ڪرڻ کان پوءِ مليل موٽ جي وڏي مقدار ۾ ريڪنگ ڪري رھيا آھيون اسان جي ڪلائنٽ ۽ GitHub تي موجود ماڻھن کان (جيڪڏھن توھان ڇڏي ڏيو) توهان جو مسئلو يا ڇڪڻ جي درخواست، مان تمام خوش ٿيندس :)
اسان کي اميد آهي ته هي مضمون توهان کي سمجهڻ ۾ مدد ڏيندو اهڙي شاندار اوزار Grafana ۽، شايد، پنهنجو پلگ ان لکو.
تنهنجي مهرباني!)
جو ذريعو: www.habr.com