Vous n’« allumez » pas un Pod. Vous écrivez un spec — trois réplicas, cette image, cette readiness — et vous le laissez dans etcd via l’API. C’est l’état désiré. Le monde réel — ce qui tourne, ce qui est ready, ce qui est mort — est l’état observé, reporté par les kubelets, recopié dans le status.
Un contrôleur est une boucle : lire les deux, calculer l’écart, agir, recommencer. Le ReplicaSet crée un Pod s’il en manque un. Le kubelet tire une image si le spec le demande. L’EndpointSlice retire une adresse si la readiness échoue. Rien de tout cela n’est un script que vous lancez une fois. Apply est un souhait. La boucle est le métier.
Parce que les incidents sont des écarts qui durent. Pending : le désiré n’est pas plaçable. CrashLoop : le désiré « un conteneur Running » se heurte à un process qui sort. Service vide : le désiré « du trafic vers app=api » ne voit aucun Pod ready. HPA : un autre contrôleur écrit le désiré (replicas) à votre place. Comprendre qui réconcilie évite de relancer kubectl delete pod comme unique remède — vous dérangez l’observé ; le contrôleur recréera le même écart.
C’est aussi le modèle mental du GitOps : le dépôt est une source du désiré ; le reconcileur (Argo, Flux, un humain) n’est qu’un client de plus. Drift n’est pas un mystère, c’est une boucle plus lente que l’autre, ou un acteur qui écrit dans l’API hors bande.
Que vous séparez spec et status dans un kubectl get -o yaml. Que vous nommez au moins un contrôleur et son écart typique. Que vous acceptez l’asynchronisme : kubectl apply qui rend la main ne veut pas dire « c’est en service ». rollout status, les Conditions (Available, Progressing), les Events, sont la façon de lire la boucle, pas un rituel.
La mauvaise réponse : « Kubernetes démarre mes conteneurs. » La bonne : Kubernetes compare sans cesse ce que j’ai déclaré à ce qu’il voit, et chaque objet a quelqu’un dont c’est le travail.
« Que faites-vous quand le désiré et l’observé ne convergent plus ? »
On identifie le contrôleur bloqué — scheduler, kubelet, ReplicaSet, provisioner CSI, Ingress controller — via Events et Conditions, pas via un redémarrage général du nœud. Puis on enlève la cause (quota, image, sonde, taint) plutôt que d’écrire plus fort dans le spec. Augmenter replicas alors que rien n’est plaçable agrandit l’écart. La boucle n’est pas une suggestion : si elle n’avance pas, c’est qu’une contrainte qu’elle respecte est invisible pour vous.
Cette boucle, appliquée au premier objet que l’on apprend, est celle du Deployment fiable ; la chaîne jusqu’au navigateur, dans qui fait quoi.