Déploiements Kubernetes vs StatefulSets

110

J'ai beaucoup creusé sur Kubernetes, et j'aime beaucoup ce que je vois! Une chose sur laquelle je n'ai pas pu me faire une idée claire est de savoir quelles sont les distinctions exactes entre les ressources Deployment et StatefulSet et dans quels scénarios utiliseriez-vous chacune (ou est-ce que l'un est généralement préféré à l'autre).

Toutes les expériences que les gens peuvent partager seraient géniales !!

SS781
la source

Réponses:

114

Les déploiements et les ReplicationControllers sont destinés à une utilisation sans état et sont plutôt légers. Les StatefulSets sont utilisés lorsque l'état doit être conservé. Par conséquent, ces derniers utilisent volumeClaimTemplates/ revendiquent des volumes persistants pour s'assurer qu'ils peuvent conserver l'état lors des redémarrages des composants.

Donc, si votre application est avec état ou si vous souhaitez déployer un stockage avec état au-dessus de Kubernetes, utilisez un StatefulSet.

Si votre application est sans état ou si l'état peut être construit à partir de systèmes backend pendant le démarrage, utilisez les déploiements.

Vous trouverez plus de détails sur l'exécution d'une application avec état dans l' entrée de blog 2016 de kubernetes sur les applications avec état

pagide
la source
16
Je peux également connecter les pods d'un déploiement avec des revendications de volume persistantes et être en sécurité.
Torsten Bronger
9
@TorstenBronger Je suis d'accord - à quel point nous revenons à la question initiale de savoir à quoi servent les StatefulSets?
HDave
6
@HDave Avec des volumes persistants dynamiques et des fournisseurs de stockage en développement rapide (comme Portworx, OpenEBS), le problème de persistance des données peut être résolu, mais la dénomination et l'ordre de démarrage / mise à niveau sont toujours différents avec StatefulSets, permettant aux applications qui nécessitent une configuration maître / esclave ou autre pour former correctement un cluster. Bien que je sois d'accord sur le fait que tout cela peut peut-être être plié en une seule deploymentconfiguration avec une spécification simple pour définir 1 par nœud (ensemble de démons), des répliques ou un ordre avec état.
Mani Gandham
4
Il est important de réaliser que "l'ordre de démarrage / de mise à niveau" concerne les répliques de pod (c'est-à-dire 1, 2, 3 ...) - pas différents pods (c'est-à-dire web, srv, db, etc.). En d'autres termes, ce n'est pas une substitution pour les dépendances docker-compose.
HDave
72
  • Déploiement: vous spécifiez un PersistentVolumeClaim partagé par tous les réplicas de pod. En d'autres termes, volume partagé.

    Le stockage de sauvegarde doit évidemment avoir ReadWriteMany ou ReadOnlyMany accessMode si vous avez plus d'un pod de réplica.

  • StatefulSet - Vous spécifiez un volumeClaimTemplates afin que chaque pod de réplica obtienne un PersistentVolumeClaim unique qui lui est associé. En d'autres termes, pas de volume partagé.

    Ici, le stockage de sauvegarde peut avoir ReadWriteOnce accessMode.

    StatefulSet est utile pour exécuter des choses dans un cluster, par exemple un cluster Hadoop, un cluster MySQL, où chaque nœud a son propre stockage.

Emmanuel Osimosu
la source
23

TL; DR

Le déploiement est une ressource pour déployer une application sans état, si vous utilisez un PVC, tous les réplicas utiliseront le même volume et aucun d'entre eux n'aura son propre état.

Statefulsets est utilisé pour les applications avec état, chaque réplica du pod aura son propre état et utilisera son propre volume.

DaemonSet est un contrôleur qui garantit que le pod s'exécute sur tous les nœuds du cluster. Si un nœud est ajouté / supprimé d'un cluster, DaemonSet ajoute / supprime automatiquement le pod.

J'ai écrit sur les différences détaillées entre les déploiements, les StatefulSets et les Daemonsets, et comment déployer un exemple d'application à l'aide de ces ressources K8s: Deployments vs StatefulSets vs DaemonSets .

Ali Kahoot
la source
4
Pour faire suite à votre commentaire, il me semble que la différence entre les deux est que l'un a la possibilité de spécifier le stockage spécifique du pod (et donc de conserver l'état spécifique du pod), tandis que l'autre ne le fait pas (et ne peut donc que persister le service dans tout l'État). En ce sens, au niveau du service, les deux peuvent être considérés comme avec état. Mais au niveau du pod, seuls les Statefulsets sont avec état.
scabbage
14

StatefulSet

Utilisez 'StatefulSet' avec les applications distribuées avec état, qui nécessitent que chaque nœud ait un état persistant . StatefulSet offre la possibilité de configurer un nombre arbitraire de nœuds, pour une application / un composant avec état, via une configuration (réplicas = N).

Il existe deux types d'applications distribuées avec état: maître-maître et maître-esclave. Tous les nœuds dans une configuration maître-maître et les nœuds esclaves dans une configuration maître-esclave peuvent utiliser un StatefulSet.
Exemples:
Master-Slave -> Datanodes (esclaves) dans un cluster Hadoop
Master-Master -> Database nodes (master-master) dans un cluster Cassandra

Chaque pod (réplica / nœud) d'un StatefulSet possède une identité réseau unique et stable. Par exemple, dans un Cassandra StatefulSet avec le nom `` cassandra '' et le nombre de nœuds de réplique sous la forme N, chaque pod Cassandra (nœud) a:

  • Indice ordinal pour chaque pod: 0,1, .., N-1
  • Identifiant de réseau stable: cassandra-0, cassandra-1, .., cassandra-N-1
  • Un volume persistant distinct pour chaque pod par rapport à un modèle de revendication de volume, c'est-à-dire un stockage séparé pour chaque pod (nœud)
  • Les pods sont créés dans l'ordre 0 à N-1 et se terminent dans l'ordre inverse N-1 à 0

Reportez-vous: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Déploiement

« Déploiement » d'autre part convient aux apatrides des applications / services où les nœuds ne nécessitent pas d' identité particulière. Un équilibreur de charge peut atteindre n'importe quel nœud de son choix. Tous les nœuds sont égaux. Un déploiement est utile pour créer n'importe quel nombre de nœuds arbitraires, via une configuration (répliques = N).

Anurag
la source
7

La différence entre StatefulSet et déploiement

StatefulSet équivaut à un déploiement spécial. Chaque pod de StatefulSet possède un identifiant de réseau unique et stable qui peut être utilisé pour découvrir d'autres membres du cluster. Si le nom de StatefulSet est Kafka, alors le premier pod est appelé Kafka-0, le deuxième Kafka-1, et ainsi de suite; la séquence de démarrage et d'arrêt de la copie de pod contrôlée par le StatefulSet est contrôlée. Lorsque le nième pod est utilisé, les premiers N-1 pods fonctionnent déjà et sont prêts Bon état; le pod du StatefulSet utilise un volume de stockage persistant stable, implémenté par PV ou PVC. Lors de la suppression du pod, le volume de stockage associé au StatefulSet n'est pas supprimé par défaut (pour la sécurité des données); le StatefulSet est lié au volume PV. Utilisé pour stocker les données d'état du pod, et également utilisé en conjonction avec des services sans tête, déclarés appartenir à ce service sans tête;

Adler.Liu
la source