Funk-lab/admin/monitoring.md
alkatrazz f5073081ef docs: monitoring — persistance NFS active (Prometheus 20Gi + Grafana 2Gi)
Mise à jour admin/monitoring.md : section persistance ajoutée avec
répertoires NFS réels sur RAID5, avertissement "désactivée" retiré.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-13 21:58:28 +02:00

8.1 KiB

Monitoring — Grafana + Prometheus + AlertManager

Stack de monitoring déployée via ArgoCD dans le namespace monitoring. Chart : kube-prometheus-stack v85.0.2 (Prometheus Operator).


Accès et comptes

Service URL Login Mot de passe
Grafana http://grafana.lab.local admin funk-grafana
AlertManager http://alertmanager.lab.local ¹
Prometheus http://prometheus.lab.local ¹

¹ Ingress non encore créés — accessible via port-forward :

kubectl port-forward svc/kube-prometheus-stack-prometheus -n monitoring 9090:9090
kubectl port-forward svc/kube-prometheus-stack-alertmanager -n monitoring 9093:9093

DNS *.lab.local ne résout que depuis le cluster LAN (192.168.10.0/24). Depuis le poste perso (192.168.1.x), les entrées sont dans /etc/hosts :

192.168.10.200  grafana.lab.local argocd.lab.local

Architecture

Prometheus (k8s, namespace monitoring)
  ├── kube-state-metrics         → ressources k8s (pods, deployments, nodes)
  ├── node-exporter (daemonset)  → métriques système compute-01/02/03
  ├── scrape storage-01:9100     → métriques système storage-01
  ├── scrape gpu-01:9100         → métriques système gpu-01
  ├── scrape gpu-01:9101 (ROCm)  → température GPU, VRAM, utilisation
  └── scrape gpu-01:1234/1236/1237 → llama-server (tokens/s, slots, queue)
        ↓
AlertManager
  └── webhook → storage-01:9093/webhook → ask-agent monitor → Hermes profil monitor

Installation (déjà faite via ArgoCD)

Le monitoring est géré par ArgoCD. Pour le redéployer depuis zéro :

# Ajouter le repo Helm
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# L'application est créée automatiquement par ArgoCD depuis k8s/infra/monitoring/
# Forcer un refresh si nécessaire :
kubectl -n argocd annotate application kube-prometheus-stack \
  argocd.argoproj.io/refresh=hard --overwrite

Sources de métriques

Nœuds hors cluster (storage-01, gpu-01)

node_exporter v1.9.1 déployé via Ansible (rôle node_exporter).

# Vérifier node_exporter
systemctl status node_exporter
curl -s http://192.168.10.1:9100/metrics | grep node_memory_MemAvailable
curl -s http://192.168.10.20:9100/metrics | grep node_memory_MemAvailable

Métriques GPU AMD (gpu-01)

Collecteur sysfs via rocm_scraper.timer (toutes les 30s). Lit directement /sys/class/drm/card0/device/ — pas de dépendance rocm-smi.

# Vérifier les métriques ROCm
ssh ansible@192.168.10.20 "cat /var/lib/node_exporter/textfile_collector/rocm.prom"

# Forcer une collecte manuelle
ssh ansible@192.168.10.20 "sudo systemctl start rocm_scraper"

Métriques disponibles :

Métrique Description
rocm_gpu_temperature_celsius Température (°C)
rocm_gpu_utilization_percent Utilisation GPU (%)
rocm_vram_used_bytes VRAM utilisée (bytes)
rocm_vram_total_bytes VRAM totale (bytes)

llama-server /metrics

llama.cpp expose des métriques Prometheus nativement sur /metrics :

  • llamacpp:kv_cache_usage_ratio — utilisation du contexte
  • llamacpp:requests_processing — requêtes en cours
  • llamacpp:tokens_per_second — débit
curl -s http://192.168.10.20:1234/metrics | grep llamacpp

AlertManager → Hermes monitor

AlertManager envoie les alertes en POST vers http://192.168.10.1:9093/webhook. Le service alertmanager-webhook (Python, storage-01) reçoit les alertes et appelle :

ask-agent monitor "Alertes Prometheus : <données> — analyse et recommandations"

Hermes (profil monitor) analyse et répond dans ses logs.

# Vérifier le webhook
systemctl status alertmanager-webhook
journalctl -u alertmanager-webhook -n 20 --no-pager --output=cat

# Tester manuellement
curl -s -X POST http://192.168.10.1:9093/webhook \
  -H "Content-Type: application/json" \
  -d '{"alerts":[{"status":"firing","labels":{"alertname":"TestAlert","severity":"warning","instance":"storage-01"},"annotations":{"summary":"Test alerte","description":"Vérification du webhook"}}]}'

Administration Grafana

Changer le mot de passe admin

# Via l'API
curl -X PUT http://admin:funk-grafana@grafana.lab.local/api/user/password \
  -H "Content-Type: application/json" \
  -d '{"oldPassword":"funk-grafana","newPassword":"<nouveau>","confirmNew":"<nouveau>"}'

Ou mettre à jour k8s/infra/monitoring/values.yamlgrafana.adminPasswordgit push.

Importer un dashboard

# Via l'API (ID depuis grafana.com/dashboards)
curl -X POST http://admin:funk-grafana@grafana.lab.local/api/dashboards/import \
  -H "Content-Type: application/json" \
  -d '{"dashboard":{"id":null},"overwrite":true,"inputs":[{"name":"DS_PROMETHEUS","type":"datasource","pluginId":"prometheus","value":"prometheus"}],"folderId":0}'

Dashboards recommandés :

Dashboard ID Grafana.com Usage
Node Exporter Full 1860 CPU, RAM, disque, réseau par nœud
Kubernetes cluster 7249 Vue d'ensemble k8s
kube-prometheus-stack 15761 Santé du monitoring lui-même

Datasources configurées automatiquement

Nom Type URL
Prometheus prometheus http://kube-prometheus-stack-prometheus:9090
Alertmanager alertmanager http://kube-prometheus-stack-alertmanager:9093

Administration Prometheus

Vérifier les targets de scrape

# Via port-forward
kubectl port-forward svc/kube-prometheus-stack-prometheus -n monitoring 9090:9090 &
curl -s http://localhost:9090/api/v1/targets | python3 -m json.tool | grep -E '"health"|"job"' | head -30

Ajouter un scrape config

Modifier k8s/infra/monitoring/values.yaml → section additionalScrapeConfigsgit push.

Règles d'alerte

Les règles par défaut couvrent : OOMKill, NodeNotReady, PodCrashLooping, DiskPressure, etc. Pour ajouter des règles custom, créer un PrometheusRule dans k8s/infra/monitoring/.


Commandes d'administration

# État de tous les pods monitoring
kubectl get pods -n monitoring

# Logs Prometheus
kubectl logs -n monitoring prometheus-kube-prometheus-stack-prometheus-0 -c prometheus --tail=50

# Logs Grafana
kubectl logs -n monitoring -l app.kubernetes.io/name=grafana --tail=50

# Logs AlertManager
kubectl logs -n monitoring alertmanager-kube-prometheus-stack-alertmanager-0 --tail=50

# Redémarrer Grafana
kubectl rollout restart deployment kube-prometheus-stack-grafana -n monitoring

# Forcer re-sync ArgoCD
kubectl -n argocd annotate application kube-prometheus-stack \
  argocd.argoproj.io/refresh=hard --overwrite

Persistance des données

Les données sont persistées sur le RAID5 de storage-01 via NFS (provisioner nfs-subdir-external-provisioner).

PVC Taille Emplacement NFS
Prometheus 20 Gi /srv/data/nfs/k8s/monitoring-prometheus-...-db-...
Grafana 2 Gi /srv/data/nfs/k8s/monitoring-kube-prometheus-stack-grafana-...
# Vérifier l'espace consommé
ssh storage-01 "du -sh /srv/data/nfs/k8s/*"

Points d'attention

Sujet Détail
Persistance Prometheus Active — 20 Gi NFS sur RAID5 storage-01. Rétention : 15 jours / 8 GB
Persistance Grafana Active — 2 Gi NFS sur RAID5 storage-01. Dashboards conservés
RAM compute nodes Prometheus + Grafana : ~1 GB total. Limites définies dans values.yaml
Talos — composants désactivés kubeEtcd, kubeScheduler, kubeControllerManager, kubeProxy désactivés (non accessibles depuis Talos)
DNS lab.local Résout uniquement depuis LAN (192.168.10.0/24) — ajouter /etc/hosts sur le poste perso pour grafana/argocd
ROCm scraper Lit sysfs directement (/sys/class/drm/), pas de rocm-smi (retiré dans ROCm 7.x)
Webhook port 9093 Ouvert uniquement depuis 192.168.10.0/24 (nftables storage-01)
nfs-provisioner OutOfSync La StorageClass peut disparaître si ArgoCD prune l'app. Forcer sync : argocd app sync nfs-provisioner