# 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 | — | — | > 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 prometheus.lab.local alertmanager.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 : ```bash # 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`). ```bash # 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`. ```bash # 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 ```bash 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 : ```bash ask-agent monitor "Alertes Prometheus : — analyse et recommandations" ``` Hermes (profil `monitor`) analyse et répond dans ses logs. ```bash # 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 ```bash # 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":"","confirmNew":""}' ``` Ou mettre à jour `k8s/infra/monitoring/values.yaml` → `grafana.adminPassword` → `git push`. ### Importer un dashboard ```bash # 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 ```bash # 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 `additionalScrapeConfigs` → `git 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 ```bash # É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-...` | ```bash # 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` |