Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Routine d'exploitation Kubernetes : quotidien, hebdomadaire et mensuel

12 min de lecture

logo kubernetes

Un cluster Kubernetes sain est un cluster surveillé régulièrement. Les incidents les plus coûteux ne viennent pas de pannes soudaines mais de dérives lentes : pods en échec ignorés, jobs orphelins qui s’accumulent, certificats qui expirent silencieusement. Ce guide structure les vérifications et actions récurrentes d’un admin Kubernetes en trois rythmes — quotidien, hebdomadaire et mensuel — pour transformer l’administration réactive en exploitation préventive.

  • Structurer une vérification matinale en 5 minutes
  • Identifier les pods et ressources en échec avant qu’ils ne causent un incident
  • Planifier le nettoyage hebdomadaire des ressources orphelines (jobs, ReplicaSets, pression disque)
  • Contrôler les certificats et les quotas chaque mois
  • Organiser ces tâches avec une checklist actionnable par fréquence
  • Un cluster Kubernetes en production (v1.28+)
  • kubectl configuré avec des droits d’administration
  • Avoir suivi le guide Observer la santé du cluster
  • Accès aux métriques via kubectl top (metrics-server installé)

Chaque matin (ou à chaque début de service), ces 5 commandes donnent une vision immédiate de l’état du cluster. L’objectif : détecter toute anomalie avant qu’elle ne devienne un incident.

  1. Santé des nœuds : tous les nœuds doivent être Ready.

    Fenêtre de terminal
    kubectl get nodes

    Un nœud NotReady ou SchedulingDisabled nécessite une investigation immédiate. Vérifiez si une maintenance est en cours.

  2. Santé de l’API server : le cluster doit répondre positivement à toutes les vérifications internes.

    Fenêtre de terminal
    kubectl get --raw='/readyz?verbose' | grep -E '\[.\]|readyz'

    Tous les checks doivent afficher [+]. Un [-] signale un composant dégradé (etcd, informer-sync, etc.).

  3. Pods en échec : identifier les pods qui ne tournent pas correctement.

    Fenêtre de terminal
    kubectl get pods -A --field-selector=status.phase!=Running,status.phase!=Succeeded | head -30

    Les pods en Pending, Failed ou CrashLoopBackOff apparaissent ici. Priorisez ceux des namespaces système (kube-system, monitoring).

  4. Consommation des ressources : repérer les nœuds sous pression.

    Fenêtre de terminal
    kubectl top nodes

    Les seuils 80% CPU et 85% mémoire sont des repères opérationnels pour attirer l’attention, pas les seuils réels d’éviction du kubelet. Les évictions se déclenchent sur des signaux comme memory.available, nodefs.available ou imagefs.available (voir la section espace disque plus bas).

  5. Événements récents : les warnings des dernières heures.

    Fenêtre de terminal
    kubectl get events -A --sort-by='.lastTimestamp' --field-selector type=Warning | tail -20

    Les événements Warning récurrents signalent souvent un problème sous-jacent : image introuvable, probe en échec, quota dépassé.

Hebdomadaire — ressources orphelines et pression disque

Section intitulée « Hebdomadaire — ressources orphelines et pression disque »

Certaines dérives ne se voient pas au jour le jour mais s’accumulent sur la semaine. Planifiez ces vérifications une fois par semaine.

Des pods Succeeded ou Failed peuvent s’accumuler dans l’API, notamment pour les Jobs et certains workflows batch. Leur cycle de vie exact dépend du contrôleur qui les a créés et des mécanismes de nettoyage associés.

Fenêtre de terminal
# Compter les pods terminés
kubectl get pods -A --field-selector=status.phase==Succeeded --no-headers | wc -l
kubectl get pods -A --field-selector=status.phase==Failed --no-headers | wc -l

Les Jobs et CronJobs créent des pods à chaque exécution. Sans configuration de rétention, ils s’accumulent.

Fenêtre de terminal
# Lister les CronJobs et leur historique
kubectl get cronjobs -A
# Voir les Jobs terminés
kubectl get jobs -A --field-selector=status.successful=1 --no-headers | wc -l

Configurez spec.successfulJobsHistoryLimit et spec.failedJobsHistoryLimit dans vos CronJobs pour limiter automatiquement l’historique (défaut : 3 succès, 1 échec). Pour les Jobs ponctuels, le contrôleur TTL-after-finished (stable depuis Kubernetes 1.23) supprime automatiquement les Jobs terminés après le délai défini par .spec.ttlSecondsAfterFinished.

Les rolling updates créent de nouveaux ReplicaSets à chaque déploiement. Kubernetes conserve un historique (par défaut : 10 révisions via spec.revisionHistoryLimit). Vérifiez que ce paramètre est raisonnable :

Fenêtre de terminal
# Compter les ReplicaSets avec 0 répliques (anciennes révisions)
kubectl get rs -A --no-headers | awk '$3 == 0 && $4 == 0' | wc -l

Pour les clusters avec des déploiements fréquents, réduire revisionHistoryLimit à 3 ou 5 économise des objets dans etcd.

Les ResourceQuota et LimitRange évitent qu’un namespace ne consomme toutes les ressources du cluster. Vérifiez leur utilisation chaque semaine.

Fenêtre de terminal
# Voir les quotas et leur consommation
kubectl get resourcequota -A
Fenêtre de terminal
# Détail d'un quota
kubectl describe resourcequota -n production

Un quota proche de sa limite (UsedHard) signifie que les prochains déploiements dans ce namespace échoueront. Anticipez en augmentant le quota ou en nettoyant les ressources inutilisées.

L’espace disque des nœuds est une ressource critique souvent oubliée. Les images de conteneurs, les logs et les volumes éphémères s’accumulent.

Le kubelet surveille plusieurs seuils d’éviction (configurables) :

SignalSeuil par défautConséquence
memory.available100MiLe kubelet évince des pods
nodefs.available10%Le kubelet évince des pods
imagefs.available15%Le kubelet déclenche le garbage collection des images
nodefs.inodesFree5%Le kubelet évince des pods

Si kubectl describe node affiche la condition DiskPressure: True, le nœud a atteint un seuil d’éviction. Le kubelet va supprimer des images inutilisées et évincer des pods par ordre de QoS (BestEffort en premier).

En cas de pression disque confirmée (avec containerd) :

Fenêtre de terminal
# Sur le nœud (via SSH) — action ciblée, pas une routine
sudo crictl images | grep -v "IMAGE ID"
sudo crictl rmi --prune

Les vérifications mensuelles portent sur des éléments à durée de vie plus longue : certificats, tendances de consommation, backlog de mises à jour.

Si votre cluster est déployé avec kubeadm, les certificats clients des composants du plan de contrôle expirent par défaut après 1 an. Vérifiez leur état :

Fenêtre de terminal
# Sur un nœud control plane
sudo kubeadm certs check-expiration

Renouvelez-les avant expiration :

Fenêtre de terminal
sudo kubeadm certs renew all

Si vous utilisez cert-manager, vérifiez l’état des Certificate :

Fenêtre de terminal
kubectl get certificates -A

La colonne READY doit être True et EXPIRATION doit être dans le futur. Un certificat False mérite une investigation : log du pod cert-manager, challenge DNS/HTTP en erreur, secret manquant.

Faites un point mensuel sur la consommation globale du cluster :

Fenêtre de terminal
kubectl top nodes

Comparez avec les mois précédents. Une tendance à la hausse régulière signale un besoin d’ajuster la capacité (ajout de nœuds, optimisation des requests/limits, nettoyage de workloads inutilisés).

Cette table résume l’ensemble des vérifications en un seul endroit. Chaque ligne correspond à une action concrète, classée par rythme d’intervention.

FréquenceVérificationCommande cléAction si problème
QuotidienneNœuds Readykubectl get nodesInvestiguer nœud NotReady
QuotidienneAPI server sainkubectl get --raw='/readyz?verbose'Vérifier logs composant [-]
QuotidiennePods en écheckubectl get pods -A --field-selector=...Investiguer ou redémarrer
QuotidienneConsommation ressourceskubectl top nodesInvestiguer si repères opérationnels dépassés
QuotidienneÉvénements Warningkubectl get events -A ...Identifier patterns récurrents
HebdomadairePods/Jobs terminéskubectl get pods --field-selector=status.phase==SucceededConfigurer TTL, nettoyer si nécessaire après analyse
HebdomadaireReplicaSets orphelinskubectl get rs -AAjuster revisionHistoryLimit
HebdomadaireQuotas namespacekubectl get resourcequota -AAjuster si proche limite
HebdomadairePression disquekubectl describe node (DiskPressure)Nettoyage ciblé si confirmé
MensuelleCertificats control planekubeadm certs check-expirationRenouveler si < 30 jours
MensuelleCertificats Ingresskubectl get certificates -AVérifier cert-manager
MensuelleTendances capacitékubectl top nodes (historique)Planifier ajustements

Toutes les anomalies ne nécessitent pas une action immédiate. Voici un guide de priorisation pour décider de l’urgence d’intervention.

SituationNiveauAction
1 pod applicatif en CrashLoopBackOffNormalDiagnostic dans la journée
Problème persistant dans kube-system (DNS, CNI, kube-proxy, stockage)UrgentInvestigation prioritaire — composant cœur du cluster
Nœud NotReadyUrgentVérifier connectivité, kubelet, disque
readyz retourne un [-]CritiqueInvestiguer immédiatement — composant dégradé
DiskPressure: True sur un nœudUrgentNettoyage ciblé, vérifier logs/volumes
Certificat expire dans < 7 joursCritiqueRenouveler immédiatement
Quota namespace proche de la limiteNormalPlanifier augmentation ou nettoyage
SymptômeCause probableSolution
kubectl top nodes ne fonctionne pasmetrics-server absent ou mal configuréInstaller metrics-server avec --kubelet-insecure-tls si auto-signé
Pods en Evicted qui s’accumulentPression disque ou mémoire sur un nœudVérifier conditions du nœud (DiskPressure, MemoryPressure). Nettoyage ciblé si confirmé
Events FailedScheduling récurrentsRessources insuffisantes ou taints non toléréesVérifier requests/limits, taints, et nombre de nœuds disponibles
kubeadm certs check-expiration échoueCluster non déployé avec kubeadmConsulter la documentation de votre outil de déploiement (kubespray, RKE2, etc.)
Quota dépassé, déploiement refuséResourceQuota atteint dans le namespacekubectl describe resourcequota -n <ns> pour voir l’utilisation
  • Un cluster sain se surveille régulièrement selon trois rythmes : quotidien (5 min), hebdomadaire (revue des ressources orphelines) et mensuel (certificats, tendances).
  • Les seuils 80% CPU / 85% mémoire sont des repères opérationnels, pas les seuils réels d’éviction du kubelet. Les évictions reposent sur des signaux comme memory.available ou nodefs.available.
  • Préférez le nettoyage automatique (ttlSecondsAfterFinished, revisionHistoryLimit, successfulJobsHistoryLimit) au nettoyage manuel systématique.
  • Les certificats du plan de contrôle expirent après 1 an (kubeadm). Surveillez-les chaque mois et renouvelez sans supprimer les manifests.
  • Un problème persistant sur un composant cœur de kube-system (DNS, CNI, kube-proxy) est toujours prioritaire. Un pod applicatif en échec peut souvent attendre.
  • Cette checklist manuelle prépare la transition vers un monitoring automatisé (Prometheus, Alertmanager) sans le remplacer.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn