现象定位
CreateContainerConfigError 表示 kubelet 在组装容器配置阶段就失败了:引用的 ConfigMap、Secret 不存在,或其中的键名对不上。它最关键的特征是容器根本没有被创建,所以 kubectl logs 不会有任何输出,只能从 describe 的事件里找原文。适用平台是 Kubernetes,属于配置类故障里最常见的一种,通常发生在换命名空间、改键名或删了配置对象之后。
基本信息
| 状态表现 | Pod STATUS 显示 CreateContainerConfigError,RESTARTS 通常为 0 |
|---|---|
| 报错位置 | kubectl describe pod 的 Events 与 status.containerStatuses[].state.waiting.message |
| 典型触发 | env/envFrom 引用的 ConfigMap 或 Secret 不存在、键被改名、跨命名空间引用 |
| 恢复方式 | 补齐配置对象或修正键名后,kubelet 会自动重试创建容器 |
典型使用场景
- 新建命名空间部署失败:配置对象建在了 default,工作负载却部署到别处
- 改名引发故障:ConfigMap 键从 APP_MODE 改成 app.mode,env 引用没同步
- 权限受限时误判:RBAC 限制导致别人删掉了 Secret,工作负载随即起不来
- 环境迁移复核:把清单搬到新集群时漏建 Secret,先报这个错再排查
- 确认是否为配置问题:Pod 状态异常但没有任何容器日志,第一时间看这个错误
定位命令
定位命令
kubectl describe pod web-x -n prod | sed -n '/Events:/,$p' # 事件原文最关键
kubectl get pod web-x -n prod -o jsonpath='{.status.containerStatuses[0].state.waiting.message}'
kubectl get cm app-config -n prod # 配置对象是否存在
kubectl get secret app-secret -n prod # Secret 是否存在
kubectl get pod web-x -n prod -o jsonpath='{.spec.containers[0].env[*].valueFrom}' # 引用了什么
kubectl get cm app-config -n prod -o jsonpath='{.data}' # 核对键名是否被改过事件原文与含义
| 事件原文片段 | 含义 | 处理 |
|---|---|---|
| configmap "app-config" not found | ConfigMap 不存在或不在同一命名空间 | 补齐对象或修正引用 |
| could not find key APP_MODE in secret app-secret | 对象在但键名不存在 | 核对 data 里的键名大小写与拼写 |
| secret "db-pass" not found | Secret 被删或名字写了别名 | 重建 Secret 并固化到清单 |
| permission denied | kubelet 无权读取该对象 | 检查 RBAC 与准入策略 |
修正配置后 kubelet 会按退避策略自动重试创建容器,通常不需要删 Pod;若改的是卷引用,也可能仍需重建 Pod 才能刷新。
用 optional: true 声明的 ConfigMap 或 Secret 缺失时不会报这个错,对象不存在只是不注入。排查时要分清哪些引用是可选的。
ConfigMap 与 Secret 是命名空间级资源,跨命名空间引用不被支持;多环境部署时务必按命名空间成套创建,避免「测试好、生产挂」。