Ak vaše služby bežia za Traefik ingress controllerom, metriky už máte — Traefik počíta každú požiadavku, stavový kód aj čas odozvy. V tomto návode ich napojíme na Prometheus a zobrazíme v Grafane, všetko v lokálnom minikube klastri. Všetky potrebné manifesty nájdete nižšie.
Sprístupnenie metrík Traefiku
Prometheus zbiera metriky cez HTTP, takže prvým krokom je sprístupniť endpoint metrík Traefiku v rámci klastra. Malý Service v namespace traefik vystaví port s metrikami; po nasadení je endpoint dostupný cez Kubernetes DNS na adrese traefik-metrics.traefik.svc.cluster.local:9100.
apiVersion: v1
kind: Service
metadata:
name: traefik-metrics
namespace: traefik
spec:
ports:
- name: metrics
protocol: TCP
port: 9100
targetPort: metrics
selector:
app.kubernetes.io/instance: traefik-traefik
app.kubernetes.io/name: traefik
type: ClusterIPSelektor musí zodpovedať vašej inštalácii Traefiku — ak service nenájde žiadne endpointy, skontrolujte labely príkazom kubectl get pods -n traefik --show-labels.
Prometheus: zber metrík
Prometheus ukladá metriky ako časové rady a poskytuje dopytovací jazyk (PromQL), ktorý Grafana používa na dashboardy. Nasadíme ho do vlastného namespace:
kubectl create ns prometheusKonfigurácia zberu
Konfiguráciu Prometheusu drží ConfigMap. Stačí jedna scrape úloha namierená na service s metrikami z predchádzajúceho kroku:
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: prometheus
data:
prometheus.yml: |
global:
scrape_interval: 10s
scrape_configs:
- job_name: 'traefik'
static_configs:
- targets: ['traefik-metrics.traefik.svc.cluster.local:9100']Perzistentné úložisko
Prometheus zapisuje časové rady do /prometheus. Bez volume každý reštart podu zmaže históriu — preto si najprv vyžiadame perzistentné úložisko. 10Gi je pre lokálny klaster pohodlných; upravte podľa potreby.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus-storage-persistence
namespace: prometheus
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10GiDeployment
Deployment pripojí konfiguráciu do /etc/prometheus, volume do /prometheus a vystaví port 9090. Verziu image vždy fixujte na konkrétne číslo (a zvyšujte vedome), nespoliehajte sa na latest:
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: prometheus
spec:
selector:
matchLabels:
app: prometheus
replicas: 1
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus:v2.44.0
ports:
- containerPort: 9090
name: default
volumeMounts:
- name: prometheus-storage
mountPath: /prometheus
- name: config-volume
mountPath: /etc/prometheus
volumes:
- name: prometheus-storage
persistentVolumeClaim:
claimName: prometheus-storage-persistence
- name: config-volume
configMap:
name: prometheus-configSprístupnenie Prometheusu
Grafana beží v rovnakom klastri, takže stačí NodePort service — v rámci klastra Prometheus odpovedá na http://prometheus.prometheus.svc.cluster.local:9090.
kind: Service
apiVersion: v1
metadata:
name: prometheus
namespace: prometheus
spec:
selector:
app: prometheus
type: NodePort
ports:
- protocol: TCP
port: 9090
targetPort: 9090
nodePort: 30909Voliteľne môžete UI Prometheusu vystaviť mimo klastra cez Traefik IngressRoute — hodí sa na ad-hoc PromQL dopyty:
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: prometheus
namespace: prometheus
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`prometheus.test`)
services:
- kind: Service
name: prometheus
port: 9090Grafana: vizualizácia metrík
Grafana premení dáta z Prometheusu na dashboardy, grafy a alerty. Rovnaký postup — najprv vlastný namespace:
kubectl create ns grafanaProvisioning datasource
Namiesto naklikania datasource v UI ho nastavíme deklaratívne cez ConfigMap — pripojenie tak prežije reinštaláciu a dá sa skontrolovať v code review:
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-datasources
namespace: grafana
data:
prometheus.yaml: |-
{
"apiVersion": 1,
"datasources": [
{
"access":"proxy",
"editable": true,
"name": "prometheus",
"orgId": 1,
"type": "prometheus",
"url": "http://prometheus.prometheus.svc.cluster.local:9090",
"version": 1
}
]
}Perzistencia a deployment
Grafana drží používateľov, dashboardy a nastavenia v /var/lib/grafana — uložte ich na volume, aby reštart nezmazal vašu prácu:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-storage-persistence
namespace: grafana
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1GiDeployment pripojí provisioning datasource aj úložisko:
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: grafana
spec:
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
name: grafana
labels:
app: grafana
spec:
securityContext:
runAsUser: 472
runAsGroup: 472
fsGroup: 472
containers:
- name: grafana
image: grafana/grafana:10.0.0
ports:
- name: grafana
containerPort: 3000
resources:
limits:
memory: "1Gi"
cpu: "1000m"
requests:
memory: 500M
cpu: "500m"
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage
- mountPath: /etc/grafana/provisioning/datasources
name: grafana-datasources
readOnly: false
volumes:
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana-storage-persistence
- name: grafana-datasources
configMap:
defaultMode: 420
name: grafana-datasourcesSprístupnenie Grafany
NodePort service spolu s Traefik IngressRoute sprístupní UI Grafany z prehliadača:
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: grafana
spec:
selector:
app: grafana
type: NodePort
ports:
- port: 3000
targetPort: 3000
nodePort: 32000apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: grafana
namespace: grafana
spec:
entryPoints:
- websecure
routes:
- kind: Rule
match: Host(`grafana.test`)
services:
- kind: Service
name: grafana
port: 3000Otestovanie inštalácie
Spustite minikube tunnel v termináli, aby sa prevádzka dostala do klastra, a nasmerujte testovacie hostnames na localhost v /etc/hosts (sudo nano /etc/hosts):
127.0.0.1 grafana.test
127.0.0.1 prometheus.test- Otvorte https://prometheus.test — na stránke Targets by mala byť úloha traefik v stave UP.
- Otvorte https://grafana.test a prihláste sa predvoleným účtom admin/admin (heslo hneď zmeňte).
- Prejdite na Dashboards > Import a zadajte ID 4475 — oficiálny Traefik dashboard z grafana.com.
Po niekoľkých scrape intervaloch sa dashboard naplní počtom požiadaviek, stavovými kódmi a časmi odoziev všetkého, čo beží za vaším Traefik ingressom.
Záver
So štyrmi manifestmi pre Prometheus a štyrmi pre Grafanu získate kompletný monitorovací stack pre Traefik v minikube s perzistentnými dátami — rovnaké stavebné bloky škálujú aj do produkčného klastra s operátorom alebo Helm chartom navrchu.
Observabilita produkčného klastra — metriky, alerting, dashboardy, on-call — je súčasťou našich DevOps a cloud služieb. Ak váš tím prevádzkuje Kubernetes naslepo, vieme to zmeniť.
