- Authors

- Name
- Phillip Pham
- @ddppham
CreateContainerConfigError: Secret, ConfigMap, fehlender Key
TL;DR
CreateContainerConfigError heißt: das Kubelet kann die Container-Konfiguration nicht bauen. Der Prozess startet nicht. kubectl logs bleibt leer. Die fehlende Stelle steht im Event:
kubectl describe pod POD
Drei Texte decken den Alltag ab. secret "NAME" not found und configmap "NAME" not found: das Objekt fehlt oder liegt im falschen Namespace. couldn't find key KEY in Secret NAME: das Objekt ist da, der Key nicht. Die Übersicht der anderen Status steht unter Pod startet nicht.
Bevor der Prozess existiert
Das Kubelet setzt Env-Variablen, envFrom und projizierte Volumes, bevor es den Entrypoint aufruft. Fehlt dabei eine Referenz, bleibt der Container in Waiting mit Reason CreateContainerConfigError. Restart Count kann trotzdem steigen, weil das Kubelet den Versuch wiederholt. Es gibt keinen Previous-Log, denn es gab keinen Prozess.
Ein Volume-Mount auf ein fehlendes Secret sieht oft anders aus: FailedMount während ContainerCreating. Env und env.valueFrom landen bei CreateContainerConfigError. Dieselbe Ursache, zwei Reasons. describe entscheidet, welche Zeile Sie anfassen.
Objekt fehlt, oder es liegt woanders
Namen sind namespace-lokal. Ein Secret in default gilt nicht in prod.
kubectl get secret NAME -n NAMESPACE
kubectl get configmap NAME -n NAMESPACE
kubectl get pod POD -n NAMESPACE -o jsonpath='{.spec.containers[*].envFrom}{"\n"}{.spec.containers[*].env}{"\n"}'
Typisch nach einem Kopieren des Manifests: Namespace geändert, Secret nicht mitgezogen. Oder das Secret entsteht in einem späteren Schritt der Pipeline, und der Pod startet vorher. Dann ist die Reihenfolge der Fehler, nicht der Key.
optional: true an der Env-Quelle macht den fehlenden Namen zum leeren Wert statt zum harten Fehler. Das ist richtig für optionale Konfiguration. Für ein Passwort, ohne das die Anwendung nicht läuft, verschiebt es den Ausfall nur auf Exit Code 1.
Key fehlt im vorhandenen Objekt
couldn't find key DB_PASSWORD in Secret app-env heißt: app-env existiert, DB_PASSWORD ist kein Data-Key. Keys sind die Dateinamen unter data:, nicht die Werte.
kubectl get secret app-env -o jsonpath='{.data}' | python3 -m json.tool
Sie sehen die Key-Namen, nicht die decodierten Werte, wenn Sie nur die Keys brauchen: kubectl get secret app-env -o go-template='{{range $k,$v := .data}}{{$k}}{{"\n"}}{{end}}'. Ein Tippfehler DB_PASSWROD ist still, bis der Pod ihn sucht.
Bei envFrom.secretRef zieht Kubernetes alle Keys. Fehlt das ganze Secret, kommt CreateContainerConfigError. Ein einzelner falscher Key in valueFrom.secretKeyRef nennt genau diesen Key.
Nach dem Anlegen
Das Kubelet merkt ein neues Secret von selbst und startet den Versuch erneut. Ein kubectl delete pod ist nicht nötig, schadet aber nicht, wenn Sie sehen wollen, ob der nächste Pod denselben Fehler zeigt. Zeigt er ihn, referenziert das Pod-Spec noch den alten Namen. Dann ist das Deployment nicht das, was Sie gerade angelegt haben.
Ein Image, das sich nicht ziehen lässt, ist dieser Fehler nicht. Dafür gibt es ImagePullBackOff.
Quellen
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Exit Code 1: die erste Zeile im Previous-Log
Exit Code 1 auf Kubernetes: die Anwendung beendet sich selbst. kubectl logs --previous zeigt die Zeile. Speicher, Image-Pull und SIGKILL sind andere Codes.
Exit Code 143: SIGTERM und Graceful Shutdown
Exit Code 143 ist SIGTERM: 128 plus 15. Beim Rollout ist das normal. Im Loop fehlt ein Handler oder die Grace-Period ist kürzer als der Stopp der Anwendung.
Pod startet nicht: Status lesen, dann der Fix
Pod startet nicht: ein kubectl get pod, dann der Status. Pending, ImagePull, CrashLoop, Evicted und die Befehle, die den jeweiligen Fehler wirklich zeigen.
CrashLoopBackOff beheben: Logs, Probes, Exit-Code
CrashLoopBackOff beheben: kubectl logs --previous, Exit-Codes 1, 137 und 139, Liveness-Probes. Der Unterschied zu ImagePullBackOff in wenigen Minuten.
Pod Terminating hängt: Finalizer entfernen
Pod Terminating hängt: Finalizer finden, Grace-Period abwarten, Force-Delete nur wenn der Node weg ist. Der kubectl-Patch, und wann er ein Volume beschädigt.
kubectl connection refused 6443 beheben
kubectl connection refused auf Port 6443: der API-Server antwortet nicht. kubeconfig, Kontext, Firewall, API-Prozess. Der Pod-Status kommt erst danach.
Error from server Forbidden: RBAC-Recht
kubectl Forbidden: Error from server (Forbidden) nennt User, Verb und Ressource. kubectl auth can-i zeigt das Recht, bevor jemand cluster-admin vergibt.
ContainerCreating hängt: Volume, Sandbox, CNI
ContainerCreating hängt: der Pod hat einen Node, der Container startet nicht. FailedMount, Pod-Sandbox und CNI stehen in den Events, nicht in den Logs.