Kubernetes-Bereitstellungen im Vergleich zu StatefulSets

110

Ich habe viel in Kubernetes gegraben und mir gefällt, was ich viel sehe! Eine Sache, über die ich keine klare Vorstellung bekommen konnte, ist, wie genau die Unterschiede zwischen den Ressourcen Deployment und StatefulSet unterschieden werden und in welchen Szenarien Sie sie verwenden würden (oder ob eines im Allgemeinen dem anderen vorgezogen wird).

Alle Erfahrungen, die Menschen teilen können, wären fantastisch !!

SS781
quelle

Antworten:

113

Bereitstellungen und ReplicationController sind für die zustandslose Verwendung gedacht und relativ leicht. StatefulSets werden verwendet, wenn der Status beibehalten werden muss. Daher verwenden volumeClaimTemplates/ beanspruchen letztere persistente Volumes, um sicherzustellen, dass sie den Status über Komponentenneustarts hinweg beibehalten können.

Wenn Ihre Anwendung statusbehaftet ist oder wenn Sie zustandsbehafteten Speicher über Kubernetes bereitstellen möchten, verwenden Sie ein StatefulSet.

Wenn Ihre Anwendung zustandslos ist oder wenn beim Start ein Status aus Backend-Systemen erstellt werden kann, verwenden Sie Bereitstellungen.

Weitere Details zum Ausführen von Stateful-Anwendungen finden Sie im Blogeintrag von kubernetes über Stateful-Anwendungen für 2016

pagid
quelle
16
Ich kann auch die Pods einer Bereitstellung mit dauerhaften Volumenansprüchen verbinden und sicher sein.
Torsten Bronger
9
@TorstenBronger Ich stimme zu - an welchem ​​Punkt kehren wir zur ursprünglichen Frage zurück, worum es bei StatefulSets geht.
HDave
6
@HDave Mit dynamischen persistenten Volumes und sich schnell entwickelnden Speicheranbietern (wie Portworx, OpenEBS) kann das Problem der Datenpersistenz behoben werden, aber die Benennung und die Reihenfolge des Starts / Upgrades unterscheiden sich bei StatefulSets immer noch, sodass Apps erforderlich sind, für die Master / Slave oder andere Einstellungen erforderlich sind richtig einen Cluster bilden. Obwohl ich damit einverstanden bin, dass all dies möglicherweise in einer einzigen deploymentKonfiguration mit einer einfachen Spezifikation zusammengefasst werden kann, um 1 pro Knoten (Daemonset), Replikate oder Stateful Ordering festzulegen.
Mani Gandham
4
Es ist wichtig zu wissen, dass es bei der "Start- / Upgrade-Reihenfolge" um Pod-Replikate (dh 1, 2, 3 ...) geht - nicht um verschiedene Pods (dh Web, srv, db usw.). Anders ausgedrückt, es ist kein Ersatz für Docker-Compose-Abhängigkeiten.
HDave
72
  • Bereitstellung - Sie geben einen PersistentVolumeClaim an , der von allen Pod-Replikaten gemeinsam genutzt wird. Mit anderen Worten, gemeinsames Volumen.

    Der Sicherungsspeicher offensichtlich muss ReadWriteMany oder ReadOnlyMany access , wenn Sie mehr als eine Replik pod haben.

  • StatefulSet - Sie geben ein volumeClaimTemplates an, damit jedem Replikat-Pod ein eindeutiger PersistentVolumeClaim zugeordnet wird. Mit anderen Worten, kein gemeinsames Volume.

    Hier kann der Sicherungsspeicher über ReadWriteOnce accessMode verfügen.

    StatefulSet ist nützlich, um Dinge im Cluster auszuführen, z. B. im Hadoop-Cluster oder im MySQL-Cluster, wo jeder Knoten seinen eigenen Speicher hat.

Emmanuel Osimosu
quelle
23

TL; DR

Die Bereitstellung ist eine Ressource zum Bereitstellen einer zustandslosen Anwendung. Wenn Sie ein PVC verwenden, verwenden alle Replikate dasselbe Volume und keines davon hat seinen eigenen Status.

Statefulsets wird für Stateful-Anwendungen verwendet. Jedes Replikat des Pods hat seinen eigenen Status und verwendet sein eigenes Volume.

DaemonSet ist ein Controller, der sicherstellt, dass der Pod auf allen Knoten des Clusters ausgeführt wird. Wenn ein Knoten zu einem Cluster hinzugefügt / daraus entfernt wird, fügt DaemonSet den Pod automatisch hinzu / löscht ihn.

Ich habe über die detaillierten Unterschiede zwischen Bereitstellungen, StatefulSets und Daemonsets sowie über die Bereitstellung einer Beispielanwendung mithilfe dieser Ressourcen K8s geschrieben: Bereitstellungen vs StatefulSets vs DaemonSets .

Ali Kahoot
quelle
4
Um Ihrem Kommentar nachzugehen, scheint es mir, dass der Unterschied zwischen beiden darin besteht, dass einer die Möglichkeit hat, den podspezifischen Speicher anzugeben (und somit den podspezifischen Status beizubehalten), während der andere dies nicht tut (und somit nur den Dienst beibehalten kann) -weiter Staat). In diesem Sinne können beide auf Serviceebene als zustandsbehaftet angesehen werden. Aber auf der Pod-Ebene ist nur Statefulsets stateful.
Scheide
14

StatefulSet

Verwenden Sie 'StatefulSet' mit Stateful Distributed Applications, für die jeder Knoten einen dauerhaften Status haben muss . StatefulSet bietet die Möglichkeit, eine beliebige Anzahl von Knoten für eine statusbehaftete Anwendung / Komponente über eine Konfiguration zu konfigurieren (Replikate = N).

Es gibt zwei Arten von zustandsverteilten Anwendungen: Master-Master und Master-Slave. Alle Knoten in einer Master-Master-Konfiguration und Slave-Knoten in einer Master-Slave-Konfiguration können ein StatefulSet verwenden.
Beispiele:
Master-Slave -> Datenknoten (Slaves) in einem Hadoop-Cluster
Master-Master -> Datenbankknoten (Master-Master) in einem Cassandra-Cluster

Jeder Pod (Replikat / Knoten) in einem StatefulSet verfügt über eine eindeutige und stabile Netzwerkidentität. Beispielsweise hat in einem Cassandra StatefulSet mit dem Namen 'Cassandra' und der Anzahl der Replikatknoten als N jeder Cassandra-Pod (Knoten):

  • Ordnungsindex für jede Hülse: 0,1, .., N-1
  • Stabile Netzwerk-ID: Cassandra-0, Cassandra-1, .., Cassandra-N-1
  • Ein separates dauerhaftes Volume für jeden Pod anhand einer Volume-Claim-Vorlage, dh ein separater Speicher für jeden Pod (Knoten).
  • Pods werden in der Reihenfolge 0 bis N-1 erstellt und in umgekehrter Reihenfolge N-1 bis 0 beendet

Siehe: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Einsatz

'Deployment' hingegen eignet sich für zustandslose Anwendungen / Dienste, für die die Knoten keine spezielle Identität benötigen. Ein Load Balancer kann jeden von ihm ausgewählten Knoten erreichen. Alle Knoten sind gleich. Eine Bereitstellung ist nützlich, um über eine Konfiguration eine beliebige Anzahl beliebiger Knoten zu erstellen (Replikate = N).

Anurag
quelle
7

Der Unterschied zwischen StatefulSet und Bereitstellung

StatefulSet entspricht einer speziellen Bereitstellung. Jeder Pod in StatefulSet verfügt über eine stabile, eindeutige Netzwerkkennung, mit der andere Mitglieder im Cluster erkannt werden können. Wenn der Name von StatefulSet Kafka ist, heißt der erste Pod Kafka-0, der zweite Kafka-1 und so weiter. Die Start- und Stoppsequenz der vom StatefulSet gesteuerten Pod-Kopie wird gesteuert. Wenn der n-te Pod betrieben wird, laufen die ersten N-1-Pods bereits und sind bereit. Der Pod im StatefulSet verwendet ein stabiles, dauerhaftes Speichervolumen, das von PV oder PVC implementiert wird. Beim Löschen des Pods wird das dem StatefulSet zugeordnete Speichervolumen standardmäßig nicht gelöscht (aus Gründen der Datensicherheit). Das StatefulSet ist an das PV-Volumen gebunden. Wird zum Speichern von Pod-Statusdaten verwendet und auch in Verbindung mit kopflosen Diensten verwendet, die als zu diesem kopflosen Dienst gehörend deklariert wurden.

Adler.Liu
quelle