ืฉืืื ืืืืื! ืืคื ื ืืกืคืจ ืืืืฉืื ืืฉืงื ื ืืืืฆืืจ ืืช ืคืจืืืงื ืืงืื ืืคืชืื ืืืืฉ ืฉืื ื - ืชืืกืฃ Grafana ืื ืืืืจ kubernetes, ืฉืงืจืื ื ืื.
ืืืง 0 - ืืืื: ืืื ืืืขื ื ืืืฆื ืืื?
ืืจืขืืื ืืืชืื ืชืืกืฃ ืืฉืื ื ืืืจืคื ืืืืข ืืืื ื ืืืฉ ืืืงืจื. ืืืจืชื ื ืขืืงืืช ืืืจ ืืืชืจ ื-10 ืฉื ืื ืืืจ ืคืจืืืงืืื ืืื ืืจื ืืืื ืืจืืืช ืืืจืืืืช ืฉืื ืืช. ืืืืื ืชืงืืคื ืื, ืฆืืจื ื ืืืืช ืืืืื ืฉื ืืืืืืืช, ืืงืจืื ืืขื ืืื ืื ืื ืืกืืื ืืฉืืืืฉ ืืืขืจืืืช ื ืืืืจ ืฉืื ืืช. ืืืฉืื ืืกืืื ืฉืืื ื ืืช ืขืฆืื ื: "ืืื ืืฉ ืืื ืงืกื ืื ืืืืจ Kubernetes, ืื, ืืื ืฉืืืืจืื, "ืืืืจ ืืืชื ืืชืฉืื ืืื"?".. ืืชืงื ืืชืขืฉืืื ืื ืืืืจ K8s, ืืืืื, ืืืจ ืืืื ืฉืืืื ืคืจืืืชืืืก + ืืจืืคื ื. ืืืคืชืจืื ืืช ืืืื ืื ืืืกืืื ืืื, ืืฉื ื ืกื ืืืื ืฉื ืืืื ืืกืืืื ืฉืื ืื: prometheus-operator, ืกื ืฉื ืืืืืช ืืืืื ืื ืฉื kubernetes-mixin, grafana-kubernetes-app.
ื ืจืื ืฉืืชืืกืฃ grafana-kubernetes-app ืืื ืืืคืฉืจืืช ืืืขื ืืื ืช ืืืืชืจ ืขืืืจื ื, ืืื ืืื ืื ื ืชืื ืืืจ ืืืชืจ ืืฉื ื ืืืืชืจ ืืื, ืื ืืืื ืืขืืื ืขื ืืจืกืืืช ืืืฉืืช ืฉื node-exporter ื-kube-state-metrics. ืืืฉืื ืืกืืื ืืืืื ื: "ืืื ืื ื ืืืื ืืขืฆืื ื?"
ืืืื ืจืขืืื ืืช ืืืืื ื ืืืืฉื ืืชืืกืฃ ืฉืื ื:
- ืืืืื ืฉื "ืืคืช ืืืคืืืงืฆืื": ืืฆืื ื ืืื ืฉื ืืคืืืงืฆืืืช ืืืฉืืื, ืืงืืืฆืืช ืืคื ืืจืืื ืฉืืืช, ืคืจืืกืืช...;
- ืืืืื ืฉื ืืืืืจืื ืืื "ืคืจืืกื - ืฉืืจืืช (+ืืฆืืืืช)".
- ืืืืื ืฉื ืืชืคืืืืช ืืืฉืืื ืืฉืืื ืขื ืคื ื ืฆืืชื ืืฉืืื.
- ืืืกืฃ ืฉื ืืืืื ืืืืืข ืืืกืคืจ ืืงืืจืืช: Prometheus ืืฉืจืช API K8s.
- ื ืืืืจ ืื ืฉื ืืืง ืืชืฉืชืืช (ืฉืืืืฉ ืืืื CPU, ืืืืจืื, ืชืช-ืืขืจืืช ืืืกืง, ืจืฉืช) ืืื ืืืืืงื ืฉื ืืืคืืืงืฆืื - ืชืจืืืืื ืฉื ืืฆื ืืจืืืืช, ืืกืคืจ ืืขืชืงืื ืืืื ืื, ืืืืข ืขื ืืขืืจืช ืืืื ื ืืืื ืืืช/ืืืื ืืช.
ืืืง 1: ืืื "ืชืืกืฃ ืืจืคืื ื"?
ืื ืงืืืช ืืื ืืื ืืช, ืืชืืกืฃ ืขืืืจ Grafana ืืื ืืงืจ ืืืืืชื, ืืืืืืกื ืืกืคืจืืืช ืื ืชืื ืื ืฉื Grafana (/var/grafana/plugins/ /dist/module.js) ืื ืืชื ืืืขืื ืืืชื ืืืืืื SystemJS. ืืื ืื, ืืกืคืจืืื ืื ืืืืจ ืืืืืช ืงืืืฅ plugin.json ืืืืื ืืช ืื ืืืื ืืืืข ืขื ืืชืืกืฃ ืฉืื: ืฉื, ืืจืกื, ืกืื ืชืืกืฃ, ืงืืฉืืจืื ืืืืืจ/ืืชืจ/ืจืืฉืืื, ืชืืืช ืืืืืื.
module.ts
plugin.json
ืืคื ืฉื ืืชื ืืจืืืช ืืฆืืืื ืืืกื, ืฆืืื ื plugin.type = app. ืืืืืื ืฉืชืืกืคื ืืจืืคืื ื ืืืืืื ืืืืืช ืืฉืืืฉื ืกืืืื:
ืืื: ืืกืื ืื ืคืืฅ ืืืืชืจ ืฉื ืชืืกืฃ - ืืื ืคืื ื ืืืืืฉืช ืื ืืืืื, ืืืฉืืฉ ืืื ืืืช ืืืืืช ืืืืื ืื ืฉืื ืื.
datasource: ืืืืจ ืชืืกืฃ ืืืงืืจ ื ืชืื ืื ืืืฉืื (ืืืืืื, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
ืืืคืืืงืฆืื: ืชืืกืฃ ืืืืคืฉืจ ืื ืืื ืืช ืืืฉืื ืืืืชื ืืฉืื ืืชืื Grafana, ืืืฆืืจ ืืคื HTML ืืฉืื ืืืืฉืช ืืื ืืช ืืืงืืจ ืื ืชืื ืื ืืื ืืืืืืฉ ื ืชืื ืื ืฉืื ืื. ืืื ืื, ืชืืกืคืื ืืกืืืื ืืืจืื (ืืงืืจ ื ืชืื ืื, ืคืื ื) ืืืฉืืืจืืื ืฉืื ืื ืืืืืื ืืฉืืฉ ืืชืืืช.
ืชืืืช ืชืืกืฃ ืืืืืื ืขื type=app.
ืืชื ืืืื ืืืฉืชืืฉ ืื ื-JavaScript ืืื ื-TypeScript ืืฉืคืช ืชืื ืืช (ืื ืื ื ืืืจื ื ืื). ืืื ืืช ืืชืืกืคื ืฉืืื ืขืืื ืืื ืกืื ืฉืืชื ืืืื
ืืืง ื': ืืื ืช ืืกืืืื ืืืงืืืืช
ืืื ืืขืืื ืขื ืืคืืืืื, ืื ื ืืงืืงืื ืืืืคื ืืืขื ืืืฉืืื kubernetes ืขื ืื ืืืืื ืืืืชืงื ืื ืืจืืฉ: prometheus, node-exporter, kube-state-metrics, grafana. ืืฉ ืืืืืืจ ืืช ืืกืืืื ืืืืืจืืช, ืืงืืืช ืืืืืขืืืช, ืืืื ืืืืืื ืืขืื ื ืืื, ืืฉ ืืืจืืื ืืช ืกืคืจืืืช ืื ืชืื ืื ืฉื Grafana ืืฉืืจืืช ืืืืืฉื ืฉื ืืืคืชื.
ืืืจื ืื ืืื ืืืืชืจ, ืืืขืชื ื, ืืขืืื ืืงืืืืช ืขื kubernetes ืืื
ืกืงืจืืคื ืืืฉืงื ืืกืืคื ืฉื 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: ืคืืชืื ืืคืืขื
ืืืื ืืืืืืงื
ืืืื ื ืืืืืขืช ืืชืืกืฃ, ืืืืื ื ืืชืืจ ืืช ืื ืืืฉืืืืช ืืืกืืกืืืช ืฉื Kubernetes ืืืชื ื ืขืืื ืืฆืืจื ืฉื ืืืืงืืช TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, 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 = [];
}
}
ืืขืืจืช getters ื-seters, ื ืืื ืืืฆืื ืื ืืืืืืจ ืืช ืืืื ืืืฉืืช ืืืจืืฉืื ืื ื ืืฆืืจื ื ืืื ืืงืจืืื. ืืืืืื, ืคืื ืืขืืฆื ืฉื ืฆืืชื ืืขืื ืื ืืชื ืื ืืืงืฆืื:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
ืขืืืืื
ืจืฉืืื ืฉื ืื ืืคื ืืคืืืืื ืฉืื ื ืืชืืืจืช ืืชืืืื ื-pluing.json ืฉืื ื ืืกืขืืฃ ืืชืืืช:
ืืืืืง ืฉื ืื ืขืืื ืขืืื ื ืืฆืืื ืืช ื-PAGE NAME (ืืืืจ ืืื ืืื ืืืืจ ื-slug ืฉืืืืฆืขืืชื ืืฃ ืื ืืืื ื ืืืฉ); ืฉื ืืจืืื ืืืืจืื ืขื ืคืขืืืช ืืฃ ืื (ืจืฉืืืช ืืจืืืืื ืืืืฆืืช ื-modul.ts); ืฆืืื ืชืคืงืื ืืืฉืชืืฉ ืฉืขืืืจื ืืืื ื ืขืืืื ืขื ืืฃ ืื ืืืืืจืืช ื ืืืื ืขืืืจ ืกืจืื ืืฆื.
ืืจืืื ืืืืจืื ืขื ืคืขืืืช ืืขืืื, ืขืืื ื ืืืืืืจ templateUrl, ืืืขืืืจ ืฉื ืืช ืื ืชืื ืืงืืืฅ ื-html ืขื ืกืืืื. ืืชืื ืืืงืจ, ืืืืฆืขืืช ืืืจืงืช ืชืืืช, ืื ื ืืืืืื ืืืฉืช ืืขื 2 ืฉืืจืืชืื ืืืืืชืืื ืืฉืืืื:
- backendSrv - ืฉืืจืืช ืืืกืคืง ืืื ืืจืืงืฆืื ืขื ืฉืจืช ื-API ืฉื Grafana;
- datasourceSrv - ืฉืืจืืช ืืืกืคืง ืืื ืืจืืงืฆืื ืืงืืืืช ืขื ืื ืืงืืจืืช ืื ืชืื ืื ืืืืชืงื ืื ื-Grafana ืฉืื (ืืืืืื, ืฉืืืช .getAll() - ืืืืืจ ืจืฉืืื ืฉื ืื ืืงืืจืืช ืื ืชืื ืื ืืืืชืงื ืื; .get( ) - ืืืืืจื ืืืืืืงื ืืืคืข ืฉื ืืงืืจ ื ืชืื ืื ืกืคืฆืืคื.
ืืืง 4: ืืงืืจ ื ืชืื ืื
ืื ืงืืืช ืืืื ืฉื Grafana, Datasource ืืื ืืืืืง ืืืชื ืชืืกืฃ ืืื ืื ืืืืจืื: ืืฉ ืื ื ืงืืืช ืื ืืกื ืืฉืื module.js, ืืฉ ืงืืืฅ ืขื ืืื ืืืืข plugin.json. ืืืฉืจ ืืคืชืืื ืชืืกืฃ ืขื type = app, ืื ื ืืืืืื ืืงืืื ืืื ืืจืืงืฆืื ืื ืขื ืืงืืจืืช ืื ืชืื ืื ืืงืืืืื (ืืืืืื, prometheus-datasource) ืืื ืขื ืืงืืจืืช ืื ืชืื ืื ืฉืื ื, ืืืชื ื ืืื ืืืืกื ืืฉืืจืืช ืืกืคืจืืืช ืืคืืืืื (dist/datasource/*) ืื ืืืชืงืื ืืชืืืช. ืืืงืจื ืฉืื ื, ืืงืืจ ืื ืชืื ืื ืืืืข ืขื ืงืื ืืคืืืืื. ืืื ืื, ืืฉ ืฆืืจื ืืชืื ืืช config.html ืืืงืจ ConfigCtrl, ืฉืืฉืืฉื ืขืืืจ ืืฃ ืืชืฆืืจื ืฉื ืืืคืข ืืงืืจืืช ืื ืชืื ืื ืืืงืจ ืื ืชืื ืื ืฉื ืืงืืจ ืื ืชืื ืื, ืืฉืจ ืืืืฉื ืืช ืืืืืืื ืฉื ืืงืืจ ืื ืชืื ืื ืฉืื.
ืืชืืกืฃ KubeGraf, ืื ืงืืืช ืืื ืฉื ืืืฉืง ืืืฉืชืืฉ, ืืงืืจ ืื ืชืื ืื ืืื ืืืคืข ืฉื ืืฉืืื kubernetes ืฉืืืืฉื ืืช ืืืืืืืช ืืืืืช (ืงืื ืืงืืจ ืืืื
- ืืืกืืฃ ื ืชืื ืื ืืฉืจืช ื- api k8s (ืงืืืช ืจืฉืืื ืฉื ืืจืืื ืฉืืืช, ืคืจืืกืืช...)
- ืืขืืจืช ืืงืฉืืช ื-prometheus-datasource (ืฉื ืืืจ ืืืืืจืืช ืืคืืืืื ืขืืืจ ืื ืืฉืืื ืกืคืฆืืคื) ืืขืืฆืื ืชืืืืืช ืืฉืืืืฉ ืื ืชืื ืื ืื ืืืคืื ืกืืืืื ืืื ืืืืืืช ืืืืื ืื.
- ืขืืืื ื ืชืื ืื ืืืคื ืคืืืืื ืกืืืืื (ืขื ืงืฆื ืจืขื ืื ืืืืืจ).
- ืขืืืื ืฉืืืืชืืช ืืืฆืืจืช ืืืืืื ืชืื ืืช ื-grafana-dashboards (ืฉืืืช 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 ืขื ืืื ืฆืืื ืืชืืืช ืืืชืจ ืืืืืจืืช ืืืืืืช/ืืจืฉืื ืืืกืืกืืืช: ืื ืืกื-ืกืืกืื, ืื ืืงืื-ืืืฉืืจ/ืืคืชื ืืงืื. ืขื ืื ืช ืืืืฉื ืืช ืืืืืืช ืืืืืืจ ืืืฉื ืืืืฆืขืืช ืืกืืืื ื ืืฉื (ืืชืงื ืื ืคืงืื ื-k8s), ืืืื ื ืฆืจืืืื ืืขืฉืืช ืงืฆืช ืชืืงืื.
ืืื ืืคืชืืจ ืืขืื ืื, ืืชื ืืืื ืืืฉืชืืฉ ืืื ืื ืื "ืืกืืืื ืชืืกืฃ" ืืืืื ื ืฉื Grafana (ืคืจืืื ื ืืกืคืื ื-
/api/v8/namespaces ืขื ืืืืชืจืช Authorization: Bearer.
ืืืืคื ืืืขื, ืืื ืืขืืื ืขื ืฉืจืช ื-API k8s ืื ืื ื ืฆืจืืืื ืืฉืชืืฉ ืขื ืืืฉื ืืงืจืืื ืืืื, ืื ืืคืกืืื ืืืฆืืจื ืืืชื ืชืืืื ืืืฆืื ืื ื
ืืืง 5: ืฉืืจืืจ
ืืืืจ ืฉืืชืืช ืชืืกืฃ Grafana ืืฉืื, ืืืืคื ืืืขื ืชืจืฆื ืืืคืื ืืืชื ืืืืื ืืฆืืืืจ. ืืืจืืคืื ื ืืืื ืกืคืจืืืช ืชืืกืคืื ืืืืื ื ืืื
ืืื ืฉืืชืืกืฃ ืฉืื ืืืื ืืืื ืืื ืืช ืืจืฉืืืช, ืขืืื ืืืฆืข ืื"ืฆ
ืืืฉืจ ืืจืกื ืืื ืืืจืกื ืฉื ืืคืืืืื ืฉืื, url ืืื ืงืืฉืืจ ืืืืืจ, ื-commit ืืื ื-hash ืฉื ื-commit ืฉืขืืืจื ืืจืกื ืกืคืฆืืคืืช ืฉื ืืคืืืืื ืชืืื ืืืื ื.
ืืืคืื ืชืจืื ืชืืื ื ื ืคืืื ืืื:
ืื ืชืื ืื ืขืืืจื ืืืชืคืกื ืืืืืืืืช ืื-Readme.md, Changelog.md ืืืืงืืืฅ plugin.json ืขื ืชืืืืจ ืืคืืืืื.
ืืืง 6: ืืืงืื ืืกืงื ืืช
ืื ืืคืกืงื ื ืืคืชื ืืช ืืชืืกืฃ ืฉืื ื ืืืืจ ืืฉืืจืืจ. ืืขืืฉืื ืื ืื ื ืขืืืืื ืขื ื ืืืืจ ื ืืื ืฉื ืืฉืืืืฉ ืืืฉืืืื ืฉื ืฆืืชื ืืฉืืืืืช, ืืฆืืืื ืชืืื ืืช ืืืฉืืช ืืฉืืคืืจ ื-UX, ืืื ืืืจืืฃ ืืืืช ืืืืื ืฉื ืืฉืื ืฉืืชืงืื ืืืืจ ืืชืงื ืช ืืชืืกืฃ ืื ืขื ืืื ืืืงืืืืช ืฉืื ื ืืื ืืื ืฉืื ื-GitHub (ืื ืชืขืืื ืืงืฉืช ืืืขืื ืื ืืืฉืืื ืฉืื, ืื ื ืืฉืื ืืืื :)
ืื ื ืืงืืืื ืฉืืืืจ ืื ืืขืืืจ ืื ืืืืื ืืื ื ืคืื ืืื Grafana ืืืืื, ืืืชืื ืชืืกืฃ ืืฉืื.
ืชืืื!)
ืืงืืจ: www.habr.com