NovinkaProflow — AI správa nehnuteľností je spustená
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky články

KubernetesAktualizované

Grafana s Prometheom pre Traefik v minikube

Grafana s Prometheom pre Traefik v minikube — Roundly Consulting

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: ClusterIP

Selektor 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 prometheus

Konfigurá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: 10Gi

Deployment

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-config

Sprí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: 30909

Voliteľ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: 9090

Grafana: vizualizácia metrík

Grafana premení dáta z Prometheusu na dashboardy, grafy a alerty. Rovnaký postup — najprv vlastný namespace:

kubectl create ns grafana

Provisioning 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: 1Gi

Deployment 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-datasources

Sprí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: 32000
apiVersion: 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: 3000

Otestovanie 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ť.

Chcete, aby to fungovalo aj u vás?

Napíšte nám, čo chcete zautomatizovať alebo postaviť — do 48 hodín odpovieme s konkrétnym návrhom.