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:

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.

  1. 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
  2. Folgen Sie der Anleitung, um gcloud zur Verwendung Ihres Google Cloud-Kontos zu autorisieren.
  3. Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
  4. Wählen Sie ein Google Cloud-Projekt aus.
  5. 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:

  1. Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.

    Zum Menü "Arbeitslasten"

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

  1. Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.

    Zum Menü "Arbeitslasten"

  2. Wählen Sie die gewünschte Arbeitslast aus.

  3. Klicken Sie auf Bearbeiten.

  4. Verwenden Sie den Editor, um die gewünschten Änderungen am Objekt vorzunehmen.

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

  1. Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.

    Zum Menü "Arbeitslasten"

  2. Wählen Sie die gewünschte Arbeitslast aus dem Menü aus.

  3. Klicken Sie auf Ü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

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:

  1. Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.

    Zum Menü "Arbeitslasten"

  2. Wählen Sie die gewünschte Arbeitslast aus dem Menü aus.

  3. Wählen Sie Aktionen und dann Skalieren aus.

  4. Geben Sie im Feld Replikate die gewünschte Anzahl der Replikate 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

Zum Löschen eines StatefulSets in der Cloud Console führen Sie folgende Schritte aus:

  1. Rufen Sie in der Cloud Console das Google Kubernetes Engine-Menü "Arbeitslasten" auf.

    Zum Menü "Arbeitslasten"

  2. Wählen Sie im Menü die gewünschte Arbeitslast aus.

  3. Klicken Sie auf Löschen.

  4. Klicken Sie im Bestätigungsdialogfeld auf Löschen.

Weitere Informationen