
Votre API server Kubernetes répond lentement ? Les pods mettent du temps à démarrer ? Le problème vient peut-être d’etcd, la base de données qui stocke l’intégralité de l’état de votre cluster. Ce guide vous apprend à diagnostiquer, sauvegarder et maintenir etcd pour éviter les pannes et garantir la résilience de votre infrastructure.
Vous apprendrez à :
- Vérifier la santé d’un cluster etcd en 2 minutes
- Créer et restaurer des snapshots (procédure complète)
- Gérer les alarmes
NOSPACEet la maintenance day-2 - Monitorer etcd avec Prometheus
Ce que tu vas apprendre
Section intitulée « Ce que tu vas apprendre »À la fin de ce guide, tu sauras :
- Expliquer ce que Kubernetes attend d’etcd (cohérence, latence, sécurité)
- Diagnostiquer rapidement un etcd lent/instable (health, status, quorum, disque)
- Mettre en place une stratégie backup/restore fiable (et testée)
- Faire la maintenance day-2 : compaction, defrag, quota, alarmes
NOSPACE - Surveiller etcd via métriques (Prometheus) et interpréter les signaux
Pourquoi etcd est critique dans Kubernetes
Section intitulée « Pourquoi etcd est critique dans Kubernetes »Rôle exact d’etcd côté Kubernetes
Section intitulée « Rôle exact d’etcd côté Kubernetes »etcd est la source de vérité unique de votre cluster Kubernetes. Tout ce que l’API server connaît — pods, services, secrets, configmaps, RBAC — est stocké dans etcd.
| Ce qu’etcd stocke | Exemple |
|---|---|
| État désiré | ”Je veux 3 réplicas de nginx” |
| État actuel | ”2 pods running, 1 pending” |
| Configuration | Secrets, ConfigMaps, ServiceAccounts |
| Métadonnées | Labels, annotations, finalizers |
| Leases | Leader election des controllers |
Conséquence directe : si etcd est lent, l’API server est lent. Si etcd est down, l’API server ne peut plus persister l’état : les workloads existants continuent de tourner, mais aucune modification n’est possible (créations, suppressions, mises à jour). Selon la durée de l’indisponibilité, même la lecture via API peut se dégrader.
Ce que ce guide n’est pas
Section intitulée « Ce que ce guide n’est pas »Ce n’est pas une page “historique” d’etcd. L’objectif est 100% opérationnel : des commandes à copier-coller et des runbooks pour résoudre les problèmes courants.
Modèle mental etcd en 15 minutes
Section intitulée « Modèle mental etcd en 15 minutes »Raft : leader, followers, quorum
Section intitulée « Raft : leader, followers, quorum »etcd utilise l’algorithme Raft pour garantir la cohérence des données entre tous les membres. Voici comment ça fonctionne :
┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ LEADER │────▶│ FOLLOWER │────▶│ FOLLOWER ││ (écritures)│ │ (réplique) │ │ (réplique) │└─────────────┘ └─────────────┘ └─────────────┘ │ │ │ └───────────────────┴───────────────────┘ QUORUM = 2/3Règle d’or : sans quorum (majorité des membres disponibles), aucune écriture n’est possible.
| Nombre de membres | Quorum requis | Tolérance aux pannes |
|---|---|---|
| 1 | 1 | 0 (aucune) |
| 3 | 2 | 1 membre |
| 5 | 3 | 2 membres |
| 7 | 4 | 3 membres |
MVCC, révisions, compaction : pourquoi la base grossit
Section intitulée « MVCC, révisions, compaction : pourquoi la base grossit »etcd utilise MVCC (Multi-Version Concurrency Control) : chaque modification crée une nouvelle révision sans supprimer l’ancienne. C’est ce qui permet les watches (notifications en temps réel).
Problème : sans maintenance, l’historique s’accumule indéfiniment.
Révision 1: pod-a crééRévision 2: pod-a modifié (labels)Révision 3: pod-a modifié (replicas)Révision 4: pod-a supprimé ↓ Toutes ces révisions sont conservées !Solutions :
- Compaction : supprime les anciennes révisions (garde la plus récente)
- Défragmentation : récupère l’espace disque après compaction
Transactions, watches, leases
Section intitulée « Transactions, watches, leases »etcd offre trois primitives que Kubernetes exploite massivement :
| Primitive | Usage Kubernetes |
|---|---|
| Transactions | Mises à jour atomiques (create-or-update) |
| Watches | Controllers qui réagissent aux changements |
| Leases | Leader election, heartbeats |
À retenir : etcd est “simple” (clé/valeur) mais exigeant sur la qualité du stockage et du réseau.
Topologies etcd dans Kubernetes
Section intitulée « Topologies etcd dans Kubernetes »etcd “stacked” (sur les control planes)
Section intitulée « etcd “stacked” (sur les control planes) »C’est la topologie par défaut avec kubeadm, k3s, RKE2 et la plupart des distributions.
┌───────────────────────────────────────────────────────────┐│ Control Plane Node 1 ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ API Server │ │ Controller │ │ Scheduler │ ││ └──────┬──────┘ └─────────────┘ └─────────────┘ ││ │ ││ ▼ ││ ┌─────────────┐ ││ │ etcd │◀───────────────────────────────────────┐ ││ └─────────────┘ │ │└─────────────────────────────────────────────────────────┼─┘ │┌─────────────────────────────────────────────────────────┼─┐│ Control Plane Node 2 │ ││ ┌─────────────┐ │ ││ │ etcd │◀───────────────────────────────────────┼─┤│ └─────────────┘ │ │└─────────────────────────────────────────────────────────┼─┘ │┌─────────────────────────────────────────────────────────┼─┐│ Control Plane Node 3 │ ││ ┌─────────────┐ │ ││ │ etcd │◀───────────────────────────────────────┘ ││ └─────────────┘ │└───────────────────────────────────────────────────────────┘Avantages : simplicité, moins de machines à gérer.
Inconvénients : si un control plane tombe, vous perdez un membre etcd.
etcd “external” (cluster séparé)
Section intitulée « etcd “external” (cluster séparé) »Pour les environnements critiques, etcd peut tourner sur des machines dédiées.
Quand c’est pertinent :
- Isolation des ressources (CPU/RAM/disque dédiés)
- Politique de backup différente
- Cluster etcd partagé entre plusieurs clusters K8s
- Exigences de latence strictes
Impacts opérationnels : certificats supplémentaires, endpoints à configurer, procédures de maintenance séparées.
Lab reproductible avec kind
Section intitulée « Lab reproductible avec kind »Déployer un cluster kind avec 3 control planes
Section intitulée « Déployer un cluster kind avec 3 control planes »-
Créer le fichier de configuration
kind-etcd-lab.yaml kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes:- role: control-plane- role: control-plane- role: control-plane -
Créer le cluster
Fenêtre de terminal kind create cluster --name etcd-lab --config kind-etcd-lab.yamlSortie attendue :
Creating cluster "etcd-lab" ...✓ Ensuring node image (kindest/node:v1.31.2) 🖼✓ Preparing nodes 📦 📦 📦✓ Configuring the external load balancer ⚖️✓ Writing configuration 📜✓ Starting control-plane 🕹️✓ Installing CNI 🔌✓ Installing StorageClass 💾✓ Joining more control-plane nodes 🎮Set kubectl context to "kind-etcd-lab" -
Vérifier les pods etcd
Fenêtre de terminal kubectl get pods -n kube-system -l component=etcd -o wideSortie attendue :
NAME READY STATUS RESTARTS AGE IP NODEetcd-etcd-lab-control-plane 1/1 Running 0 46s 172.19.0.5 etcd-lab-control-planeetcd-etcd-lab-control-plane2 1/1 Running 0 40s 172.19.0.4 etcd-lab-control-plane2etcd-etcd-lab-control-plane3 1/1 Running 0 33s 172.19.0.3 etcd-lab-control-plane3
Accéder à etcd de manière sécurisée
Section intitulée « Accéder à etcd de manière sécurisée »etcd exige une authentification mTLS (mutual TLS). Voici le pattern recommandé pour exécuter des commandes etcdctl :
kubectl exec -n kube-system etcd-etcd-lab-control-plane -- sh -c ' export ETCDCTL_API=3 etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --endpoints=https://127.0.0.1:2379 \ <COMMANDE>'Valider la connectivité
Section intitulée « Valider la connectivité »Vérifier la santé d’un endpoint
Section intitulée « Vérifier la santé d’un endpoint »kubectl exec -n kube-system etcd-etcd-lab-control-plane -- sh -c ' export ETCDCTL_API=3 etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --endpoints=https://127.0.0.1:2379 \ endpoint health'Sortie attendue :
https://127.0.0.1:2379 is healthy: successfully committed proposal: took = 3.837182msVérifier le statut de tous les membres
Section intitulée « Vérifier le statut de tous les membres »Utilisez --cluster pour interroger automatiquement tous les membres (plus robuste que de lister les IPs manuellement) :
kubectl exec -n kube-system etcd-etcd-lab-control-plane -- sh -c ' export ETCDCTL_API=3 etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --endpoints=https://127.0.0.1:2379 \ endpoint status --cluster --write-out=table'Sortie attendue :
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+| https://172.19.0.5:2379 | 4c95f7dc5897214a | 3.5.15 | 1.6 MB | true | false | 2 | 812 | 812 | || https://172.19.0.4:2379 | 66fb782b14ae096a | 3.5.15 | 1.6 MB | false | false | 2 | 812 | 812 | || https://172.19.0.3:2379 | ee098f6d097e6ce5 | 3.5.15 | 1.6 MB | false | false | 2 | 812 | 812 | |+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+Ce qu’il faut vérifier :
| Colonne | Ce que ça signifie | Valeur attendue |
|---|---|---|
IS LEADER | Un seul membre doit être leader | Exactement 1 true |
DB SIZE | Taille de la base | Similaire sur tous les membres |
RAFT INDEX | Index de réplication | Identique sur tous les membres |
ERRORS | Alarmes actives | Vide |
Lister les membres du cluster
Section intitulée « Lister les membres du cluster »kubectl exec -n kube-system etcd-etcd-lab-control-plane -- sh -c ' export ETCDCTL_API=3 etcdctl \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --endpoints=https://127.0.0.1:2379 \ member list --write-out=table'Sortie attendue :
+------------------+---------+-------------------------+-------------------------+-------------------------+------------+| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |+------------------+---------+-------------------------+-------------------------+-------------------------+------------+| 4c95f7dc5897214a | started | etcd-lab-control-plane | https://172.19.0.5:2380 | https://172.19.0.5:2379 | false || 66fb782b14ae096a | started | etcd-lab-control-plane2 | https://172.19.0.4:2380 | https://172.19.0.4:2379 | false || ee098f6d097e6ce5 | started | etcd-lab-control-plane3 | https://172.19.0.3:2380 | https://172.19.0.3:2379 | false |+------------------+---------+-------------------------+-------------------------+-------------------------+------------+Santé et diagnostic : les checks qui sauvent
Section intitulée « Santé et diagnostic : les checks qui sauvent »Check baseline (2 minutes)
Section intitulée « Check baseline (2 minutes) »Voici la séquence de diagnostic à exécuter en cas de problème. Toujours exporter ETCDCTL_API=3 avant d’exécuter ces commandes.
-
Vérifier que tous les membres répondent
Fenêtre de terminal etcdctl --endpoints=https://127.0.0.1:2379 endpoint health --cluster✅ Tous les endpoints doivent être
healthy -
Identifier le leader
Fenêtre de terminal etcdctl --endpoints=https://127.0.0.1:2379 endpoint status --cluster --write-out=table✅ Un seul membre doit avoir
IS LEADER = true -
Vérifier la cohérence des index
Dans la sortie précédente,
RAFT INDEXetRAFT APPLIED INDEXdoivent être identiques sur tous les membres. Un décalage indique un problème de réplication. -
Vérifier les alarmes
Fenêtre de terminal etcdctl --endpoints=https://127.0.0.1:2379 alarm list✅ La sortie doit être vide (aucune alarme)
Symptômes fréquents → Hypothèses → Actions
Section intitulée « Symptômes fréquents → Hypothèses → Actions »API server lent ou timeouts
Section intitulée « API server lent ou timeouts »| Symptôme | Cause probable | Diagnostic | Action |
|---|---|---|---|
| Requêtes kubectl lentes | etcd surchargé ou disque lent | endpoint status : latence élevée | Vérifier I/O disque, considérer des SSD |
context deadline exceeded | Réseau instable entre API server et etcd | Logs etcd : slow request | Vérifier latence réseau, MTU |
| Pods pending longtemps | etcd en mode alarm | alarm list | Résoudre l’alarme (voir runbook) |
Élections fréquentes (leader instable)
Section intitulée « Élections fréquentes (leader instable) »# Compter les changements de leader dans les logskubectl logs -n kube-system etcd-etcd-lab-control-plane | grep -c "elected leader"| Cause | Solution |
|---|---|
| Latence réseau > 10ms | Améliorer réseau ou rapprocher les nœuds |
| CPU insuffisant | Augmenter les resources du pod/VM |
| Disque trop lent | Migrer vers SSD NVMe |
Runbook latence : où est le problème ?
Section intitulée « Runbook latence : où est le problème ? »Quand etcd est lent, il faut identifier où se situe la latence :
-
Vérifier la latence disque (métrique
etcd_disk_backend_commit_duration_seconds)Fenêtre de terminal # Sur le nœud etcdiostat -x 1 5⚠️
await > 10ms= disque trop lent → migrer vers SSD NVMe -
Vérifier la latence réseau entre peers (métrique
etcd_network_peer_round_trip_time_seconds)Fenêtre de terminal # Depuis un nœud etcd vers les autresping -c 10 <IP_PEER>⚠️
> 10ms= réseau instable → vérifier MTU, congestion -
Corréler avec les logs etcd
Fenêtre de terminal kubectl logs -n kube-system etcd-xxx --tail=200 | grep -E "took too long|slow"Les messages indiquent le type d’opération lente (apply, commit, etc.)
Lecture utile des logs etcd
Section intitulée « Lecture utile des logs etcd »kubectl logs -n kube-system etcd-etcd-lab-control-plane --tail=100 | grep -E "slow|compact|alarm|leader"Ce qu’il faut chercher :
took too long: requêtes lentes (I/O ou réseau)compaction: compaction en coursalarm: quota atteintelected leader: changement de leader
Sauvegarde et restauration
Section intitulée « Sauvegarde et restauration »Stratégie de sauvegarde
Section intitulée « Stratégie de sauvegarde »| Élément | Recommandation |
|---|---|
| Fréquence | Toutes les heures minimum, toutes les 15 min pour clusters critiques |
| Rétention | 7 jours minimum, 30 jours recommandé |
| Stockage | Hors du cluster (S3, GCS, NFS externe) |
| Chiffrement | GPG ou autre avant upload |
| Test | Restauration mensuelle sur cluster de test |
Créer un snapshot
Section intitulée « Créer un snapshot »-
Exécuter la sauvegarde
Fenêtre de terminal kubectl exec -n kube-system etcd-etcd-lab-control-plane -- sh -c 'export ETCDCTL_API=3etcdctl \--cacert=/etc/kubernetes/pki/etcd/ca.crt \--cert=/etc/kubernetes/pki/etcd/server.crt \--key=/etc/kubernetes/pki/etcd/server.key \--endpoints=https://127.0.0.1:2379 \snapshot save /tmp/etcd-snapshot.db'Sortie attendue :
{"level":"info","ts":"2026-02-02T09:24:53.263527Z","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/tmp/etcd-snapshot.db"}Snapshot saved at /tmp/etcd-snapshot.db -
Vérifier l’intégrité du snapshot (utilisez
etcdutl— compatible 3.5/3.6)Fenêtre de terminal kubectl exec -n kube-system etcd-etcd-lab-control-plane -- \etcdutl snapshot status /tmp/etcd-snapshot.db --write-out=tableSortie attendue :
+----------+----------+------------+------------+| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |+----------+----------+------------+------------+| 8213414f | 822 | 835 | 1.7 MB |+----------+----------+------------+------------+ -
Copier le snapshot hors du conteneur
Fenêtre de terminal kubectl cp kube-system/etcd-etcd-lab-control-plane:/tmp/etcd-snapshot.db ./etcd-snapshot-$(date +%Y%m%d-%H%M%S).db
Restaurer un cluster etcd
Section intitulée « Restaurer un cluster etcd »La procédure complète de restauration dépend de votre distribution :
-
Arrêter le kubelet sur tous les control planes
Fenêtre de terminal systemctl stop kubelet -
Sauvegarder le répertoire etcd actuel
Fenêtre de terminal mv /var/lib/etcd /var/lib/etcd.backup-$(date +%Y%m%d) -
Restaurer le snapshot sur chaque membre (avec
etcdutl)Fenêtre de terminal etcdutl snapshot restore /path/to/snapshot.db \--name etcd-member-1 \--initial-cluster etcd-member-1=https://10.0.0.1:2380,etcd-member-2=https://10.0.0.2:2380,etcd-member-3=https://10.0.0.3:2380 \--initial-cluster-token etcd-cluster-1 \--initial-advertise-peer-urls https://10.0.0.1:2380 \--data-dir /var/lib/etcdRépétez sur chaque nœud en adaptant
--nameet--initial-advertise-peer-urls. -
Redémarrer le kubelet
Fenêtre de terminal systemctl start kubelet -
Vérifier la santé
Fenêtre de terminal etcdctl --endpoints=https://127.0.0.1:2379 endpoint health --cluster
Pour un lab kind, le plus simple est de recréer le cluster :
kind delete cluster --name etcd-labkind create cluster --name etcd-lab --config kind-etcd-lab.yamlPuis restaurer les objets Kubernetes depuis vos manifests GitOps.
Script de backup automatisé
Section intitulée « Script de backup automatisé »#!/bin/bashset -euo pipefail
# Configurationexport ETCDCTL_API=3BACKUP_DIR="/backup/etcd"RETENTION_DAYS=7TIMESTAMP=$(date +%Y%m%d-%H%M%S)SNAPSHOT_FILE="${BACKUP_DIR}/etcd-snapshot-${TIMESTAMP}.db"
# Certificats (kubeadm - adapter selon votre distribution)CACERT="/etc/kubernetes/pki/etcd/ca.crt"CERT="/etc/kubernetes/pki/etcd/healthcheck-client.crt"KEY="/etc/kubernetes/pki/etcd/healthcheck-client.key"ENDPOINTS="https://127.0.0.1:2379"
# Créer le répertoire de backupmkdir -p "${BACKUP_DIR}"
# Créer le snapshotetcdctl snapshot save "${SNAPSHOT_FILE}" \ --cacert="${CACERT}" \ --cert="${CERT}" \ --key="${KEY}" \ --endpoints="${ENDPOINTS}"
# Vérifier l'intégrité (etcdutl pour compatibilité 3.5/3.6)etcdutl snapshot status "${SNAPSHOT_FILE}" --write-out=table
# Supprimer les vieux backupsfind "${BACKUP_DIR}" -name "etcd-snapshot-*.db" -mtime +${RETENTION_DAYS} -delete
echo "✅ Backup terminé : ${SNAPSHOT_FILE}"Maintenance day-2 : compaction, defrag, quota
Section intitulée « Maintenance day-2 : compaction, defrag, quota »Compaction
Section intitulée « Compaction »La compaction supprime les anciennes révisions pour limiter la croissance de la base.
-
Récupérer la révision actuelle
Fenêtre de terminal REV=$(etcdctl endpoint status -w json | grep -o '"revision":[0-9]*' | head -1 | cut -d: -f2)echo "Révision actuelle: $REV"Sortie attendue :
Révision actuelle: 911 -
Compacter jusqu’à cette révision
Fenêtre de terminal etcdctl compact $REVSortie attendue :
compacted revision 911
etcd peut compacter automatiquement. Configurez dans les arguments de démarrage :
# Mode périodique : compacte toutes les heures--auto-compaction-mode=periodic--auto-compaction-retention=1h
# Mode révision : garde les N dernières révisions--auto-compaction-mode=revision--auto-compaction-retention=10000Défragmentation
Section intitulée « Défragmentation »La compaction marque les données comme supprimées, mais ne libère pas l’espace disque. La défragmentation récupère cet espace.
# Défragmenter un seul membre (etcd doit tourner)etcdctl defrag --endpoints=https://127.0.0.1:2379Sortie attendue :
Finished defragmenting etcd member[https://127.0.0.1:2379]Pour défragmenter un etcd arrêté (maintenance offline) :
# Arrêter etcd, puis :etcdutl defrag --data-dir /var/lib/etcdProcédure recommandée (online) :
- Défragmenter un follower
- Vérifier sa santé (
endpoint health) - Défragmenter le follower suivant
- Défragmenter le leader en dernier
Quota et alarme NOSPACE
Section intitulée « Quota et alarme NOSPACE »Par défaut, etcd a un quota de 2 GB. Quand il est atteint :
- etcd déclenche l’alarme
NOSPACE - Seules les lectures et suppressions sont autorisées
- Le cluster Kubernetes est bloqué
Runbook de résolution :
-
Vérifier l’alarme
Fenêtre de terminal etcdctl --endpoints=https://127.0.0.1:2379 alarm listmemberID:4c95f7dc5897214a alarm:NOSPACE -
Compacter la base
Fenêtre de terminal # Récupérer la révision actuelle (parsing JSON robuste si jq disponible)REV=$(etcdctl --endpoints=https://127.0.0.1:2379 endpoint status --write-out=json | \grep -o '"revision":[0-9]*' | head -1 | cut -d: -f2)echo "Compaction jusqu'à la révision: $REV"etcdctl --endpoints=https://127.0.0.1:2379 compact $REV -
Défragmenter tous les membres (un par un, en commençant par les followers)
Fenêtre de terminal # Récupérer la liste des endpointsetcdctl --endpoints=https://127.0.0.1:2379 member list --write-out=table# Défragmenter chaque membre individuellementetcdctl defrag --endpoints=https://<IP_FOLLOWER_1>:2379etcdctl defrag --endpoints=https://<IP_FOLLOWER_2>:2379etcdctl defrag --endpoints=https://<IP_LEADER>:2379 # En dernier -
Désarmer l’alarme
Fenêtre de terminal etcdctl --endpoints=https://127.0.0.1:2379 alarm disarm -
Vérifier que l’alarme est levée
Fenêtre de terminal etcdctl --endpoints=https://127.0.0.1:2379 alarm list# (sortie vide = OK)
Sécurité : TLS d’abord, contrôle d’accès ensuite
Section intitulée « Sécurité : TLS d’abord, contrôle d’accès ensuite »mTLS obligatoire
Section intitulée « mTLS obligatoire »etcd ne doit jamais être exposé sans TLS. Toutes les communications doivent être chiffrées :
| Communication | Ports | Certificats requis |
|---|---|---|
| Client → etcd | 2379 | ca.crt, server.crt, server.key |
| etcd → etcd (peers) | 2380 | peer.crt, peer.key |
RBAC etcd (cas avancés)
Section intitulée « RBAC etcd (cas avancés) »Pour les clusters etcd externes ou partagés, vous pouvez activer l’authentification :
# Activer l'authentificationetcdctl auth enable
# Créer un utilisateuretcdctl user add admin --new-user-password="***"
# Créer un rôleetcdctl role add readwriteetcdctl role grant-permission readwrite readwrite /
# Assigner le rôle à l'utilisateuretcdctl user grant-role admin readwriteMonitoring et alerting
Section intitulée « Monitoring et alerting »Métriques Prometheus
Section intitulée « Métriques Prometheus »etcd expose ses métriques sur /metrics (port 2379 avec TLS). Les métriques clés à surveiller :
| Métrique | Description | Seuil initial | Notes |
|---|---|---|---|
etcd_server_has_leader | Présence d’un leader | != 1 | Critique — action immédiate |
etcd_server_leader_changes_seen_total | Changements de leader | > 3/heure | Ajuster si réseau instable |
etcd_disk_backend_commit_duration_seconds | Latence d’écriture disque | p99 > 25ms | Sur SSD NVMe, attendez < 10ms |
etcd_network_peer_round_trip_time_seconds | Latence réseau entre peers | p99 > 50ms | Dépend de la distance entre nœuds |
etcd_mvcc_db_total_size_in_bytes | Taille de la base | > 80% du quota | Warning à 80%, critique à 95% |
etcd_server_proposals_failed_total | Propositions Raft échouées | > 0 | Tout échec = investigation |
Exemple de PrometheusRule
Section intitulée « Exemple de PrometheusRule »apiVersion: monitoring.coreos.com/v1kind: PrometheusRulemetadata: name: etcd-alerts namespace: monitoringspec: groups: - name: etcd rules: - alert: EtcdNoLeader expr: etcd_server_has_leader == 0 for: 1m labels: severity: critical annotations: summary: "etcd n'a pas de leader"
- alert: EtcdHighDiskLatency expr: histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket[5m])) > 0.025 for: 5m labels: severity: warning annotations: summary: "Latence disque etcd élevée (> 25ms)"
- alert: EtcdDatabaseSpaceExceeded expr: etcd_mvcc_db_total_size_in_bytes / etcd_server_quota_backend_bytes > 0.8 for: 5m labels: severity: warning annotations: summary: "Base etcd proche du quota (> 80%)"Cheat sheet etcdctl
Section intitulée « Cheat sheet etcdctl »Santé et statut
Section intitulée « Santé et statut »# Santé d'un endpointetcdctl --endpoints=https://127.0.0.1:2379 endpoint health
# Santé de tout le clusteretcdctl --endpoints=https://127.0.0.1:2379 endpoint health --cluster
# Statut détaillé (leader, taille, index)etcdctl --endpoints=https://127.0.0.1:2379 endpoint status --cluster --write-out=table
# Liste des membresetcdctl --endpoints=https://127.0.0.1:2379 member list --write-out=tableSauvegarde et restauration
Section intitulée « Sauvegarde et restauration »# Créer un snapshotetcdctl --endpoints=https://127.0.0.1:2379 snapshot save /path/to/snapshot.db
# Vérifier un snapshot (etcdutl — compatible 3.5/3.6)etcdutl snapshot status /path/to/snapshot.db --write-out=table
# Restaurer (etcdutl — compatible 3.5/3.6)etcdutl snapshot restore /path/to/snapshot.db --data-dir /var/lib/etcdMaintenance
Section intitulée « Maintenance »# Compacter jusqu'à la révision Netcdctl --endpoints=https://127.0.0.1:2379 compact <revision>
# Défragmenter un membre (online)etcdctl defrag --endpoints=https://<IP>:2379
# Défragmenter offline (etcd arrêté)etcdutl defrag --data-dir /var/lib/etcd
# Lister les alarmesetcdctl --endpoints=https://127.0.0.1:2379 alarm list
# Désarmer les alarmesetcdctl --endpoints=https://127.0.0.1:2379 alarm disarmDonnées (debug uniquement)
Section intitulée « Données (debug uniquement) »# Lister toutes les clés (ATTENTION : beaucoup de sortie)etcdctl --endpoints=https://127.0.0.1:2379 get "" --prefix --keys-only | head -20
# Lire une clé spécifiqueetcdctl --endpoints=https://127.0.0.1:2379 get /registry/pods/default/my-pod
# Compter les clésetcdctl --endpoints=https://127.0.0.1:2379 get "" --prefix --keys-only | wc -lRunbooks “symptôme → diagnostic → action”
Section intitulée « Runbooks “symptôme → diagnostic → action” »Alarme NOSPACE
Section intitulée « Alarme NOSPACE »etcdctl --endpoints=https://127.0.0.1:2379 alarm list→ confirmeNOSPACE- Compacter :
etcdctl --endpoints=https://127.0.0.1:2379 compact $(etcdctl --endpoints=https://127.0.0.1:2379 endpoint status --write-out=json | grep -o '"revision":[0-9]*' | head -1 | cut -d: -f2) etcdctl defrag --endpoints=https://<IP>:2379(membre par membre, followers d’abord)etcdctl --endpoints=https://127.0.0.1:2379 alarm disarm- Vérifier :
etcdctl --endpoints=https://127.0.0.1:2379 endpoint status --cluster --write-out=table(DB SIZE réduit)
Perte de quorum
Section intitulée « Perte de quorum »- Identifier les membres down :
etcdctl --endpoints=https://127.0.0.1:2379 member list --write-out=table - Si 1 seul membre down sur 3 : attendre son retour ou le remplacer
- Si 2+ membres down : restauration depuis snapshot obligatoire avec
etcdutl snapshot restore
etcd lent (I/O)
Section intitulée « etcd lent (I/O) »etcdctl --endpoints=https://127.0.0.1:2379 endpoint status --cluster --write-out=table→ vérifier latence- Logs :
kubectl logs -n kube-system etcd-xxx | grep "slow\|took too long" - Vérifier IOPS du disque :
iostat -x 1 - Vérifier latence réseau :
ping <IP_PEER>(doit être < 10ms) - Solution : migrer vers SSD NVMe, améliorer réseau
Certificats expirés
Section intitulée « Certificats expirés »Symptômes : transport: authentication handshake failed
- Vérifier expiration :
openssl x509 -in /etc/kubernetes/pki/etcd/server.crt -noout -dates - Renouveler avec kubeadm :
kubeadm certs renew etcd-server && kubeadm certs renew etcd-peer - Redémarrer les pods etcd :
kubectl delete pod -n kube-system -l component=etcd
Checklist avant production
Section intitulée « Checklist avant production »- Backups automatisés et testés (restauration réussie)
- Monitoring : alertes sur leader, latence, espace disque
- SSD : stockage avec latence < 10ms
- Réseau : latence < 10ms entre membres etcd
- TLS : mTLS activé pour clients et peers
- Quota : configuré et surveillé
- Maintenance : compaction auto + defrag planifié
- Documentation : runbooks accessibles à l’équipe
À retenir
Section intitulée « À retenir »- etcd = SPOF logique : même avec 3 nœuds, une mauvaise config bloque le cluster
- Toujours 3 ou 5 membres : jamais 2, jamais plus de 7
- SSD obligatoire : la latence disque tue etcd
- Backup = snapshot + test de restauration : un backup non testé ne vaut rien
- Compaction + defrag : maintenance obligatoire pour éviter
NOSPACE - TLS everywhere : etcd exposé = cluster compromis
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources
Section intitulée « Ressources »- Operating etcd clusters for Kubernetes — Documentation officielle Kubernetes
- etcd Maintenance — Compaction, defrag, quotas
- etcd Disaster Recovery — Procédures de restauration
- etcd Monitoring — Métriques et alerting