Zum Inhalt

Lab 06: Deployments und Rolling Updates

Das Manifest enthält ein Deployment mit einem einfachen NGINX-Container, für den drei Replika-Pods angelegt werden. An diesem Manifest kann man folgende Eigenschaften erkennen.

  • apiVersion: apps/v1: gibt an, dass wir die Deployment API von Kubernetes verwenden.
  • Deployment mit dem Metadaten-Namen deployment-demo.
  • replicas: 3: gibt an, dass 3 Replikate der Anwendung erstellt werden sollen.
  • strategy.type: RollingUpdate: bestimmt die Aktualisierungsstrategie als RollingUpdate.
  • rollingUpdate.maxSurge: 1: gibt an, wie viele Replikate während der Aktualisierung zusätzlich zur gewünschten Anzahl an Replikaten erstellt werden dürfen.
  • rollingUpdate.maxUnavailable: 0: legt fest, wie viele Replikate während der Aktualisierung nicht verfügbar sein dürfen.
  • selector.matchLabels.app: rollingupdate: zum Erkennen der App mit dem Label rollingupdate.
  • Die Container nutzen das Image nginx:alpine3.17 und lauschen auf Port 80.

manifest.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-demo
spec:
  replicas: 10
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1 # How many pods can be created above the desired replicas number?
      maxUnavailable: 0 # How many pods can be unavailable during the update?
  selector:
    matchLabels:
      app: deployment-demo
  template:
    metadata:
      labels:
        app: deployment-demo
    spec:
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: kubernetes.io/hostname
          whenUnsatisfiable: ScheduleAnyway
          labelSelector:
            matchLabels:
              app: deployment-demo
      containers:
        - name: nginx
          image: nginx:alpine3.17
          ports:
            - containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /
              port: 80
            initialDelaySeconds: 10
            periodSeconds: 20
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "200m"
              memory: "256Mi"

Beispiel ausführen

Erstelle das Deployment.

kubectl apply -f manifest.yaml

Überprüfe den Status des Deployments:

kubectl rollout status deployment/deployment-demo

Der Rollout sollte bald erfolgreich sein. Danach kannst du dir alle Pods auflisten lassen mit dem Label, welches in der Pod Template-Spec des Deployments angegeben ist:

kubectl get pod --selector=app=deployment-demo

Führe nun ein Rolling-Update auf eine neue Imageversion durch, z.B. nginx:alpine3.18:

kubectl set image deployment/deployment-demo nginx=nginx:alpine3.18

Überwache das Rolling-Update:

kubectl rollout status deployment/deployment-demo

Falls du das Rolling-Update rückgängig machen musst:

kubectl rollout undo deployment/deployment-demo

Um den Verlauf des Deployments anzeigen lassen:

kubectl rollout history deployment/deployment-demo

Aufräumen

kubectl delete deployment.apps/deployment-demo

Bonus