Auf dieser Seite wird erläutert, wie Sie eine zustandsorientierte Anwendung mit Google Kubernetes Engine (GKE) bereitstellen.
Übersicht
Zustandsorientierte Anwendungen speichern Daten auf nichtflüchtigen Speichern zur Verwendung durch den Server, durch Clients und andere Anwendungen. Beispiele für zustandsorientierte Anwendungen sind Datenbanken oder Schlüssel/Wert-Speicher, in denen Daten gespeichert und von anderen Anwendungen abgerufen werden.
Nichtflüchtiger Speicher kann dynamisch bereitgestellt werden, d. h., die zugrunde liegenden Volumes werden nach Bedarf erstellt. In Kubernetes konfigurieren Sie eine dynamische Bereitstellung durch Erstellen einer StorageClass. In GKE können Sie mit einer standardmäßigen StorageClass dynamisch nichtflüchtige Compute Engine-Speicher bereitstellen.
Kubernetes verwendet den StatefulSet-Controller, um zustandsorientierte Anwendungen als StatefulSet-Objekte bereitzustellen. Pods in StatefulSets sind nicht austauschbar. Jeder Pod hat eine eindeutige Kennung, die beibehalten wird, unabhängig davon, wo der Pod geplant ist.
Zustandsorientierte Anwendungen unterscheiden sich von zustandslosen Anwendungen, in denen Clientdaten zwischen Sitzungen nicht auf dem Server gespeichert werden.
Weitere Informationen zu nichtflüchtigen Speichern in multizonalen und regionalen Clustern finden Sie unter Nichtflüchtiger Speicher in regionalen Clustern.
Vorbereitung
Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:
- Aktivieren Sie die Google Kubernetes Engine API. Google Kubernetes Engine API aktivieren
- Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit
gcloud components update
ab.
- Achten Sie darauf, dass Ihre containerisierte Anwendung in einer Image-Registry wie Artifact Registry gespeichert ist.
Folgen Sie der Kurzanleitung, um die GKE API zu aktivieren, einen Cluster zu erstellen und mehr über GKE zu erfahren.
Nichtflüchtigen Speicher in einem StatefulSet anfordern
Anwendungen fordern unter Umständen nichtflüchtigen Speicher mit einem PersistentVolumeClaim-Objekt an.
Normalerweise müssen Sie zusätzlich zur Erstellung des Pods auch PersistentVolumeClaim-Objekte erstellen. StatefulSet-Objekte enthalten jedoch ein volumeClaimTemplates
-Array, das die PersistentVolumeClaim-Objekte automatisch generiert. Jedes StatefulSet-Replikat erhält sein eigenes PersistentVolumeClaim-Objekt.
Sie können auch ein bereits vorhandenes Laufwerk in einem StatefulSet verwenden.
StatefulSet-Objekt erstellen
Verwenden Sie zum Erstellen einer StatefulSet-Ressource den Befehl kubectl apply
.
Der Befehl kubectl apply
verwendet Manifestdateien, um Ressourcen in Ihrem Cluster zu erstellen, zu aktualisieren und zu löschen. Dies ist eine deklarative Methode der Objektkonfiguration. Bei dieser Methode werden Schreibvorgänge in Liveobjekten beibehalten, ohne die Änderungen in die Objektkonfigurationsdateien zu übernehmen.
Linux
Die folgende Manifestdatei ist ein einfaches Beispiel für ein StatefulSet, das von einem separat erstellten Dienst gesteuert wird:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
app: APP_NAME
serviceName: "SERVICE_NAME"
replicas: 3
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: APP_NAME
spec:
containers:
- name: CONTAINER_NAME
image: ...
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: ...
volumeClaimTemplates:
- metadata:
name: PVC_NAME
annotations:
...
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Dabei gilt:
STATEFULSET_NAME
: Der Name des StatefulSets.SERVICE_NAME
: Der Name des Diensts.APP_NAME
: Der Name der Anwendung, die in den Pods ausgeführt wird.CONTAINER_NAME
: Der Name der Container in den Pods.PORT_NAME
: Der Name des Ports, der vom StatefulSet geöffnet wird.PVC_NAME
: Der Name des PersistentVolumeClaim.
In dieser Datei gibt das Feld kind
an, dass ein StatefulSet-Objekt mit den in der Datei definierten Spezifikationen erstellt werden soll. Dieses StatefulSet-Objekt generiert beispielsweise drei replizierte Pods und öffnet Port 80, um das StatefulSet-Objekt im Internet zur Verfügung zu stellen.
Windows
Wenn Sie Cluster mit Windows Server-Knotenpools verwenden, müssen Sie eine StorageClass erstellen, da die Standard-StorageClass als Dateisystemtyp ext4
verwendet, was nur für Linux-Container funktioniert. Bei Verwendung eines nichtflüchtigen Compute Engine-Speichers müssen Sie NTFS
als Dateispeichertyp verwenden, wie im folgenden Beispiel gezeigt:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: STORAGECLASS_NAME
parameters:
type: pd-standard
fstype: NTFS
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
Im folgenden StatefulSet-Manifest wird die oben definierte StorageClass verwendet. Es werden vier PersistentVolume- und PersistentVolumeClaim-Paare erstellt, die vier nichtflüchtige Compute Engine-Speicher darstellen. Jeder Pod im StatefulSet nutzt einen einzigen nichtflüchtigen Speicher.
Sie müssen Ihrer Pod-Spezifikation einen Knotenselektor hinzufügen, um dafür zu sorgen, dass die Pods richtig auf Windows Server-Knoten verteilt werden.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
replicas: 4
selector:
matchLabels:
app: APP_NAME
template:
metadata:
labels:
app: APP_NAME
name: CONTAINER_NAME
spec:
nodeSelector:
kubernetes.io/os: windows
containers:
- name: CONTAINER_NAME
image: ...
ports:
- containerPort: 80
name: PORT_NAME
volumeMounts:
- name: PVC_NAME
mountPath: C:\mnt\state
volumeClaimTemplates:
- metadata:
name: PVC_NAME
spec:
storageClassName: STORAGECLASS_NAME
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
Dabei gilt:
APP_NAME
: Der Name der Anwendung, die in den Pods ausgeführt wird.STATEFULSET_NAME
: Der Name des StatefulSets.CONTAINER_NAME
: Der Name der Container in den Pods.PORT_NAME
: Der Name des Ports, der vom StatefulSet geöffnet wird.PVC_NAME
: Der Name des PersistentVolumeClaim.STORAGECLASS_NAME
: Der Name der StorageClass.
Führen Sie zum Erstellen einer StatefulSet-Ressource den folgenden Befehl aus. Ersetzen Sie dabei STATEFULSET_FILE
durch den Namen der Manifestdatei:
kubectl apply -f STATEFULSET_FILE
Sie können außerdem mit kubectl apply -f DIRECTORY/
alle Objekte (außer vorhandene) erstellen, die in Konfigurationsdateien in einem bestimmten Verzeichnis definiert sind.
StatefulSet prüfen
kubectl
Zum Prüfen eines StatefulSet führen Sie folgenden Befehl aus:
kubectl get statefulset STATEFULSET_NAME -o yaml
Dieser Befehl zeigt die Livekonfiguration der StatefulSet-Ressource im YAML-Format an.
Führen Sie den folgenden Befehl aus, um die von StatefulSet erstellten Pods aufzulisten:
kubectl get pods -l app=APP_NAME
In diesem Befehl wird kubectl
durch das Flag -l
angewiesen, alle Pods mit einem Label für APP_NAME
abzurufen.
Die Ausgabe sieht in etwa so aus:
NAME READY STATUS RESTARTS AGE
pod-name 1/1 Running 0 1m
pod-name 1/1 Running 0 1m
Zum Aufrufen detaillierter Informationen zu einem StatefulSet führen Sie folgenden Befehl aus:
kubectl describe statefulset STATEFULSET_NAME
Führen Sie den folgenden Befehl aus, um Informationen zu einem bestimmten Pod abzurufen:
kubectl describe pod POD_NAME
Führen Sie den folgenden Befehl aus, um die erstellten PersistentVolumeClaim-Objekte aufzulisten:
kubectl get pvc
Die Ausgabe sieht etwa so aus:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
STATEFULSET_NAME-PVC_NAME-0 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800002 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-1 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800003 1G RWO standard 9s
STATEFULSET_NAME-PVC_NAME-2 Bound pvc-bdff4e1e-183e-11e8-bf6d-42010a800004 1G RWO standard 9s
Führen Sie den folgenden Befehl aus, um Informationen zu einem bestimmten PersistentVolumeClaim abzurufen:
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
Führen Sie den folgenden Befehl aus, um Informationen zu einem bestimmten PersistentVolume abzurufen:
kubectl describe pv PV_NAME
Console
Führen Sie die folgenden Schritte aus, um ein StatefulSet zu überprüfen:
Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.
Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSet, das Sie überprüfen möchten.
Führen Sie auf der Seite Details zum StatefulSet einen der folgenden Schritte aus:
- Klicken Sie auf den Tab Überarbeitungsverlauf, um den Überarbeitungsverlauf des StatefulSets anzusehen.
- Klicken Sie auf den Tab Ereignisse, um alle Ereignisse anzusehen, die sich auf das StatefulSet beziehen.
- Klicken Sie auf den Tab Logs, um Containerlogs für das StatefulSet aufzurufen.
- Klicken Sie auf den Tab YAML, um den Konfigurations-YAML für das StatefulSet aufzurufen, zu kopieren oder herunterzuladen.
StatefulSet aktualisieren
Es gibt mehrere Möglichkeiten, StatefulSets zu aktualisieren. Die gängigste deklarative Methode ist kubectl apply
. Sie können ein StatefulSet direkt über Ihre Shell oder in einem Editor Ihrer Wahl mit kubectl edit
aktualisieren. Auch der YAML-Editor im GKE-Menü "Arbeitslasten" in der Google Cloud Console eignet sich dafür.
Sie haben die Möglichkeit, für die Pod-Spezifikation Aktualisierungen für eine StatefulSet-Ressource durchzuführen, z. B. Image, Ressourcennutzung/-anfragen oder Konfiguration.
kubectl apply
Sie können StatefulSet aktualisieren, indem Sie eine neue oder aktualisierte Manifestdatei anwenden. Dies ist hilfreich, um Änderungen am StatefulSet vorzunehmen, z. B. für die Skalierung oder für eine neue Version Ihrer Anwendung.
Zum Aktualisieren eines StatefulSets führen Sie folgenden Befehl aus:
kubectl apply -f STATEFULSET_FILE
Ersetzen Sie STATEFULSET_FILE
durch die aktualisierte Manifestdatei.
Der Befehl kubectl apply
weist einer Ressource eine Manifestdatei zu. Wenn die angegebene Ressource nicht vorhanden ist, wird sie mit dem Befehl erstellt.
Weitere Informationen zu kubectl apply
finden Sie in der kubectl
-Referenzdokumentation.
Console
So bearbeiten Sie die Live-Konfiguration eines StatefulSet:
Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.
Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSets, das Sie ändern möchten.
Klicken Sie auf edit Bearbeiten.
Ändern Sie das YAML der Konfiguration nach Bedarf.
Klicken Sie auf Speichern.
Aktualisierungs-Rollout prüfen
kubectl
Führen Sie den folgenden Befehl aus, um den Rollout des StatefulSets zu prüfen:
kubectl rollout status statefulset STATEFULSET_NAME
Führen Sie den folgenden Befehl aus, um den Rollout-Verlauf des StatefulSets zu sehen:
kubectl rollout history statefulset STATEFULSET_NAME
Führen Sie den folgenden Befehl aus, um ein Rollout rückgängig zu machen:
kubectl rollout undo statefulset STATEFULSET_NAME
Console
Führen Sie die folgenden Schritte aus, um den Überarbeitungsverlauf eines StatefulSet anzuzeigen:
Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.
Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSet, das Sie überprüfen möchten.
Klicken Sie auf den Tab Revision History (Überarbeitungsverlauf).
Wählen Sie die gewünschte Überarbeitung aus.
Aktualisierungsstrategien
Mit dem Feld updateStrategy
des StatefulSet können Sie automatisierte Rolling Updates für Container, Labels, Ressourcenanforderungen/-limits und Anmerkungen für die zugehörigen Pods konfigurieren und deaktivieren.
Weitere Informationen zu Aktualisierungsstrategien für StatefulSets finden Sie in der Kubernetes-Dokumentation.
StatefulSet skalieren
kubectl
Der Befehl kubectl scale
kann jederzeit zum Skalieren von StatefulSets verwendet werden.
Führen Sie den folgenden Befehl aus, um ein StatefulSet manuell zu skalieren:
kubectl scale statefulset STATEFULSET_NAME --replicas NUMBER_OF_REPLICAS
Ersetzen Sie NUMBER_OF_REPLICAS
durch die gewünschte Anzahl von replizierten Pods.
Console
Führen Sie die folgenden Schritte aus, um ein StatefulSet zu skalieren:
Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.
Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSets, das Sie ändern möchten.
Klicken Sie auf list Aktionen > Skalieren > Replikate bearbeiten.
Geben Sie die neue Anzahl von Replikaten für das StatefulSet ein.
Klicken Sie auf Skalieren.
StatefulSet löschen
kubectl
Zum Löschen eines StatefulSets mit kubectl führen Sie folgenden Befehl aus:
kubectl delete statefulset STATEFULSET_NAME
Console
Führen Sie die folgenden Schritte aus, um ein StatefulSet zu löschen:
Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.
Wählen Sie in der Arbeitslastliste ein oder mehrere StatefulSets aus, die Sie löschen möchten.
Klicken Sie auf delete Löschen.
Wenn Sie zur Bestätigung aufgefordert werden, klicken Sie auf Löschen.
Nächste Schritte
- MySQL-Cluster in GKE für Hochverfügbarkeit bereitstellen
- Mehr über das Bereitstellen von zustandslosen Anwendungen erfahren
- Anleitung zum Durchführen eines Upgrades für einen Cluster, der eine zustandsorientierte Arbeitslast ausführt