Quand un StatefulSet plutôt qu’un Deployment ?

Questions d’entrevue Kubernetes

Intermédiairestatefulsetdeploymentsidentite

Le Deployment traite les Pods comme des copies interchangeables. api-7d9f8 meurt, api-1c2ab naît : même Service, même rôle, disque éphémère. C’est ce qu’on veut pour une API, un front, un worker sans état.

Le StatefulSet traite les Pods comme des membres nommés. data-0, data-1, data-2 gardent leur hostname, leur DNS (data-0.peer.ns.svc.cluster.local) et, via volumeClaimTemplates, leur PVC. Si data-1 meurt, c’est data-1 qui revient, sur le même volume. L’ordre de démarrage et d’arrêt est prévisible (OrderedReady par défaut).

Quand le Deployment ne suffit vraiment pas

  • Identité de pair : un nœud etcd, un broker Kafka, un membre de replica set Mongo qui doit se présenter sous le même nom.
  • Disque stable par instance : chaque réplica a son journal, on ne peut pas monter le même RWO sur trois Pods anonymes.
  • Mise à l’échelle ordonnée : on n’ajoute pas data-5 avant que data-4 soit ready, ou l’inverse à la descente.

Un Service headless (clusterIP: None) accompagne presque toujours le StatefulSet : le DNS expose les Pods, pas une seule VIP. Les clients qui font du peer discovery en ont besoin.

Ce que l’intervieweur vérifie

Que vous ne répondez pas « pour les bases, toujours ». Un StatefulSet n’est pas un opérateur. Il ne fait pas les backups, les failovers raffinés, les re-shard. Beaucoup d’équipes posent un StatefulSet + un Operator (ou un service managé) précisément parce que l’objet seul gère l’identité, pas le métier. Et qu’un Redis cache sans persistance tient très bien en Deployment.

L’autre piège : scaler un StatefulSet à 0 puis à N ne reformate pas les PVC. Les disques sont toujours là. C’est une qualité, jusqu’au jour où l’on voulait un cluster neuf.

La relance probable

« Pourquoi pas un Deployment avec des PVC ? »

Parce que le Deployment peut recréer le Pod n’importe où, et le lien Pod ↔ PVC n’est pas une identité stable dans le template. Vous vous retrouvez à figer nodeName ou à jouer des anti-affinités fragiles. Le StatefulSet est ce contrat. Le Deployment reste le bon défaut ; le StatefulSet est l’exception que l’on justifie.

Le Deployment, lui, reste le premier objet à maîtriser : votre premier Deployment vraiment fiable.

Toutes les questions Kubernetes