ΠΡΠ΅ΠΌ ΠΏΡΠΈΠ²Π΅Ρ! ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡΡΠ΅Π² Π½Π°Π·Π°Π΄ ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠ»ΠΈ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½ Π½Π°Ρ Π½ΠΎΠ²ΡΠΉ open-source ΠΏΡΠΎΠ΅ΠΊΡ β Grafana-ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° kubernetes, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Π·Π²Π°Π»ΠΈ
Π§Π°ΡΡΡ 0 β Π²Π²ΠΎΠ΄Π½Π°Ρ: ΠΊΠ°ΠΊ ΠΌΡ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠΊΠ°ΡΠΈΠ»ΠΈΡΡ?
ΠΠ΄Π΅Ρ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ GrafanβΡ Ρ Π½Π°Ρ ΡΠΎΠ΄ΠΈΠ»Π°ΡΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ. ΠΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΡΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ 10 Π»Π΅Ρ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ΠΎΠΌ web-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ² ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠ° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΌΡ Π½Π°ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π±ΠΎΠ»ΡΡΠΎΠΉ Π±Π°Π³Π°ΠΆ ΡΠΊΡΠΏΠ΅ΡΡΠΈΠ·Ρ, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΊΠ΅ΠΉΡΠΎΠ², ΠΎΠΏΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°. Π Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈΡΡ Π²ΠΎΠΏΡΠΎΡΠΎΠΌ: Β«Π ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π»ΠΈ Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° Kubernetes, ΡΡΠΎΠ±Ρ, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, βΠΏΠΎΡΡΠ°Π²ΠΈΠ» ΠΈ Π·Π°Π±ΡΠ»βΒ»?.. ΠΡΠΎΠΌΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ Π΄Π»Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π° k8s, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π΄Π°Π²Π½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ²ΡΠ·ΠΊΠ° Prometheus + Grafana. Π Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π³ΠΎΡΠΎΠ²ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΡΡΠΊΠ° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ Π½Π°Π±ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΎΠ΄Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²: prometheus-operator, Π½Π°Π±ΠΎΡ Π΄Π°ΡΠ±ΠΎΡΠ΄ΠΎΠ² kubernetes-mixin, grafana-kubernetes-app.
ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠΌ Π΄Π»Ρ Π½Π°Ρ ΠΏΠΎΠΊΠ°Π·Π°Π»ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ grafana-kubernetes-app, Π½ΠΎ ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΆΠ΅ Π±ΠΎΠ»ΡΡΠ΅ Π³ΠΎΠ΄Π° ΠΈ, ΠΊ ΡΠΎΠΌΡ ΠΆΠ΅, Π½Π΅ ΡΠΌΠ΅Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½ΠΎΠ²ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ node-exporterβΠ° ΠΈ kube-state-metricsβΠ°. Π Π² ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ: Β«Π Π½Π΅ ΡΠ΄Π΅Π»Π°ΡΡ Π»ΠΈ Π½Π°ΠΌ ΡΠ²ΠΎΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?Β»
ΠΠ°ΠΊΠΈΠ΅ ΠΈΠ΄Π΅ΠΈ ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π΅:
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Β«ΠΊΠ°ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΒ»: ΡΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅, ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠΎ namespaceβΠ°ΠΌ, deploymentβΠ°ΠΌβ¦;
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ²ΡΠ·Π΅ΠΉ Π²ΠΈΠ΄Π° Β«deployment β service (+ports)Β».
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΏΠΎ nodβΠ°ΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
- ΡΠ±ΠΎΡ ΠΌΠ΅ΡΡΠΈΠΊ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ²: Prometheus ΠΈ k8s api server.
- ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΊΠ°ΠΊ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΏΠ°ΠΌΡΡΠΈ, Π΄ΠΈΡΠΊΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ, ΡΠ΅ΡΠΈ), ΡΠ°ΠΊ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β health-status podβΠΎΠ², ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ liveness/readyness-ΠΏΡΠΎΠ±.
Π§Π°ΡΡΡ 1: Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Β«ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ GrafanaΒ»?
Π‘ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ, ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ Grafana β ΡΡΠΎ angular-ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² data-Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ GrafanβΡ (/var/grafana/plugins/<your_plugin_name>/dist/module.js) ΠΈ ΠΌΠΎΠΆeΡ Π±ΡΡΡ Π·Π°Π³ΡΡΠΆΠ΅Π½ ΠΊΠ°ΠΊ SystemJS-ΠΌΠΎΠ΄ΡΠ»Ρ. Π’Π°ΠΊΠΆΠ΅ Π² ΡΡΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ ΡΠ°ΠΉΠ» plugin.json, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π² ΡΠ΅Π±Π΅ Π²ΡΡ ΠΌΠ΅ΡΠ°ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π²Π°ΡΠ΅ΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π΅: Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π²Π΅ΡΡΠΈΡ, ΡΠΈΠΏ ΠΏΠ»Π°Π³ΠΈΠ½Π°, ΡΡΡΠ»ΠΊΠΈ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ/ΡΠ°ΠΉΡ/Π»ΠΈΡΠ΅Π½Π·ΠΈΡ, Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
module.ts
plugin.json
ΠΠ°ΠΊ Π²ΠΈΠ΄Π½ΠΎ Π½Π° ΡΠΊΡΠΈΠ½ΡΠΎΡΠ΅, ΠΌΡ ΡΠΊΠ°Π·Π°Π»ΠΈ plugin.type = app. ΠΠ±ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π΄Π»Ρ Grafana ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΡΠ΅Ρ Π²ΠΈΠ΄ΠΎΠ²:
panel: ΡΠ°ΠΌΡΠΉ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² β ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΏΠ°Π½Π΅Π»Ρ Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ ΠΌΠ΅ΡΡΠΈΠΊ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π΄Π°ΡΠ±ΠΎΡΠ΄ΠΎΠ².
datasource: ΠΏΠ»Π°Π³ΠΈΠ½-ΠΊΠΎΠ½Π½Π΅ΠΊΡΠΎΡ Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ
(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: ΠΏΠ»Π°Π³ΠΈΠ½, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ Π²Π°ΠΌ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΡΠ²ΠΎΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΡΠΎΠ½ΡΠ΅Π½Π΄-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡΡΡΠΈ Grafana, ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ html-ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ Π²ΡΡΡΠ½ΡΡ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ datasource Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π΄Π°Π½Π½ΡΡ
. Π’Π°ΠΊΠΆΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π΄ΡΡΠ³ΠΈΡ
ΡΠΈΠΏΠΎΠ² (datasource, panel) ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π΄Π°ΡΠ±ΠΎΡΠ΄Ρ.
ΠΡΠΈΠΌΠ΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½Π° Ρ type = app.
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ JavaScript, ΡΠ°ΠΊ ΠΈ TypeScript (ΠΌΡ ΡΠ²ΠΎΠΉ Π²ΡΠ±ΠΎΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ Π½Π° Π½Π΅ΠΌ). ΠΠ°Π³ΠΎΡΠΎΠ²ΠΊΠΈ Π΄Π»Ρ hello-world ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅
Π§Π°ΡΡΡ 2: ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
ΠΠ»Ρ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Π½Π°ΠΌ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ kubernetes-ΠΊΠ»Π°ΡΡΠ΅Ρ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΏΡΠ΅Π΄ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ: prometheus, node-exporter, kube-state-metrics, grafana. ΠΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ΅ΡΠ°ΠΏΠΈΡΡΡΡ Π±ΡΡΡΡΠΎ, Π»Π΅Π³ΠΊΠΎ ΠΈ Π½Π΅ΠΏΡΠΈΠ½ΡΠΆΠ΄Π΅Π½Π½ΠΎ, Π° Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ hot-reload data-Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ 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, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠΏΠΈΡΠ°Π½Ρ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ, ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΠΏΠΈΡΠ°Π½Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΡΡΠ½ΠΎΡΡΡΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠΈΡΠΎΠΊ podβΠΎΠ² Ρ ΡΡΡΠ½ΠΎΡΡΠΈ ΡΠΈΠΏΠ° deployment.
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 = [];
}
}
C ΠΏΠΎΠΌΠΎΡΡΡ getterβΠΎΠ² ΠΈ setterβΠΎΠ² ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ»ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΠΌ ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ Π² ΡΠ΄ΠΎΠ±Π½ΠΎΠΌ ΠΈ ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ allocatable cpu nodβΡ:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
Pages
Π‘ΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΈΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² Π½Π°ΡΠ΅ΠΌ pluing.json Π² ΡΠ°Π·Π΄Π΅Π»Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ:
Π Π±Π»ΠΎΠΊΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΠΠΠΠΠΠΠ Π‘Π’Π ΠΠΠΠ¦Π« (ΠΎΠ½ΠΎ Π·Π°ΡΠ΅ΠΌ Π±ΡΠ΄Π΅Ρ ΡΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π² slug, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΡΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½Π°); Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ΅Π³ΠΎ Π·Π° ΡΠ°Π±ΠΎΡΡ ΡΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ (ΡΠΏΠΈΡΠΎΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΡΠΊΡΠΏΠΎΡΡΠΈΡΡΡ Π² module.ts); ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΡΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ΠΉ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΠΈ Π΄Π»Ρ Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ.
Π ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅, ΠΎΡΠ²Π΅ΡΠ°ΡΡΠ΅ΠΌ Π·Π° ΡΠ°Π±ΠΎΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ templateUrl, ΠΏΠ΅ΡΠ΅Π΄Π°Π² ΡΡΠ΄Π° ΠΏΡΡΡ Π΄ΠΎ html-ΡΠ°ΠΉΠ»Π° Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΎΠΉ. ΠΠ½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, ΡΠ΅ΡΠ΅Π· dependency injection, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ 2-Ρ Π²Π°ΠΆΠ½ΡΡ angular-ΡΠ΅ΡΠ²ΠΈΡΠΎΠ²:
- backendSrv β ΡΠ΅ΡΠ²ΠΈΡ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ api-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π³ΡΠ°ΡΠ°Π½Ρ;
- datasourceSrv β ΡΠ΅ΡΠ²ΠΈΡ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ datasource, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌΠΈ Π² Π²Π°ΡΠ΅ΠΉ Grafana (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΠΎΠ΄ .getAll() β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ Π²ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΡ datasourceβΠΎΠ²; .get(<nΠ°me>) β Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ-ΠΈΠ½ΡΡΠ°Π½Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ datasource.
Π§Π°ΡΡΡ 4: datasource
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Grafana, datasource ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠ°ΠΊ ΠΈ Π²ΡΠ΅ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅: Ρ Π½Π΅Π³ΠΎ Π΅ΡΡΡ ΡΠ²ΠΎΡ ΡΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° module.js, Π΅ΡΡΡ ΡΠ°ΠΉΠ» Ρ ΠΌΠ΅ΡΠ°ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ plugin.json. ΠΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° Ρ type = app ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ Ρ ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΌΠΈ datasourceβΠ°ΠΌΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, prometheus-datasource), ΡΠ°ΠΊ ΠΈ ΡΠ²ΠΎΠΈΠΌΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Ρ ΡΠ°Π½ΠΈΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° (dist/datasource/*) ΠΈΠ»ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΊΠ°ΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ datasource ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π°. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° config.html ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ConfigCtrl, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° datasourceβΠ° ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Datasource, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ Π²Π°ΡΠ΅Π³ΠΎ datasourceβΠ°.
Π ΠΏΠ»Π°Π³ΠΈΠ½Π΅ KubeGraf, Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, datasource ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ kubernetes-ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ (ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π΄ΠΎΡΡΡΠΏΠ΅Π½
- Π·Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· api-serverβΠ° k8s (ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° namespaceβΠΎΠ², deploymentβΠΎΠ²β¦)
- ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² prometheus-datasource (ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°) ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠΎΠ² Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΊΠ°ΠΊ Π² ΡΡΠ°ΡΠΈΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΠ°Ρ , ΡΠ°ΠΊ ΠΈ Π² Π΄Π°ΡΠ±ΠΎΡΠ΄Π°Ρ .
- ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΡΡ ΡΡΡΠ°Π½ΠΈΡΠ°Ρ ΠΏΠ»Π°Π³ΠΈΠ½Π° (Ρ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ refresh rate).
- ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π·Π°ΠΏΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ template-Π»ΠΈΡΡΠ° Π² 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"};
})
}
ΠΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ, Π½Π° Π½Π°Ρ Π²Π·Π³Π»ΡΠ΄, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ datasource. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ° Π΄ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Grafana β datasourceHttpSettings. Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΡΡΡΠΎΠΈΡΡ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ http-ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ , ΡΠΊΠ°Π·Π°Π² url ΠΈ Π±Π°Π·ΠΎΠ²ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ/Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ: Π»ΠΎΠ³ΠΈΠ½-ΠΏΠ°ΡΠΎΠ»Ρ, ΠΈΠ»ΠΈ client-cert/client-key. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π΄ΠΎΡΡΡΠΏΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ bearer-ΡΠΎΠΊΠ΅Π½Π° (Π΄Π΅ΡΠ°ΠΊΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡ Π΄Π»Ρ k8s), ΠΏΡΠΈΡΠ»ΠΎΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Β«ΠΏΠΎΡ ΠΈΠΌΠΈΡΠΈΡΡΒ».
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ Grafana Β«Plugin RoutesΒ» (ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π½Π°
<your_k8s_api_url>/api/v1/namespaces Ρ ΠΏΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Authorization: Bearer .
ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ api-ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ k8s Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Ρ readonly Π΄ΠΎΡΡΡΠΏΠ°ΠΌΠΈ, ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π½Π°ΠΉΡΠΈ Π²
Π§Π°ΡΡΡ 5: ΡΠ΅Π»ΠΈΠ·
ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ Grafana, Π²Π°ΠΌ, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π·Π°Ρ
ΠΎΡΠ΅ΡΡΡ Π²ΡΠ»ΠΎΠΆΠΈΡΡ Π΅Π³ΠΎ Π² ΠΎΡΠΊΡΡΡΡΠΉ Π΄ΠΎΡΡΡΠΏ. Π Grafana ΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Π΄ΠΎΡΡΡΠΏΠ½Π°Ρ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ Π²Π°Ρ ΠΏΠ»Π°Π³ΠΈΠ½ Π±ΡΠ» Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΡΡΠΎΡΠ΅, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ PR Π²
Π³Π΄Π΅ version β Π²Π΅ΡΡΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°, url β ΡΡΡΠ»ΠΊΠ° Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ, Π° commit β hash ΠΊΠΎΠΌΠΌΠΈΡΠ°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½Π°.
Π Π½Π° Π²ΡΡ ΠΎΠ΄Π΅ Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΡΡ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ Π²ΠΈΠ΄Π°:
ΠΠ°Π½Π½ΡΠ΅ Π΄Π»Ρ Π½Π΅Π΅ Π±ΡΠ΄ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ³ΡΠ°Π±Π»Π΅Π½Ρ Ρ Π²Π°ΡΠ΅Π³ΠΎ Readme.md, Changelog.md ΠΈ ΡΠ°ΠΉΠ»Π° plugin.json Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π°.
Π§Π°ΡΡΡ 6: Π²ΠΌΠ΅ΡΡΠΎ Π²ΡΠ²ΠΎΠ΄ΠΎΠ²
ΠΡ Π½Π΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠ»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π»ΠΈΠ·Π°. Π ΡΠ΅ΠΉΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Π½Π°Π΄ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² Π½ΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²ΡΡ ΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ UX, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·Π³ΡΠ΅Π±Π°Π΅ΠΌ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΡΠΈΠ΄Π±Π΅ΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΊΠ°ΠΊ Π½Π°ΡΠΈΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ, ΡΠ°ΠΊ ΠΈ ΠΈΠ· ΠΈΡΡΡΠ΅Π² Π½Π° Π³ΠΈΡΡ Π°Π±Π΅ (Π΅ΡΠ»ΠΈ Π²Ρ ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ²ΠΎΠ΅ issue ΠΈΠ»ΠΈ pull request, Ρ Π±ΡΠ΄Ρ ΠΎΡΠ΅Π½Ρ ΡΡΠ°ΡΡΠ»ΠΈΠ² π ).
ΠΠ°Π΄Π΅Π΅ΠΌΡΡ ΡΡΠΎ Π΄Π°Π½Π½Π°Ρ ΡΡΠ°ΡΡΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΡΠ°ΠΊΠΎΠΌ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ΅ ΠΊΠ°ΠΊ Grafana ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ!)
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com