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.
| Objekt | Für | Schutz |
|---|---|---|
| ConfigMap | nicht-geheime Werte (URLs, Flags, Ports) | im Klartext |
| Secret | geheime Werte (Passwörter, Tokens) | base64-kodiert |
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.
# 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
(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 }
Wenige Einzelwerte → env. Ganze Konfigurationsdateien → Volume.
# 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
Ä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).