ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ! ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΠΏΡΡΠ½Π°Ρ
ΠΌΠ΅ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ Π½ΠΎΠ²ΠΈΡ ΡΠΈ open-source ΠΏΡΠΎΠ΅ΠΊΡ β Grafana ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° Kubernetes, ΠΊΠΎΠΉΡΠΎ Π½Π°ΡΠ΅ΠΊΠΎΡ
ΠΌΠ΅ . ΠΠ·Ρ
ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² . Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ Ρ Π²Π°Ρ ΠΈΡΡΠΎΡΠΈΡΡΠ° Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΡΠ·Π΄Π°Π΄ΠΎΡ
ΠΌΠ΅ ΠΏΠ»ΡΠ³ΠΈΠ½Π°, ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
ΠΌΠ΅ ΠΈ Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½ΠΈ ΠΊΠ°ΠΌΡΠ½ΠΈ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ
ΠΌΠ΅ Π² ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. ΠΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ!
Π§Π°ΡΡ 0 β Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅: ΠΊΠ°ΠΊ ΡΡΠΈΠ³Π½Π°Ρ ΠΌΠ΅ Π΄ΠΎ ΡΡΠΊ?
ΠΠ΄Π΅ΡΡΠ° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Grafana Π½ΠΈ Ρ ΡΡΠΌΠ½Π° Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ. ΠΠ°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ Π²Π΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 10 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π° Ρ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° web ΠΏΡΠΎΠ΅ΠΊΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ. ΠΡΠ΅Π· ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π°ΡΡΡΠΏΠ°Ρ ΠΌΠ΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π΅Π½ ΠΎΠΏΠΈΡ, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΈ Π·Π°Π΄ΡΠ»Π±ΠΎΡΠ΅Π½ΠΎ ΠΏΠΎΠ·Π½Π°Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ. Π Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠΈ Π·Π°Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ Π²ΡΠΏΡΠΎΡΠ°: βΠΠΌΠ° Π»ΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° Kubernetes, ΠΊΠΎΠΉΡΠΎ, ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ ΠΊΠ°Π·Π²Π°, βΡΠ»Π°Π³Π°Ρ ΠΈ Π·Π°Π±ΡΠ°Π²ΡΡβ?.. Π‘ΡΠ°Π½Π΄Π°ΡΡΡΡ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° k8s, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΠΎΡΠ΄Π°Π²Π½Π° Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΡΠ° Prometheus + Grafana. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΎΠ±ΡΠΈΡΠ΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠΎΠ²Π° ΡΡΠ΅ΠΊ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅: prometheus-operator, Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ°Π±Π»Π° kubernetes-mixin, grafana-kubernetes-app.
ΠΠ°ΠΉ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ Π·Π° Π½Π°Ρ ΡΠ΅ ΠΎΠΊΠ°Π·Π° ΠΏΠ»Π°Π³ΠΈΠ½ΡΡ grafana-kubernetes-app, Π½ΠΎ ΡΠΎΠΉ Π½Π΅ Π΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ ΠΎΡ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Ρ Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° node-exporter ΠΈ kube-state-metrics. Π Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅ΡΠΈΡ ΠΌΠ΅: βΠ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ Π»ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?β
ΠΠ°ΠΊΠ²ΠΈ ΠΈΠ΄Π΅ΠΈ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Π² Π½Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½:
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° βΠΊΠ°ΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎβ: ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Π³ΡΡΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎ namespaces, deployment-ΠΈβ¦;
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π²ΡΡΠ·ΠΊΠΈ ΠΎΡ ΡΠΈΠΏΠ° βdeployment β service (+ports)β.
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΏΠΎ nod-ΠΎΠ²Π΅ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
- ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ°: Prometheus ΠΈ k8s API ΡΡΡΠ²ΡΡ.
- ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ ΠΊΠ°ΠΊΡΠΎ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½Π°ΡΠ° ΡΠ°ΡΡ (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΏΠ°ΠΌΠ΅Ρ, Π΄ΠΈΡΠΊΠΎΠ²Π° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΌΡΠ΅ΠΆΠ°), ΡΠ°ΠΊΠ° ΠΈ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° β health-status Π½Π° pod-ΠΎΠ²Π΅, Π±ΡΠΎΠΉ Π½Π°Π»ΠΈΡΠ½ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° liveness/readiness ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ.
Π§Π°ΡΡ 1: ΠΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° βΠΏΠ»ΡΠ³ΠΈΠ½ΡΡ Π·Π° Grafanaβ?
ΠΡ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ° Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°, ΠΏΠ»ΡΠ³ΠΈΠ½ΡΡ Π·Π° Grafana Π΅ Angular ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π² data Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° Grafana (/var/grafana/plugins/<your_plugin_name>/dist/module.js) ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π·Π°ΡΠ΅Π΄Π΅Π½ ΠΊΠ°ΡΠΎ 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 ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ ΠΎΡ Π²ΡΡΠΊΠ°ΠΊΡΠ² ΡΠΈΠΏ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° : Π² ΡΠΎΠ·ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡΠΌ ΠΈΠΌΠ° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ starter-packβΠΎΠ²Π΅ (ΠΈΠΌΠ° Π΄Π°ΠΆΠ΅ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½ Ρ React) Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ ΠΈ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈ Π±ΠΈΠ»Π΄ ΡΠΈΡΡΠ΅ΠΌΠΈ.
Π§Π°ΡΡ 2: ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΡΡΠ΅Π΄Π°
ΠΠ° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ ΠΏΠ»ΡΠ³ΠΈΠ½Π°, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΡΠ΅ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ kubernetes-ΠΊΠ»ΡΡΡΠ΅Ρ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: prometheus, node-exporter, kube-state-metrics, grafana. Π‘ΡΠ΅Π΄Π°ΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠ²Π° Π±ΡΡΠ·ΠΎ, Π»Π΅ΡΠ½ΠΎ ΠΈ Π½Π΅ΡΡΠ΅ΡΠ½ΠΎ, Π° Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° hot-reload data-Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° Grafana ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠ°ΠΉ-ΡΠ΄ΠΎΠ±Π½ΠΈΡΡ, ΡΠΏΠΎΡΠ΅Π΄ Π½Π°Ρ, Π½Π°ΡΠΈΠ½ Π·Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ kubernetes Π΅ . Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Prometheus + Grafana Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° prometheus-operator. Π Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΏΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° prometheus-operator Π½Π° minikube. ΠΠ° Π΄Π° ΡΠ΅ Π²ΠΊΠ»ΡΡΠΈ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½ΡΠ½ΠΎΡΡ, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΡΡ persistence: true Π² ΡΠ°ΠΉΠ»Π° charts/grafana/values.yaml, Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ PV ΠΈ PVC ΠΈ Π΄Π° Π³ΠΈ Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° persistence.existingClaim
ΠΡΠΎΠ³ΠΎΠ²ΠΈΡΡ ΡΠΊΡΠΈΠΏΡ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° 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;
services: Array;
constructor(data: any){
super(data);
this.pods = [];
this.services = [];
}
}Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° getterβΠΈ ΠΈ setterβΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π½ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π½Π° ΡΡΡΠ½ΠΎΡΡΠΈΡΠ΅ ΠΏΠΎ ΡΠ΄ΠΎΠ±Π΅Π½ ΠΈ ΡΠ΅ΡΠΈΠ²Π΅Π½ Π½Π°ΡΠΈΠ½. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½ΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° allocatable cpu Π½Π° Π½ΠΎΠ΄Π°:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}Π‘ΡΡΠ°Π½ΠΈΡΠΈ
Π‘ΠΏΠΈΡΡΠΊΡΡ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° Π½Π°ΡΠ°ΡΠ° ΠΏΡΠΈΡΡΠ°Π²ΠΊΠ° ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π² Π½Π°ΡΠΈΡ pluing.json Π² ΡΠ°Π·Π΄Π΅Π»Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:

Π Π±Π»ΠΎΠΊΠ° Π·Π° Π²ΡΡΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΠΠΠ’Π ΠΠ Π‘Π’Π ΠΠΠΠ¦ΠΠ’Π (ΠΊΠΎΠ΅ΡΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½ΠΎ Π² slug, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π°); ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° (ΡΠΏΠΈΡΡΠΊΡΡ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΠ΅ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ° Π² module.ts); ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π·Π° ΡΠΎΠ»Ρ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Π·Π° ΠΊΠΎΠ³ΠΎΡΠΎ Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΡΠ° Π·Π° ΡΡΡΠ°Π½ΠΈΡΠ½Π°ΡΠ° Π»Π΅Π½ΡΠ°.
Π ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ templateUrl, ΠΏΡΠ΅Π΄Π°Π²Π°ΠΉΠΊΠΈ ΡΠ°ΠΌ ΠΏΡΡΡ Π΄ΠΎ html ΡΠ°ΠΉΠ»Π° Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ°. ΠΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠ°, ΡΡΠ΅Π· ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ 2 Π²Π°ΠΆΠ½ΠΈ angular ΡΡΠ»ΡΠ³ΠΈ:
- backendSrv β ΡΡΠ»ΡΠ³Π°, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ api-ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° Grafana;
- datasourceSrv β ΡΡΠ»ΡΠ³Π°, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠ° Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π²ΡΠΈΡΠΊΠΈ datasource, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π² Π²Π°ΡΠ°ΡΠ° Grafana (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΠΎΠ΄ΡΡ .getAll() β Π²ΡΡΡΠ° ΡΠΏΠΈΡΡΠΊ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ datasource; .get() β Π²ΡΡΡΠ° ΠΎΠ±Π΅ΠΊΡ-ΠΈΠ½ΡΡΠ°Π½Ρ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ 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 (ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·Π±ΠΈΡΠ° Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΊΠ»ΡΡΡΠ΅Ρ) ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΊΠ°ΠΊΡΠΎ Π² ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ Π² ΡΠ°Π±Π»Π° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
- Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° (Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» Π½Π° ΠΎΠ±Π½ΠΎΠ²ΡΠ²Π°Π½Π΅).
- ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡ Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΎΠ½Π΅Π½ ΡΠΏΠΈΡΡΠΊ Π² 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β (ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π° ). Π Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° Π½Π°ΡΠΈΡ datasource ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΎΠ±ΡΠ²ΠΈΠΌ Π½Π°Π±ΠΎΡ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΠΎΡΡΠΈΠ½Π³, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Π½ΠΈ ΠΎΡ proxy-ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° grafana. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡΠ΄Π΅Π»Π΅Π½ endpoint ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π°Π³Π»Π°Π²ΠΊΠΈ ΠΈΠ»ΠΈ url Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ, Π΄Π°Π½Π½ΠΈ Π·Π° ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈ ΠΎΡ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° jsonData ΠΈ secureJsonData (Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΈΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ΠΈ Π² ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½ Π²ΠΈΠ΄). Π Π½Π°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ Π²ΠΈΠ΄Π° /__proxy/api/v1/namespaces ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠΎΠΊΡΠΈΡΠ½ΠΈ Π½Π° url ΠΎΡ Π²ΠΈΠ΄Π°
/api/v1/namespaces Ρ Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° Π·Π°Π³Π»Π°Π²ΠΊΠ° Authorization: Bearer.


ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ api-ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° k8s Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Ρ ΠΏΡΠ°Π²Π° Π·Π° ΡΠ°ΠΌΠΎ ΡΠ΅ΡΠ΅Π½Π΅, ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² .
Π§Π°ΡΡ 5: ΠΈΠ·Π΄Π°Π½ΠΈΠ΅

Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡ ΡΠΈ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Grafana, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, ΡΠ΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π·Π° ΠΎΠ±ΡΠ΅ΡΡΠ²Π΅Π½ΠΎΡΡΡΠ°. Π Grafana ΠΈΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ, Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π° Π°Π΄ΡΠ΅Ρ
ΠΠ° Π΄Π° Π±ΡΠ΄Π΅ Π²Π°ΡΠΈΡΡ ΠΏΠ»ΡΠ³ΠΈΠ½ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ ΠΌΠ°Π³Π°Π·ΠΈΠ½, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ PR Π² , Π΄ΠΎΠ±Π°Π²ΡΠΉΠΊΠΈ Π² ΡΠ°ΠΉΠ»Π° repo.json ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ ΠΎΡ Π²ΠΈΠ΄Π°:

ΠΊΡΠ΄Π΅ΡΠΎ version β Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° Π²Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½, url β Π²ΡΡΠ·ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π° commit β hash Π½Π° ΠΊΠΎΠΌΠΈΡΠ°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π°.
Π Π½Π°ΠΊΡΠ°Ρ, ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΠ΄Π΅ΡΠ½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ° ΠΎΡ Π²ΠΈΠ΄Π°:

ΠΠ°Π½Π½ΠΈΡΠ΅ Π·Π° Π½Π΅Ρ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈ ΠΎΡ Π²Π°ΡΠΈΡ Readme.md, Changelog.md ΠΈ ΡΠ°ΠΉΠ»Π° plugin.json Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π°.
Π§Π°ΡΡ 6: Π²ΠΌΠ΅ΡΡΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
ΠΠ΅ ΡΠΌΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΠ»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½ ΡΠ»Π΅Π΄ ΡΠ΅Π»ΠΈΠ·Π°. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ°Π±ΠΎΡΠΈΠΌ Π²ΡΡΡ Ρ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° Π½ΠΎΠ΄ΠΎΠ²Π΅ΡΠ΅ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ°, Π²Π½Π΅Π΄ΡΡΠ²Π°ΠΌΠ΅ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° UX ΠΈ ΡΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ±ΡΠ°ΡΠ½Π° Π²ΡΡΠ·ΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΡΠ»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° ΠΊΠ°ΠΊΡΠΎ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Π² GitHub (Π°ΠΊΠΎ ΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π²Π°ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΈΠ»ΠΈ pull request, ΡΠ΅ Π±ΡΠ΄Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠ»ΠΈΠ² π ).
ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅ΡΠ΅ Ρ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Grafana ΠΈ, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ!)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
