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:
- 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.
- 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.
- 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/ ):
- Stabile, eindeutige Netzwerkkennungen.
- Stabiler, dauerhafter Speicher.
- Geordnete, ordnungsgemäße Bereitstellung und Skalierung.
- 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).