Toujours et encore des problèmes de zinzin
Problèmes rencontrés et solutions
Problème 1 : Port 9090 déjà utilisé
Erreur :
Error: unable to start container: rootlessport listen tcp 0.0.0.0:9090: bind: address already in use
Cause : Le port 9090 était utilisé par systemd (service websm).
Solution :
# Vérifier qui utilise le port
sudo lsof -i :9090
# Changer le port de Prometheus dans docker-compose.yml
ports:
- "9091:9090" # Port hôte 9091, conteneur 9090
Problème 2 : Erreur .containerenv manquant
Erreur :
crun: open `/home/almalinux/.local/share/containers/storage/overlay/.../merged/run/.containerenv`:
No such file or directory
Cause : Problème avec le storage overlay de Podman après des suppressions brutales de conteneurs.
Solutions testées :
- Ajout de tmpfs (non retenu - contournement) :
tmpfs:
- /run
- Reset du storage Podman :
podman system prune -a --volumes
- Reboot du serveur (solution finale) :
sudo reboot
Explication : Le reboot nettoie les mounts overlay résiduels et recrée un état propre.
Problème 3 : Prometheus ne trouve pas sa config
Erreur :
Error loading config: open /etc/prometheus/prometheus.yml: no such file or directory
Cause :
- Fichier créé avec extension
.yamlau lieu de.yml - Le volume mount ne fonctionnait pas correctement
Solutions :
# Vérifier que le fichier existe
ls -lah ~/monitoring/prometheus/config/prometheus.yaml
# Fix SELinux
sudo chcon -R -t container_file_t ~/monitoring/prometheus/
# Utiliser chemin absolu dans docker-compose.yml si nécessaire
volumes:
- /home/almalinux/monitoring/prometheus/config:/etc/prometheus:Z
# Ou renommer en .yml
mv prometheus.yaml prometheus.yml
Problème 4 : Podman Exporter - Permission denied sur socket
Erreur :
unable to connect to Podman socket: dial unix /run/user/1000/podman/podman.sock:
connect: permission denied
Causes multiples :
- Socket n'existe pas
- Service en conteneur ne peut pas accéder au socket rootless
- Plusieurs instances en conflit
Diagnostic :
# Vérifier que le socket existe
ls -lah /run/user/$(id -u)/podman/podman.sock
# Vérifier les process en cours
ps aux | grep prometheus-podman-exporter
# Vérifier qui utilise le port
sudo lsof -i :9882
Solution finale : Service systemd user
# Désactiver toutes les instances
sudo systemctl disable --now prometheus-podman-exporter
systemctl --user disable --now prometheus-podman-exporter
sudo pkill -9 -f prometheus-podman-exporter
# Créer le service Podman API
systemctl --user enable --now podman-api
# Créer le service exporter
systemctl --user enable --now prometheus-podman-exporter
# Vérifier qu'il n'y a qu'une instance
ps aux | grep prometheus-podman-exporter | grep -v grep
Pourquoi cette solution ?
- Le service user a accès direct au socket rootless
- Pas de problème de mapping UID/permissions
- Plus stable que l'approche conteneur pour rootless
Problème 5 : Prometheus ne peut pas scraper localhost depuis le conteneur
Erreur : Targets podman_exporter et node_exporter en état "down".
Cause : Prometheus (conteneur) ne peut pas atteindre localhost:9882 (hôte).
Diagnostic :
# Depuis l'hôte, ça marche
curl http://localhost:9882/metrics
# Mais Prometheus (conteneur) ne voit pas localhost de l'hôte
Solution : Utiliser host.containers.internal
# Dans prometheus.yaml
- job_name: 'podman_exporter'
static_configs:
- targets: ['host.containers.internal:9882']
# Dans docker-compose.yml
prometheus:
extra_hosts:
- "host.containers.internal:host-gateway"
Résultat : Tous les targets passent à "up" ✅
Problème 6 : Labels name manquants dans podman_container_state
Observation :
podman_container_state{id="abc123", ...} 1
Pas de label name !
Cause : Podman Exporter ne retourne pas toujours tous les labels dans toutes les métriques.
Solution : Utiliser podman_container_info avec join
# Query qui combine les deux métriques
podman_container_info * on(id) group_left(name) podman_container_state
Résultat :
{name="jenkins", id="...", state="running"} 1
{name="vault", id="...", state="running"} 1
Problème 7 : Dashboards communautaires vides
Cause : Les dashboards attendent des métriques ou labels spécifiques qui ne correspondent pas exactement.
Solution : Créer des dashboards custom adaptés aux métriques réellement disponibles.
Méthode :
- Tester les queries dans Explore
- Identifier les labels disponibles
- Créer les panels manuellement
- Adapter les value mappings
Commandes de maintenance
Gestion des services
# Status de tous les services
podman ps
systemctl --user status podman-api
systemctl --user status prometheus-podman-exporter
# Restart complet du stack
cd ~/monitoring
podman-compose restart
# Logs
podman-compose logs -f prometheus
podman-compose logs -f grafana
journalctl --user -u prometheus-podman-exporter -f
Vérification des métriques
# Node Exporter
curl http://localhost:9100/metrics | grep node_cpu
# Podman Exporter
curl http://localhost:9882/metrics | grep podman_container
# Prometheus targets
curl http://localhost:9091/api/v1/targets | jq '.data.activeTargets[] | {job: .labels.job, health: .health}'
# Query spécifique
curl -G http://localhost:9091/api/v1/query \
--data-urlencode 'query=podman_container_info' | jq
Reload configuration Prometheus
# Sans restart
podman exec prometheus kill -HUP 1
# Ou restart complet
podman restart prometheus
Backup
# Backup volumes
podman volume export prometheus_data > prometheus-backup.tar
podman volume export grafana_data > grafana-backup.tar
# Backup configs
tar -czf monitoring-config.tar.gz ~/monitoring/
Restore
# Restore volume
podman volume create prometheus_data
cat prometheus-backup.tar | podman volume import prometheus_data -
Ressources
Documentation
- Prometheus : https://prometheus.io/docs/
- Grafana : https://grafana.com/docs/
- Node Exporter : https://github.com/prometheus/node_exporter
- Podman Exporter : https://github.com/containers/prometheus-podman-exporter
Queries PromQL utiles
Nombre de conteneurs :
count(podman_container_info)
Conteneurs par état :
sum by (state) (podman_container_state)
CPU usage par conteneur :
rate(podman_container_cpu_seconds_total[5m])
Memory usage :
podman_container_mem_usage_bytes
System CPU usage :
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
System memory usage :
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
Disk usage :
100 - ((node_filesystem_avail_bytes{mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype!="rootfs"}) * 100)
Dashboards Grafana recommandés
Pour création manuelle :
- System Overview : CPU, RAM, Disk, Network
- Container Status : État des conteneurs critiques
- Container Resources : CPU/RAM par conteneur
- Alerts : Services down, seuils dépassés
Configuration réseau complète
Ports utilisés :
80 HTTP (redirect HTTPS)
443 HTTPS (Nginx)
3000 Grafana (localhost)
8080 Nginx status (localhost)
9091 Prometheus (localhost)
9100 Node Exporter (localhost)
9113 Nginx Exporter (localhost, optionnel)
9882 Podman Exporter (localhost)
Firewall nftables :
# Monitoring (localhost only)
tcp dport { 3000, 9091, 9100, 9882 } ip saddr 127.0.0.1 accept
# HTTPS public
tcp dport { 80, 443 } accept
Checklist de vérification
- Tous les conteneurs UP :
podman ps - Services systemd actifs :
systemctl --user status podman-api prometheus-podman-exporter - Socket Podman existe :
ls /run/user/$(id -u)/podman/podman.sock - Prometheus targets UP :
curl http://localhost:9091/api/v1/targets | jq - Grafana accessible :
https://grafana.sanjyasz.pro - Dashboard services fonctionne
- Certificat SSL valide
- Logs propres :
podman-compose logs --tail=50