Warum StatefulSets? Kann ein zustandsloser Pod keine dauerhaften Volumes verwenden?

75

Ich versuche Stateful Sets zu verstehen . Wie unterscheidet sich ihre Verwendung von der Verwendung von "zustandslosen" Pods mit persistenten Volumes? Das heißt, unter der Annahme, dass ein "normaler" Pod Anspruch auf dauerhaften Speicher erhebt, was fehlt mir offensichtlich, das dieses neue Konstrukt erfordert (mit geordnetem Start / Stopp usw.)?

Laird Nelson
quelle

Antworten:

121

Ja, ein normaler Pod kann ein dauerhaftes Volume verwenden. Manchmal haben Sie jedoch mehrere Pods, die logisch eine "Gruppe" bilden. Beispiele hierfür sind Datenbankreplikate, ZooKeeper-Hosts, Kafka-Knoten usw. In all diesen Fällen gibt es eine Reihe von Servern, die zusammenarbeiten und miteinander kommunizieren. Das Besondere an ihnen ist, dass jeder Einzelne in der Gruppe eine Identität hat. Bei einem Datenbankcluster ist beispielsweise einer der Master und zwei Follower. Jeder der Follower kommuniziert mit dem Master und teilt ihm mit, was er synchronisiert hat und was nicht. Die Follower wissen also, dass "db-x-0" der Master ist, und der Master weiß, dass "db-x-2" ein Follower ist und alle Daten bis zu einem bestimmten Punkt hat, aber weiterhin Daten darüber hinaus benötigt.

In solchen Situationen benötigen Sie einige Dinge, die Sie mit einem normalen Pod nicht leicht erreichen können:

  1. Ein vorhersehbarer Name: Sie möchten Ihre Pods starten und ihnen mitteilen, wo sie sich finden können, damit sie einen Cluster bilden, einen Anführer wählen usw. Sie müssen jedoch ihre Namen im Voraus kennen, um dies zu tun. Normale Pod-Namen sind zufällig, sodass Sie sie nicht im Voraus kennen.
  2. Eine stabile Adresse / ein stabiler DNS-Name: Sie möchten, dass die in Schritt (1) verfügbaren Namen gleich bleiben. Wenn ein normaler Pod auf einem anderen Host neu gestartet wird (Sie stellen ihn erneut bereit, der Host, auf dem er ausgeführt wurde, stirbt usw.), erhält er einen neuen Namen und eine neue IP-Adresse.
  3. Eine dauerhafte Verbindung zwischen einer Person in der Gruppe und ihrem dauerhaften Volume: Wenn der Host, auf dem einer Ihrer Datenbankmaster ausgeführt wurde, stirbt, wird er auf einen neuen Host verschoben, sollte jedoch eine Verbindung zu demselben dauerhaften Volume herstellen , auf dem sich nur ein Volume befindet das enthält die richtigen Daten für diese "Person". Wenn Sie beispielsweise Ihre Gruppe von 3 Datenbankhosts erneut bereitstellen, möchten Sie, dass dieselbe Person (nach DNS-Name und IP-Adresse) dasselbe persistente Volume erhält, sodass der Master immer noch der Master ist und immer noch dieselben Daten hat, replica1 erhält es Daten usw.

StatefulSets lösen diese Probleme, weil sie Folgendes bieten (zitiert aus https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ ):

  1. Stabile, eindeutige Netzwerkkennungen.
  2. Stabiler, dauerhafter Speicher.
  3. Geordnete, ordnungsgemäße Bereitstellung und Skalierung.
  4. Geordnete, ordnungsgemäße Löschung und Kündigung.

Ich habe nicht wirklich über (3) und (4) gesprochen, aber das kann auch bei Clustern hilfreich sein, da Sie dem ersten mitteilen können, dass er bereitgestellt werden soll, um der Master zu werden, und dem nächsten den ersten finden und ihn als Master behandeln usw.

Wie einige angemerkt haben, können Sie zwar einige der gleichen Vorteile erzielen, indem Sie reguläre Pods und Dienste verwenden, aber es ist viel mehr Arbeit. Wenn Sie beispielsweise 3 Datenbankinstanzen möchten, können Sie 3 Bereitstellungen und 3 Dienste manuell erstellen. Beachten Sie, dass Sie 3 Bereitstellungen manuell erstellen müssen, da Sie keinen Servicepunkt für einen einzelnen Pod in einer Bereitstellung haben können. Zum Skalieren würden Sie dann manuell eine andere Bereitstellung und einen anderen Dienst erstellen. Dies funktioniert und war eine gängige Praxis, bevor PetSet / PersistentSet hinzukam. Beachten Sie, dass einige der oben aufgeführten Vorteile fehlen (z. B. dauerhafte Volumenzuordnung und feste Startreihenfolge).

Oliver Dain
quelle
11
Dies ist eine sehr gut formulierte Antwort, die mir genau das gibt, was ich brauchte. Gut gemacht und danke!
Laird Nelson
Wenn Sie dies der Vollständigkeit halber ein wenig verdauen, geben mir Kubernetes Services nicht (Ihre) 1 und 2? (Ich bekomme (Ihre) 3 ist einzigartig.) Kann ich nicht einfach alle meine (relevanten) Pods mit einem Service ausstatten und auf diese Weise vorhersehbare Namen und Adressen erhalten?
Laird Nelson
1
Sie müssen Ihr persistentes Volumen manuell von einem Knoten auf einen anderen verschieben. Ein StatefulSet kümmert sich auch darum, das persistente Volumen zusammen mit dem Pod zu bewegen.
iamnat
2
Außerdem müssen Sie manuell einen Dienst pro Pod erstellen. Dies bedeutet, dass Sie keine Bereitstellung verwenden können, sodass Sie jeden Pod manuell erstellen müssen. Skalieren bedeutet dann, mehr Pods und Services manuell zu erstellen. Es kann gemacht werden (ich habe es gemacht, bevor sie Petsets hinzugefügt haben), aber es ist schmerzhaft.
Oliver Dain
2
@ChristianSchmitt Es ist wahr, dass ein Service mehrere Pods umfassen kann. Ich denke, in der Antwort geht es darum, 1 Dienst pro eindeutiger Person in der Gruppe zu haben, damit Sie den Master, die erste Replik usw. einzeln ansprechen können, zusätzlich zu einem Dienst, der mit "jedem alten Mitglied" spricht, was Sie beschreiben .
Oliver Dain