ããã«ã¡ã¯ãã¿ããªïŒ æ°ãæåãç§ãã¡ã¯æ°ãããªãŒãã³ãœãŒã¹ ãããžã§ã¯ããéçšéå§ããŸãããããã¯ãkubernetes ãç£èŠããããã® Grafana ãã©ã°ã€ã³ã§ãã
ããŒã 0 - å ¥é: ã©ã®ããã«ããŠãã®ç¹ã«å°éããã®ã§ãããã?
Grafan çšã«ç¬èªã®ãã©ã°ã€ã³ãäœæãããšããã¢ã€ãã¢ã¯ããŸã£ããã®å¶ç¶ããæãã€ããŸããã åœç€Ÿã¯ 10 幎以äžã«ããããããŸããŸãªã¬ãã«ã®è€éãã® Web ãããžã§ã¯ããç£èŠããŠããŸããã ãã®éãç§ãã¡ã¯ããŸããŸãªç£èŠã·ã¹ãã ã®äœ¿çšã«é¢ããå°éç¥èãèå³æ·±ãäºäŸãçµéšã倧éã«èç©ããŠããŸããã ãããŠããæç¹ã§ãç§ãã¡ã¯èªåããŸããããããèšãããããã«ãKubernetes ãç£èŠããããã®éæ³ã®ããŒã«ã¯ããã ããã?ããã¡ããŠã¹ãšã°ã©ãã¡ãã®çµã¿åããã ãããŠããã®ã¹ã¿ãã¯çšã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãšããŠãprometheus-operatorãkubernetes-mixin ããã·ã¥ããŒãã®ã»ãããgrafana-kubernetes-app ãªã©ãããŸããŸãªçš®é¡ã®ããŒã«ã®å€§èŠæš¡ãªã»ããããããŸãã
ç§ãã¡ã«ãšã£ãŠ grafana-kubernetes-app ãã©ã°ã€ã³ãæãèå³æ·±ããªãã·ã§ã³ã§ããããã«èŠããŸããããXNUMX 幎以äžãµããŒããããŠããããããã«ãnode-exporter ããã³ kube-state-metrics ã®æ°ããããŒãžã§ã³ã§ã¯åäœããŸããã ãããŠããæç¹ã§ãç§ãã¡ã¯ãèªåãã¡ã§æ±ºæãã¹ãã§ã¯ãªããããšæ±ºå¿ããŸããã
ãã©ã°ã€ã³ã«å®è£ ããããšã«ããã¢ã€ãã¢:
- ãã¢ããªã±ãŒã·ã§ã³ ããããã®èŠèŠå: åå空éããããã€ã¡ã³ãããšã«ã°ã«ãŒãåããããã¯ã©ã¹ã¿ãŒå ã®ã¢ããªã±ãŒã·ã§ã³ã®äŸ¿å©ãªè¡šç€ºã
- ãããã〠- ãµãŒãã¹ (+ããŒã)ããªã©ã®æ¥ç¶ã®èŠèŠåã
- ã¯ã©ã¹ã¿ãŒ ããŒãå šäœã«ãããã¯ã©ã¹ã¿ãŒ ã¢ããªã±ãŒã·ã§ã³ã®åæ£ãèŠèŠåããŸãã
- Prometheus ããã³ k8s API ãµãŒããŒãªã©ãããã€ãã®ãœãŒã¹ããã®ã¡ããªã¯ã¹ãšæ å ±ã®åéã
- ã€ã³ãã©ã¹ãã©ã¯ãã£éšå (CPU æéãã¡ã¢ãªããã£ã¹ã¯ ãµãã·ã¹ãã ããããã¯ãŒã¯ã®äœ¿çš) ãšã¢ããªã±ãŒã·ã§ã³ ããžã㯠(å¥å šæ§ã¹ããŒã¿ã¹ ããããå©çšå¯èœãªã¬ããªã«ã®æ°ã掻æ§/æºåãã¹ãã®åæ Œã«é¢ããæ å ±) ã®äž¡æ¹ãç£èŠããŸãã
ããŒã 1: ãGrafana ãã©ã°ã€ã³ããšã¯äœã§ãã?
æè¡çãªèŠ³ç¹ããèŠããšãGrafana ã®ãã©ã°ã€ã³ã¯ Angular ã³ã³ãããŒã©ãŒã§ãããGrafana ããŒã¿ ãã£ã¬ã¯ã㪠(/var/grafana/ãã©ã°ã€ã³/ /dist/module.js)ãSystemJS ã¢ãžã¥ãŒã«ãšããŠããŒãã§ããŸãã ãŸãããã®ãã£ã¬ã¯ããªã«ã¯ããã©ã°ã€ã³ã«é¢ãããã¹ãŠã®ã¡ã¿æ å ± (ååãããŒãžã§ã³ããã©ã°ã€ã³ ã¿ã€ãããªããžããª/ãµã€ã/ã©ã€ã»ã³ã¹ãžã®ãªã³ã¯ãäŸåé¢ä¿ãªã©) ãå«ã plugin.json ãã¡ã€ã«ãããã¯ãã§ãã
ã¢ãžã¥ãŒã«.ts
ãã©ã°ã€ã³.json
ã¹ã¯ãªãŒã³ã·ã§ããã§ãããããã«ãplugin.type = app ãšæå®ããŸããã Grafana ã®ãã©ã°ã€ã³ã«ã¯ XNUMX ã€ã®ã¿ã€ããããããã§ãã
ããã«: æãäžè¬çãªã¿ã€ãã®ãã©ã°ã€ã³ - ããããã¡ããªã¯ã¹ãèŠèŠåããããã®ããã«ã§ãããããŸããŸãªããã·ã¥ããŒãã®æ§ç¯ã«äœ¿çšãããŸãã
æ
å ±æº: äžéšã®ããŒã¿ ãœãŒã¹ãžã®ãã©ã°ã€ã³ ã³ãã¯ã¿ (äŸ: Prometheus-datasourceãClickHouse-datasourceãElasticSearch-datasource)ã
ã¢ããª: Grafana å
ã§ç¬èªã®ããã³ããšã³ã ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããç¬èªã® HTML ããŒãžãäœæããããŒã¿ãœãŒã¹ã«æåã§ã¢ã¯ã»ã¹ããŠããŸããŸãªããŒã¿ãèŠèŠåã§ãããã©ã°ã€ã³ã§ãã ãŸããä»ã®ã¿ã€ãã®ãã©ã°ã€ã³ (ããŒã¿ãœãŒã¹ãããã«) ãããŸããŸãªããã·ã¥ããŒããäŸåé¢ä¿ãšããŠäœ¿çšã§ããŸãã
type=app ã®ãã©ã°ã€ã³ã®äŸåé¢ä¿ã®äŸ.
ããã°ã©ãã³ã°èšèªãšã㊠JavaScript ãš TypeScript ã®äž¡æ¹ã䜿çšã§ããŸã (ç§ãã¡ããããéžæããŸãã)ã å¯èœãªããããçš®é¡ã® hello-world ãã©ã°ã€ã³ã®æºå
ããŒã 2: ããŒã«ã«ç°å¢ã®æºå
ãã©ã°ã€ã³ãæäœããã«ã¯ãåœç¶ã®ããšãªãããprometheusãnode-exporterãkube-state-metricsãgrafana ãªã©ã®ãã¹ãŠã®ããŒã«ãããªã€ã³ã¹ããŒã«ããã kubernetes ã¯ã©ã¹ã¿ãŒãå¿ èŠã§ãã ç°å¢ã¯è¿ éãç°¡åããããŠèªç¶ã«ã»ããã¢ãããããå¿ èŠããããããããªããŒãã確å®ã«ããããã«ã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: å®éã®éçº
ãªããžã§ã¯ãã¢ãã«
ãã©ã°ã€ã³ã®å®è£ ã®æºåãšããŠãTypeScript ã¯ã©ã¹ã®åœ¢åŒã§äœæ¥ãããã¹ãŠã®åºæ¬ç㪠Kubernetes ãšã³ãã£ã㣠(ãããããããã€ã¡ã³ããããŒã¢ã³ã»ãããã¹ããŒããã«ã»ããããžã§ããcronjobããµãŒãã¹ãããŒããåå空é) ãèšè¿°ããããšã«ããŸããã ãããã®åã¯ã©ã¹ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒããã¹ãã©ã¯ã¿ãŒãå¯èŠæ§ãæŽæ°ããã³åãæ¿ããããã®ã¡ãœãããèšè¿°ããå ±éã® 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 = [];
}
}
ã²ãã¿ãŒãšã»ãã¿ãŒã䜿çšãããšãå¿ èŠãªãšã³ãã£ã㣠ã¡ããªãã¯ã䟿å©ã§èªã¿ããã圢åŒã§è¡šç€ºãŸãã¯èšå®ã§ããŸãã ããšãã°ãå²ãåœãŠå¯èœãª CPU ããŒãã®ãã©ãŒããããããåºåã¯æ¬¡ã®ããã«ãªããŸãã
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
ããŒãž
ãã¹ãŠã®ãã©ã°ã€ã³ ããŒãžã®ãªã¹ãã¯ãæåã«äŸåé¢ä¿ã»ã¯ã·ã§ã³ã® pluing.json ã«èšè¿°ãããŠããŸãã
åããŒãžã®ãããã¯ã§ã¯ãããŒãžåãæå®ããå¿
èŠããããŸã (ããŒãžåã¯ã¹ã©ãã°ã«å€æããããã®ããŒãžã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸã)ã ãã®ããŒãžã®æäœãæ
åœããã³ã³ããŒãã³ãã®åå (ã³ã³ããŒãã³ãã®ãªã¹ã㯠module.ts ã«ãšã¯ã¹ããŒããããŸã)ã ãã®ããŒãžã§ã®äœæ¥ãå¯èœãªãŠãŒã¶ãŒã®åœ¹å²ãšãµã€ãããŒã®ããã²ãŒã·ã§ã³èšå®ã瀺ããŸãã
ããŒãžã®æäœãæ åœããã³ã³ããŒãã³ãã§ãtemplateUrl ãèšå®ããããŒã¯ã¢ãããå«ã html ãã¡ã€ã«ãžã®ãã¹ãæž¡ãå¿ èŠããããŸãã ã³ã³ãããŒã©ãŒå ã§ã¯ãäŸåé¢ä¿ã®æ³šå ¥ãéããŠãæ倧 2 ã€ã®éèŠãª Angular ãµãŒãã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
- backendSrv - Grafana API ãµãŒããŒãšã®å¯Ÿè©±ãæäŸãããµãŒãã¹ã
- datasourceSrv - Grafana ã«ã€ã³ã¹ããŒã«ãããŠãããã¹ãŠã®ããŒã¿ãœãŒã¹ãšã®ããŒã«ã«å¯Ÿè©±ãæäŸãããµãŒãã¹ (ããšãã°ã .getAll() ã¡ãœãã - ã€ã³ã¹ããŒã«ãããŠãããã¹ãŠã®ããŒã¿ãœãŒã¹ã®ãªã¹ããè¿ããŸãã ) - ç¹å®ã®ããŒã¿ãœãŒã¹ã®ã€ã³ã¹ã¿ã³ã¹ ãªããžã§ã¯ããè¿ããŸãã
ããŒã 4: ããŒã¿ãœãŒã¹
Grafana ã®èŠ³ç¹ããèŠããšãdatasource ã¯ä»ã®ãã¹ãŠã®ãã©ã°ã€ã³ãšãŸã£ããåãã§ããç¬èªã®ãšã³ã㪠ãã€ã³ã module.js ããããã¡ã¿æ å ±ãå«ãŸãããã¡ã€ã« plugin.json ããããŸãã type = app ã§ãã©ã°ã€ã³ãéçºããå Žåãæ¢åã®ããŒã¿ãœãŒã¹ (prometheus-datasource ãªã©) ãšç¬èªã®ããŒã¿ãœãŒã¹ã®äž¡æ¹ãæäœã§ãããã©ã°ã€ã³ ãã£ã¬ã¯ã㪠(dist/datasource/*) ã«çŽæ¥ä¿åããããäŸåé¢ä¿ãšããŠã€ã³ã¹ããŒã«ã§ããŸãã ç§ãã¡ã®å ŽåãããŒã¿ãœãŒã¹ã«ã¯ãã©ã°ã€ã³ ã³ãŒããä»å±ããŠããŸãã ãŸããconfig.html ãã³ãã¬ãŒããš ConfigCtrl ã³ã³ãããŒã©ãŒãå¿ èŠã§ãããããã¯ãããŒã¿ãœãŒã¹ ã€ã³ã¹ã¿ã³ã¹æ§æããŒãžãšãããŒã¿ãœãŒã¹ã®ããžãã¯ãå®è£ ããããŒã¿ãœãŒã¹ ã³ã³ãããŒã©ãŒã«äœ¿çšãããŸãã
KubeGraf ãã©ã°ã€ã³ã§ã¯ããŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã®èŠ³ç¹ããèŠããšãããŒã¿ãœãŒã¹ã¯æ¬¡ã®æ©èœãå®è£
ãã kubernetes ã¯ã©ã¹ã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ã§ã (ãœãŒã¹ ã³ãŒãã¯å©çšå¯èœã§ã)
- k8s API ãµãŒããŒããããŒã¿ãåéãã (åå空éããããã€ã¡ã³ãã®ãªã¹ããååŸãããªã©)
- prometheus-datasource (ç¹å®ã®ã¯ã©ã¹ã¿ãŒããšã«ãã©ã°ã€ã³èšå®ã§éžæ) ãžã®ãªã¯ãšã¹ãããããã·ããéçããŒãžãšããã·ã¥ããŒãã®äž¡æ¹ã§ããŒã¿ã䜿çšããããã«å¿çããã©ãŒãããããŸãã
- éçãã©ã°ã€ã³ ããŒãžã®ããŒã¿ãæŽæ°ããŸã (ãªãã¬ãã·ã¥ ã¬ãŒããèšå®ãããŠããŸã)ã
- 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 ã䜿çšããŠãæçµããŒã¿ ãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãæ§æã§ããŸãã ãã®ã³ã³ããŒãã³ãã䜿çšãããšãURL ãšåºæ¬çãªèªèšŒ/èªå¯èšå® (ãã°ã€ã³ ãã¹ã¯ãŒãããŸãã¯ã¯ã©ã€ã¢ã³ã蚌ææž/ã¯ã©ã€ã¢ã³ã ããŒ) ãæå®ããŠãhttp ããŒã¿ ãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãæ§æã§ããŸãã ãã¢ã©ãŒ ããŒã¯ã³ (k8s ã®äºå®äžã®æšæº) ã䜿çšããŠã¢ã¯ã»ã¹ãæ§æããæ©èœãå®è£ ããã«ã¯ãå°ã調æŽããå¿ èŠããããŸããã
ãã®åé¡ã解決ããã«ã¯ãçµã¿èŸŒã¿ã® Grafana ã®ããã©ã°ã€ã³ ã«ãŒããã¡ã«ããºã ã䜿çšã§ããŸã (詳现ã«ã€ããŠã¯ã
/api/v8/namespaces ãš Authorization: Bearer ããããŒã
åœç¶ã®ããšãªãããk8s API ãµãŒããŒãæäœããã«ã¯ãèªã¿åãå°çšã¢ã¯ã»ã¹æš©ãæã€ãŠãŒã¶ãŒãå¿
èŠã§ããäœæçšã®ãããã§ã¹ãã次ã®å Žæã«ãããŸãã
ããŒã 5: ãªãªãŒã¹
ç¬èªã® Grafana ãã©ã°ã€ã³ãäœæããããåœç¶ããããå
¬éããããªãã§ãããã Grafana ã§ã¯ãããã¯ããã§å©çšã§ãããã©ã°ã€ã³ã®ã©ã€ãã©ãªã§ã
ãã©ã°ã€ã³ãå
¬åŒã¹ãã¢ã§å
¥æã§ããããã«ããã«ã¯ã次㮠URL 㧠PR ãè¡ãå¿
èŠããããŸãã
ããã§ãversion ã¯ãã©ã°ã€ã³ã®ããŒãžã§ã³ãurl ã¯ãªããžããªãžã®ãªã³ã¯ãcommit ã¯ãã©ã°ã€ã³ã®ç¹å®ã®ããŒãžã§ã³ãå©çšå¯èœã«ãªãã³ãããã®ããã·ã¥ã§ãã
åºåã§ã¯ã次ã®ãããªçŽ æŽãããç»åã衚瀺ãããŸãã
ãã®ããŒã¿ã¯ãReadme.mdãChangelog.mdãããã³ãã©ã°ã€ã³ã®èª¬æãå«ã plugin.json ãã¡ã€ã«ããèªåçã«ååŸãããŸãã
ããŒã 6: çµè«ã§ã¯ãªã
ç§ãã¡ã¯ãªãªãŒã¹åŸããã©ã°ã€ã³ã®éçºãåæ¢ããŸããã§ããã ãããŠçŸåšãç§ãã¡ã¯ã¯ã©ã¹ã¿ãŒ ããŒãã®ãªãœãŒã¹ã®äœ¿çšç¶æ³ãæ£ããç£èŠããUX ãåäžãããæ°æ©èœãå°å ¥ãããã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«åŸã«ã¯ã©ã€ã¢ã³ããš GitHub äžã®äººã ã®äž¡æ¹ããåãåã£ã倧éã®ãã£ãŒãããã¯ãåéããããšã«åãçµãã§ããŸã (çµäºããå Žå)ããªãã®åé¡ãŸãã¯ãã«ãªã¯ãšã¹ããç§ã¯ãšãŠã幞ãã§ã:)
ãã®èšäºã Grafana ã®ãããªçŽ æŽãããããŒã«ãç解ããå Žåã«ãã£ãŠã¯ç¬èªã®ãã©ã°ã€ã³ãäœæããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ããããšãããããŸãïŒïŒ
åºæïŒ habr.com