# Kubernetes Deployments: Skalierung & Zero-Downtime Updates

TL;DR / Management Summary Ein Deployment ist ein Controller in Kubernetes, der den gewünschten Zustand einer Applikation beschreibt. Er verwaltet die Erstellung von ReplicaSets, die wiederum die Pods (Artikel 812) steuern. Ein Senior Admin nutzt Deployments, um sicherzustellen, dass immer die korrekte Anzahl an Instanzen läuft und führt Rolling Updates durch, bei denen die neue Version Pod für Pod ausgerollt wird, ohne dass die Applikation jemals offline geht.


# 1. Das Deployment-Objekt

Der Verwalter des Soll-Zustands.

In der YAML-Datei legen wir fest:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - name: nginx
        image: nginx:1.21

# 2. Skalierung (Scaling)

Anpassen an die Last.

# Manuelles Skalieren

kubectl scale deployment web-app --replicas=10

# Horizontales Auto-Scaling (HPA)

Kubernetes kann selbstständig skalieren basierend auf Metriken (z.B. CPU > 70%).


# 3. Deep Dive: Rolling Updates & Rollbacks

Update ohne Schmerz.

Wenn Sie das Image im Deployment ändern:

  1. Start: K8s startet einen neuen Pod (v2).
  2. Wait: Sobald v2 gesund ist (Readiness Probe), wird ein alter Pod (v1) gelöscht.
  3. Iteration: Dies wird wiederholt, bis nur noch v2 läuft.
kubectl rollout undo deployment web-app

# 4. Day-2 Operations: Ressourcen-Limits

Stabilität für den Cluster.

Jedes Deployment sollte resources definieren:


# 5. Troubleshooting & “War Stories”

Wenn das Update klemmt.

# Top 3 Fehlerbilder

  1. Symptom: ImagePullBackOff.

    • Ursache: Tippfehler im Image-Namen oder fehlende Registry-Credentials.
    • Lösung: kubectl describe deployment prüfen.
  2. Symptom: Das Update bleibt bei 1 von 3 Pods hängen.

    • Ursache: Der neue Pod wird nicht “Ready”, weil der Health-Check (Artikel 748) fehlschlägt.
    • Fix: Timeout oder Startup-Logic der App prüfen.
  3. Symptom: “OOMKilled” (Out of Memory).

    • Lösung: Memory-Limits im Deployment erhöhen.

# “War Story”: Die “Version-Mix” Falle

Ein Admin nutzte ein Deployment ohne festes Image-Tag (image: my-app:latest). Das Ereignis: Er startete einen vierten Pod via Scaling. Das Ergebnis: Drei Pods liefen mit Version 1.0 (die beim ersten Start ‘latest’ war). Der vierte Pod lud das mittlerweile aktualisierte ‘latest’ Image (Version 2.0). Die Katastrophe: Die zwei Versionen hatten inkompatible API-Formate. User-Anfragen schlugen zufällig fehl, je nachdem, auf welchem Pod sie landeten. Lehre: Nutzen Sie niemals :latest in Deployments. Verwenden Sie eindeutige Versionen (z.B. Git-Hashes oder SemVer).


# 6. Monitoring & Reporting

Deployment-Status.

# Rollout Status

kubectl rollout status deployment web-app

# 7. Fazit & Empfehlung

Deployments sind das wichtigste Werkzeug für den Applikations-Lifecycle.


# Anhang: Cheatsheet (Deployment CLI)

Aufgabe Befehl
Deployments listen kubectl get deploy
Image updaten kubectl set image deploy/web nginx=nginx:1.22
Rollout Historie kubectl rollout history deploy/web
Pause Rollout kubectl rollout pause deploy/web

# Referenzen