Lektion 06 · Deployen

Konfiguration: ConfigMaps & Secrets

Konfiguration vom Image trennen — der Schlüssel zu wiederverwendbaren Deployments.

Hartkodierte Werte im Image sind eine Sackgasse: für jede Umgebung ein neues Image bauen? Nein. Konfiguration gehört neben die App. Dafür gibt es zwei Objekte.

1. Zwei Behälter, ein Prinzip

ObjektFürSchutz
ConfigMapnicht-geheime Werte (URLs, Flags, Ports)im Klartext
Secretgeheime Werte (Passwörter, Tokens)base64-kodiert
Wichtigste Eselsbrücke: Secret ≠ verschlüsselt

Ein Secret ist nur base64-kodiert, nicht verschlüsselt — das ist „verschnürt, nicht verschlossen“. Jeder mit Lesezugriff kann es dekodieren. Echter Schutz kommt über RBAC (Lektion 9) und Encryption-at-Rest. Niemals Secrets ins Git-Repo committen.

2. Anlegen

# ConfigMap aus einzelnen Werten
kubectl create configmap web-config -n lernen \
  --from-literal=GREETING="Hallo Puzzle" --from-literal=LOG_LEVEL=info

# Secret (kubectl kodiert base64 für dich)
kubectl create secret generic web-secret -n lernen \
  --from-literal=API_TOKEN=s3cr3t

# Ansehen (Werte der ConfigMap im Klartext)
kubectl get configmap web-config -n lernen -o yaml

3. In den Pod bringen — zwei Wege

(a) Als Umgebungsvariablen — am häufigsten:

spec:
  containers:
    - name: web
      image: nginx:1.27
      envFrom:
        - configMapRef: { name: web-config }
        - secretRef:    { name: web-secret }

(b) Als Dateien (Volume) — für Config-Dateien/Zertifikate:

spec:
  containers:
    - name: web
      image: nginx:1.27
      volumeMounts:
        - name: cfg
          mountPath: /etc/web        # jeder Key wird eine Datei
  volumes:
    - name: cfg
      configMap: { name: web-config }
Faustregel

Wenige Einzelwerte → env. Ganze Konfigurationsdateien → Volume.

4. Hands-on (read + prüfen)

# Was steckt in einem Secret? (base64 → Klartext)
kubectl get secret web-secret -n lernen -o jsonpath='{.data.API_TOKEN}' | base64 -d; echo

# Kam die Variable im Container an?
kubectl exec -n lernen deploy/web -- printenv GREETING LOG_LEVEL
Stolperfalle

Änderst du eine ConfigMap, sieht ein laufender Pod das bei envFrom nicht automatisch — env wird nur beim Start gelesen. Du musst die Pods neu ausrollen (Lektion 7: kubectl rollout restart deploy/web).

Selbsttest

1. Ist ein Kubernetes-Secret sicher verschlüsselt gespeichert?
2. Du hast viele Einzelwerte als Variablen. Was nimmst du?
3. Du änderst eine ConfigMap. Was sieht der laufende Pod?
Frag deinen Lehrer: „Wie binde ich nur einen einzelnen Key als Variable ein?“, „Wie verwalte ich Secrets sicher in Git (SOPS / Sealed Secrets)?“ oder „Warum sieht mein Pod die neue Config nicht?“