Wie man ein StatefulSet in Kubernetes erstellt
StatefulSets enthalten ein Set von Pods mit eindeutigen, dauerhaften Identitäten und stabilen Hostnamen. In einem Statefulset wird ein Pod-Template verwendet, welches eine Spezifikation für seine Pods enthält, Pods werden mit dieser Spezifikation erstellt. Wir können Stateful-Applikationen und geclusterte Applikationen mit Statefulsets in Kubernetes deployen. StatefulSet kann aktualisiert werden, indem man Änderungen an seiner Pod-Spezifikation vornimmt, die seine Container-Images und Volumes enthält.
StatefulSets können verwendet werden, wenn die Anwendungen eine der folgenden Eigenschaften benötigen.
- Stabile, eindeutige Netzwerkbezeichner.
- Stabiler, persistenter Speicher.
- Geordnete, anmutige Bereitstellung und Skalierung.
- Geordnete, automatisierte Rolling Updates.
Bei einem StatefulSet mit N Replikaten werden Pods beim Deployment sequentiell erstellt, in der Reihenfolge von {0..N-1}. Wenn Pods gelöscht werden, werden sie in umgekehrter Reihenfolge beendet, von {N-1..0}.
Um mehr über Statefulset zu erfahren, klicke hier.
In diesem Artikel werden wir ein Statefulset mit Repliken von Nginx Pods erstellen. Wir werden Operationen mit den Pods durchführen, um zu sehen, wie sie gelöscht und erstellt werden.
Vorraussetzungen
- Kubernetes Cluster mit mindestens 1 Worker Node.
Wenn du lernen willst, wie man einen Kubernetes Cluster erstellt, klicke hier. Diese Anleitung wird dir helfen, einen Kubernetes Cluster mit 1 Master und 2 Nodes auf AWS Ubuntu 18l04 EC2 Instanzen zu erstellen.
Was wir tun werden
- Erstelle ein Statefulset
Erstelle ein Statefulset
Erstelle eine Datei und füge die folgende Statefulset Definition darin ein.
vim statefulset.yml
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: k8s.gcr.io/nginx-slim:0.8 ports: - containerPort: 80 name: web
In diesem Beispiel,
- Ein Headless Service, namens
nginx
, wird verwendet, um das Netzwerk zu kontrollieren. - Das StatefulSet, namens web, hat 3 Repliken des nginx Containers, die in einzelnen Pods gestartet werden.
- Das nginx Image mit der Version slim:0.8 wird verwendet, um Nginx zu deployen.
Um ein Statefulset zu erstellen, führe die folgenden Befehle aus.
kubectl get statefulset
kubectl create -f statefulset.yml
Führe die folgenden 2 Befehle aus, um das Statefulset und den Service aufzulisten, die im obigen Schritt erstellt wurden.
kubectl get statefulset
kubectl get service
Hole die Pods mit folgendem Befehl und sieh, dass die Pods Zahlen als Suffix im Podnamen haben.
kubectl get pods
Um die kompletten Details des Statefulsets zu erhalten, führe die folgenden Befehle aus.
kubectl get statefulset
kubectl describe statefulset web
Nun wollen wir die Pods löschen und sehen, wie die Namen erhalten bleiben, auch wenn neue Pods erstellt werden.
Wir löschen 2 Pods um zu sehen, welche Namen den neuen Pods bei der Erstellung zugewiesen werden.
kubectl get pods
kubectl delete pods web-0 web-2
kubectl get pods
Im obigen Screenshot kannst du sehen, dass auch nach dem Löschen der Pods, die neu erstellten Pods den gleichen Namen erhalten.
Fazit
In diesem Artikel haben wir ein Statefulset erstellt und Operationen darauf ausgeführt, um seine Details zu überprüfen. Wir haben auch die Pods gelöscht, um zu sehen, wie der Name des Pods erhalten bleibt und den neu erstellten Pods nach dem Löschen der gleiche Name zugewiesen wird.