Deployment

Auf dieser Seite werden Kubernetes Deployment-Objekte und ihre Verwendung in Google Kubernetes Engine (GKE) beschrieben.

Was ist ein Deployment?

Deployments stellen eine Gruppe mehrerer identischer Pods ohne eindeutige Identitäten dar. Ein Deployment führt mehrere Replikate einer Anwendung aus und ersetzt automatisch alle Instanzen, die fehlschlagen oder nicht mehr reagieren. Auf diese Weise sorgen Deployments dafür, dass eine oder mehrere Instanzen einer Anwendung für Nutzeranfragen verfügbar sind. Deployments werden vom Kubernetes-Deployment-Controller verwaltet.

Deployments verwenden eine Pod-Vorlage, die eine Spezifikation für die zugehörigen Pods enthält. Die Pod-Spezifikation legt fest, wie die einzelnen Pods aussehen: welche Anwendungen in den Containern ausgeführt werden, welche Volumes die Pods bereitstellen sollen, welche Labels sie haben usw.

Bei Änderung der Pod-Vorlage eines Deployments werden neue Pods automatisch der Reihe nach erstellt.

Nutzungsmuster

Deployments eignen sich gut für zustandslose Anwendungen, die ReadOnlyMany- oder ReadWriteMany-Volumes verwenden, die auf mehreren Replikaten installiert sind, aber nicht gut für Arbeitslasten, die ReadWriteOnce-Volumes verwenden. Verwenden Sie für zustandsorientierte Anwendungen, die ReadWriteOnce-Volumes nutzen, StatefulSets. StatefulSets wurden entwickelt, um zustandsorientierte Anwendungen und Clusteranwendungen bereitzustellen, die Daten in nichtflüchtigem Speicher beispielsweise von Compute Engine ablegen. StatefulSets eignen sich für das Bereitstellen von Kafka-, MySQL-, Redis-, ZooKeeper- und anderen Anwendungen, die eindeutige, dauerhafte Identitäten und stabile Hostnamen benötigen.

Deployments erstellen

Erstellen Sie ein Deployment mithilfe der Befehle kubectl run, kubectl apply oder kubectl create.

Nach dem Erstellen sorgt das Deployment dafür, dass die gewünschte Anzahl von Pods ausgeführt wird und jederzeit verfügbar ist. Das Deployment ersetzt automatisch Pods, für die Fehler auftreten oder die aus den Knoten entfernt werden.

Nachfolgend ein Beispiel für eine Deployment-Manifest-Datei im YAML-Format:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

Für dieses Beispiel gilt Folgendes:

  • Ein Deployment mit dem Namen nginx wird erstellt. Dies wird vom Feld metadata: name angezeigt.
  • Das Deployment erstellt drei replizierte Pods. Dies wird vom Feld replicas angegeben.
  • Die Pod-Vorlage bzw. das Feld spec: template gibt an, dass die zugehörigen Pods mit dem Label app: nginx gekennzeichnet sind.
  • Die Spezifikation der Pod-Vorlage bzw. das Feld template: spec gibt an, dass die Pods einen Container nginx ausführen. Dieser führt das nginx Docker Hub-Image in der Version 1.7.9 aus.
  • Das Deployment öffnet Port 80 zur Verwendung durch die Pods.

Weitere Informationen zu Deployment-Spezifikationen finden Sie in der Dokumentation zur Kubernetes API.

Zusammengefasst enthält die Pod-Vorlage die folgenden Anweisungen für Pods, die von diesem Deployment erstellt wurden:

  • Jeder Pod ist mit dem Label app: nginx gekennzeichnet.
  • Erstellen Sie einen Container und nennen Sie ihn nginx.
  • Führen Sie das Image nginx in der Version 1.7.9 aus.
  • Öffnen Sie Port 80, um Traffic zu senden und zu empfangen.

Weitere Informationen zum Erstellen von Deployments finden Sie unter Deployment erstellen.

Deployments aktualisieren

Sie können ein Deployment aktualisieren, indem Sie Änderungen an der Spezifikation der zugehörigen Pod-Vorlage vornehmen. Durch Änderungen am Spezifikationsfeld wird automatisch ein Update-Rollout ausgelöst. Sie können kubectl, die Kubernetes API oder das Menü "GKE-Arbeitslasten" in der Google Cloud Console verwenden.

Wenn ein Deployment eine Aktualisierung auslöst, stoppt das Deployment standardmäßig die Pods, skaliert die Anzahl der Pods schrittweise auf null, zieht die Pods dann ab und beendet sie. Anschließend verwendet das Deployment die aktualisierte Pod-Vorlage, um neue Pods zu erstellen.

Alte Pods werden erst entfernt, wenn eine ausreichende Anzahl neuer Pods ausgeführt wird. Neue Pods werden erst erstellt, nachdem eine ausreichende Anzahl alter Pods entfernt wurde. Wenn Sie sehen möchten, in welcher Reihenfolge Pods erstellt und entfernt werden, können Sie kubectl describe deployments ausführen.

Deployments können dafür sorgen, dass mindestens ein Replikat weniger als gewünscht ausgeführt wird, wobei höchstens ein Pod nicht verfügbar ist. Auf ähnliche Weise können Deployments dafür sorgen, dass höchstens ein Replikat mehr als gewünscht mit höchstens einem aktiven Pod mehr als gewünscht ausgeführt wird.

Mit dem Befehl kubectl rollout undo lässt sich eine Aktualisierung rückgängig machen. Sie können auch kubectl rollout pause verwenden, um ein Deployment vorübergehend zu stoppen.

Deployments verwalten

Nachfolgend sind die häufigsten Verwaltungsaufgaben für Deployments aufgelistet:

Status und Lebenszyklus

Deployments können sich während ihres Lebenszyklus in einem von drei Zuständen befinden: fortlaufend, abgeschlossen oder fehlgeschlagen.

Der Status fortlaufend zeigt an, dass die Deployment-Aufgaben ausgeführt werden, z. B. das Erstellen oder Skalieren der Pods.

Der Status abgeschlossen zeigt an, dass die Deployment-Aufgaben erfolgreich abgeschlossen wurden, alle Pods mit der neuesten Spezifikation ausgeführt werden und verfügbar sind sowie keine alten Pods mehr ausgeführt werden.

Der Status fehlgeschlagen weist darauf hin, dass beim Deployment ein oder mehrere Probleme aufgetreten sind, die einen Abschluss der Aufgaben verhindern. Zu den Ursachen zählen unzureichende Kontingente oder Berechtigungen, Image-Pull-Fehler, Grenzwertbereiche oder Laufzeitfehler. Sie können kubectl get deployment [DEPLOYMENT+NAME] -o yaml ausführen und die Meldungen im Feld status: conditions überprüfen, um die Ursachen für das Fehlschlagen eines Deployments zu untersuchen.

Mit dem Befehl kubectl rollout status können Sie den Fortschritt eines Deployments überwachen oder seinen Status überprüfen.

Weitere Informationen