HPA sur métriques custom : quand le CPU ne dit rien d'utile
Un worker qui consomme une file d'attente peut tourner à 5% de CPU tout en étant complètement submergé. Le HPA sur métrique custom résout ce que CPU/mémoire ne peuvent pas voir.
Ce que Kubernetes fait vraiment quand la charge monte, quand un nœud tombe, quand un pod refuse de mourir. Les sections suivent l'ordre dans lequel les problèmes arrivent en exploitation.
42 articles · 5 sections
Pourquoi un pod est tué, throttlé, ou refuse d’être planifié.
Un worker qui consomme une file d'attente peut tourner à 5% de CPU tout en étant complètement submergé. Le HPA sur métrique custom résout ce que CPU/mémoire ne peuvent pas voir.
Le HPA scale les pods, chaque pod ouvre son propre pool de connexions. Sous charge, la base atteint max_connections avant même que le HPA n'ait fini de scaler.
La classe QoS d'un pod fixe son ordre d'éviction, déduite des requests/limits, jamais choisie explicitement. Un service critique sans limits part en premier.
Sans priorité définie, tous les pods sont égaux devant un nœud saturé. PriorityClass et la préemption décident qui reste et qui se fait évincer quand la capacité manque.
kubectl top pod et le HPA n'ont aucune donnée à lire sans metrics-server installé. Comment il fonctionne, et l'erreur de certificat la plus fréquente à l'installation.
Les taints repoussent tous les pods d'un nœud sauf ceux qui les tolèrent explicitement. Les trois effets, et pourquoi ce n'est pas une affinité positive.
Le Cluster Autoscaler reste prisonnier des groupes de nœuds préconfigurés. Karpenter provisionne l'instance exacte dont le pod a besoin, sans ce détour.
Le VPA sert à dimensionner les requests CPU/mémoire à partir de la consommation réelle. Son mode Auto redémarre les pods à chaque ajustement.
CrashLoopBackOff est un symptôme, jamais une cause. Trois familles d'origine différentes, une méthode pour les distinguer en quelques commandes.
Le Cluster Autoscaler ajoute des nœuds facilement. Le scale down casse en silence : PDB trop stricts, pods sans contrôleur, annotation oubliée.
Pourquoi le Horizontal Pod Autoscaler ne fonctionne pas sans requests correctement posées, comment il décide de scaler, et le piège de l'oscillation.
Ce qui se passe vraiment quand un pod Kubernetes dépasse sa limite CPU ou mémoire, les classes QoS, le débat des limites, et une méthode de réglage.
Résolution, routage et politiques — la couche qui échoue en silence.
Une résolution de nom incohérente entre deux machines pointe souvent vers nsswitch.conf, pas vers le DNS : il définit l'ordre des sources pour hosts, passwd et group.
LoadBalancer et NodePort ne remplacent jamais ClusterIP : ils l'ajoutent en couche. Comprendre cet empilement évite de choisir le mauvais type de Service.
L'Ingress encode toute logique avancée dans des annotations propres à chaque contrôleur. La Gateway API sépare les rôles en ressources typées, portables entre contrôleurs.
port-forward passe par le serveur API, pas par le réseau du pod. NetworkPolicy ne le voit jamais, un angle mort qui a son propre verbe RBAC à restreindre spécifiquement.
Le ndots:5 par défaut de Kubernetes essaie 5 domaines de recherche internes avant chaque nom externe. Une latence DNS invisible jusqu'à ce qu'elle s'accumule.
Une table conntrack pleine ne ralentit rien : elle rejette silencieusement les nouvelles connexions, un symptôme qui ressemble à un problème applicatif ailleurs.
Un Ingress ne fait rien sans contrôleur pour l'exécuter. nginx-ingress et Traefik répondent au même besoin par deux modèles de configuration opposés.
Un Service de type LoadBalancer reste en Pending indéfiniment sur un cluster on-premise, faute de cloud provider pour le satisfaire. Ce que MetalLB fait à la place.
Un Deployment ne garantit aucune répartition par nœud. DaemonSet en garantit une exacte, le mécanisme derrière la plupart des agents d'infrastructure.
Comment un Ingress route le trafic HTTP, ce que cert-manager automatise pour les certificats Let's Encrypt, et le piège du challenge HTTP-01.
Volumes, sauvegardes et migrations sans perdre de données.
df continue d'afficher l'ancienne taille après un lvextend réussi : agrandir un volume logique LVM ne redimensionne jamais automatiquement le système de fichiers qu'il contient.
VolumeSnapshot capture l'état d'un PVC à un instant donné, sans jamais toucher aux ressources Kubernetes autour. Un besoin différent de la sauvegarde cluster complète.
Sans cloud provider, aucun StorageClass ne provisionne de volume automatiquement. Ce que Longhorn fait à la place, et ce que la réplication ne remplace pas.
Un Deployment traite ses pods comme interchangeables. Une base de données ne l'est pas : elle a besoin d'une identité stable et de son propre volume. C'est le rôle du StatefulSet.
Mettre en ligne sans coupure, et revenir en arrière quand il le faut.
Un Deployment ne modifie jamais un ReplicaSet existant : il en crée un nouveau et réduit l'ancien à zéro replica. C'est ce mécanisme précis qui rend le rollback possible.
rollout restart force un rolling update propre sans modifier une seule ligne du Deployment. La bonne commande pour un refresh de ConfigMap ponctuel, pas kubectl delete pod.
Modifier un ConfigMap ne redémarre aucun pod automatiquement. Les variables d'environnement ne se mettent même jamais à jour sans un redémarrage manuel.
Un hook Helm s'exécute en dehors de la release qu'il accompagne. helm rollback ne le rejoue jamais, ce qui casse le principe même du rollback si on ne le sait pas.
Kubernetes envoie SIGTERM et retire un pod des endpoints du Service en parallèle, jamais dans un ordre garanti. Sans preStop, des requêtes arrivent dans le vide.
Le blue-green bascule tout le trafic d'un coup, pas progressivement. Rollback instantané, prix réel : deux environnements complets à faire tourner en double.
Comment ArgoCD réconcilie en continu l'état du cluster avec Git, la différence entre push et pull deployment, et ce que la dérive (drift) révèle vraiment.
Comment les révisions d'un Deployment correspondent aux ReplicaSets, ce que kubectl rollout undo restaure vraiment, et pourquoi GitOps préfère un revert Git.
Qui peut faire quoi dans le cluster, et ce qui est refusé à l’entrée.
RBAC empêche, Falco détecte en direct, l'audit logging répond après l'incident. Sans Audit Policy activée, cette question n'a tout simplement pas de réponse.
Un finalizer bloqué, pas Kubernetes, empêche un objet en Terminating de mourir : il attend un nettoyage qu'un contrôleur disparu ne fera jamais.
Des environnements éphémères par pull request, créés et détruits automatiquement, résolvent un vrai problème de revue. Ce que ça coûte en isolation, et le piège du nettoyage qui ne se fait jamais.
Namespaces, vcluster ou clusters séparés : trois façons d'isoler des équipes sur Kubernetes, avec un compromis identique entre force d'isolation et coût opérationnel.
Gérer un Application ArgoCD par service tient à dix équipes. À cent, ApplicationSets automatise la génération, mais déplace le vrai problème d'isolation.
PodSecurityPolicy est mort depuis Kubernetes 1.25. Pod Security Admission le remplace par trois profils appliqués via un simple label de namespace.
Des requests bien posées protègent un pod. Rien n'empêche une équipe d'en créer mille sans limite globale. ResourceQuota et LimitRange gouvernent au niveau du namespace.
RBAC Kubernetes refuse tout par défaut, mais un rôle trop large ne casse jamais rien : il existe, silencieux, jusqu'à l'incident qui l'expose.