Zustandsorientierte Anwendung bereitstellen


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:

  1. Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.

    Zu Arbeitslasten

  2. Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSet, das Sie überprüfen möchten.

  3. 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:

  1. Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.

    Zu Arbeitslasten

  2. Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSets, das Sie ändern möchten.

  3. Klicken Sie auf  Bearbeiten.

  4. Ändern Sie das YAML der Konfiguration nach Bedarf.

  5. 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:

  1. Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.

    Zu Arbeitslasten

  2. Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSet, das Sie überprüfen möchten.

  3. Klicken Sie auf den Tab Revision History (Überarbeitungsverlauf).

  4. 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:

  1. Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.

    Zu Arbeitslasten

  2. Klicken Sie in der Arbeitslastliste auf den Namen des StatefulSets, das Sie ändern möchten.

  3. Klicken Sie auf Aktionen > Skalieren > Replikate bearbeiten.

  4. Geben Sie die neue Anzahl von Replikaten für das StatefulSet ein.

  5. 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:

  1. Rufen Sie in der Google Cloud Console die Seite Arbeitslasten auf.

    Zu Arbeitslasten

  2. Wählen Sie in der Arbeitslastliste ein oder mehrere StatefulSets aus, die Sie löschen möchten.

  3. Klicken Sie auf Löschen.

  4. Wenn Sie zur Bestätigung aufgefordert werden, klicken Sie auf Löschen.

Nächste Schritte