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:
- Achten Sie darauf, dass die Google Kubernetes Engine API aktiviert ist. Aktivieren Sie Google Kubernetes Engine API
- Prüfen Sie, ob das Cloud SDK installiert ist.
Mit den folgenden Methoden können Sie die gcloud
-Einstellungen festlegen:
- Verwenden Sie
gcloud init
, wenn Sie die Standardeinstellungen ansehen möchten. - Verwenden Sie
gcloud config
, um Ihre Projekt-ID, Zone und Region individuell festzulegen.
gcloud init verwenden
Wenn Sie die Fehlermeldung One of [--zone, --region] must be supplied: Please specify
location
erhalten, führen Sie diesen Abschnitt aus.
-
Führen Sie
gcloud init
aus und folgen Sie der Anleitung:gcloud init
Wenn Sie SSH auf einem Remote-Server verwenden, können Sie mit dem Flag
--console-only
verhindern, dass mit dem Befehl ein Browserfenster geöffnet wird:gcloud init --console-only
- Folgen Sie der Anleitung, um
gcloud
zur Verwendung Ihres Google Cloud-Kontos zu autorisieren. - Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
- Wählen Sie ein Google Cloud-Projekt aus.
- Wählen Sie eine Compute Engine-Standardzone aus.
gcloud config verwenden
- Legen Sie Ihre standardmäßige Projekt-ID fest:
gcloud config set project project-id
- Wenn Sie mit zonalen Clustern arbeiten, legen Sie die Compute-Standardzone fest:
gcloud config set compute/zone compute-zone
- Wenn Sie mit regionalen Clustern arbeiten, legen Sie die Standardregion für Compute Engine fest:
gcloud config set compute/region compute-region
- Aktualisieren Sie
gcloud
auf die neueste Version:gcloud components update
- Achten Sie darauf, dass Ihre containerisierte Anwendung in einer Image-Registry wie Container 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 PersistentVolumeClaim-Objekte vom Nutzer zusätzlich zum Pod erstellt werden. Dagegen enthalten StatefulSets das Array volumeClaimTemplates
, das die PersistentVolumeClaim-Objekte automatisch erstellt. 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 eines StatefulSets 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 ist der Name des StatefulSets.
- service-name ist der Name des Service.
- app-name ist der Name der Anwendung, die in den Pods ausgeführt wird.
- container-name ist der Name der Container in den Pods.
- port-name ist der Name des Ports, der vom StatefulSet geöffnet wird.
- pvc-name ist 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 ist der Name der Anwendung, die in den Pods ausgeführt wird.
- statefulset-name ist der Name des StatefulSets.
- container-name ist der Name der Container in den Pods.
- port-name ist der Name des Ports, der vom StatefulSet geöffnet wird.
- pvc-name ist der Name des PersistentVolumeClaim.
- storageclass-name ist der Name der StorageClass.
Zum Erstellen eines StatefulSet-Objekts führen Sie folgenden Befehl aus:
kubectl apply -f statefulset-file
Dabei ist statefulset-file die Manifestdatei.
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 des StatefulSets 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
wobei statefulset-name der Name des StatefulSets ist.
So erhalten Sie Informationen zu einem bestimmten Pod:
kubectl describe pod pod-name
So listen Sie die erstellten PersistentVolumeClaims auf:
kubectl get pvc
Die Ausgabe sieht in 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
So erhalten Sie Informationen zu einem bestimmten PersistentVolumeClaim:
kubectl describe pvc statefulset-name-pvc-name-0
So erhalten Sie Informationen zu einem bestimmten PersistentVolume:
kubectl describe pv pv-name
Console
Zum Prüfen eines StatefulSets führen Sie folgende Schritte aus:
Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.
Wählen Sie die gewünschte Arbeitslast aus dem Menü aus.
Das Menü "Arbeitslasten" bietet verschiedene weitere Menüs:
- Klicken Sie auf YAML, um die Livekonfiguration des StatefulSet aufzurufen.
- Klicken Sie auf Ereignisse, um alle Ereignisse anzuzeigen, die sich auf das StatefulSet beziehen.
- Klicken Sie auf Überarbeitungsverlauf, um den Überarbeitungsverlauf des StatefulSet-Objekts anzuzeigen.
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 Cloud Console eignet sich dafür.
Sie haben die Möglichkeit, Aktualisierungen für die Pod-Spezifikation eines StatefulSet auszuführen, z. B. für dessen Image, Ressourcennutzung/-anforderungen 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
Dabei ist statefulset-file 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
Zum Bearbeiten der Livekonfiguration eines StatefulSets führen Sie folgende Schritte aus:
Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.
Wählen Sie die gewünschte Arbeitslast aus.
Klicken Sie auf Bearbeiten.
Verwenden Sie den Editor, um die gewünschten Änderungen am Objekt vorzunehmen.
Klicken Sie auf Speichern.
Aktualisierungs-Rollout prüfen
kubectl
Zum Prüfen des Rollouts eines StatefulSets führen Sie folgenden Befehl aus:
kubectl rollout status statefulset statefulset-name
So zeigen Sie den Rollout-Verlauf des StatefulSets an:
kubectl rollout history statefulset statefulset-name
So machen Sie ein Rollout rückgängig:
kubectl rollout undo statefulset statefulset-name
Console
Zum Aufrufen des Überarbeitungsverlaufs eines StatefulSets führen Sie folgende Schritte aus:
Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.
Wählen Sie die gewünschte Arbeitslast aus dem Menü aus.
Klicken Sie auf Ü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
kubectl scale
kann jederzeit zum Skalieren von StatefulSets verwendet werden.
Zum manuellen Skalieren eines StatefulSets führen Sie folgenden Befehl aus:
kubectl scale statefulset statefulset-name --replicas number-of-replicas
number-of-replicas ist dabei die gewünschte Anzahl von replizierten Pods.
Console
Zum Skalieren eines StatefulSets in der Cloud Console führen Sie folgende Schritte aus:
Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.
Wählen Sie die gewünschte Arbeitslast aus dem Menü aus.
Wählen Sie Aktionen und dann Skalieren aus.
Geben Sie im Feld Replikate die gewünschte Anzahl der Replikate 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
Zum Löschen eines StatefulSets in der Cloud Console führen Sie folgende Schritte aus:
Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.
Wählen Sie im Menü die gewünschte Arbeitslast aus.
Klicken Sie auf Löschen.
Klicken Sie im Bestätigungsdialogfeld auf Löschen.
Weitere Informationen
- Mehr über das Bereitstellen von zustandslosen Anwendungen erfahren
- Anleitung zum Durchführen eines Upgrades für einen Cluster, der eine zustandsorientierte Arbeitslast ausführt