EKS部署Pod报错MountVolume挂载失败kube-root-ca.crt未注册
问题描述
在AWS EKS集群部署简单批处理任务Pod时,遇到存储卷挂载报错,核心报错信息如下:
MountVolume.SetUp failed for volume "kube-api-access-cvwdt" : object "default"/"kube-root-ca.crt" not registered
异常Pod事件信息
对异常Pod执行kubectl describe pod获取的事件日志如下:
Normal Scheduled 59s default-scheduler Successfully assigned default/stock-api to ip-192-168-63-5.us-west-2.compute.internal Normal Pulling 58s kubelet Pulling image "mpriv32/stockapi:latest" Normal Pulled 38s kubelet Successfully pulled image "mpriv32/stockapi:latest" in 19.862095063s Normal Created 35s kubelet Created container stock-api Normal Started 35s kubelet Started container stock-api Warning FailedMount 33s (x3 over 34s) kubelet MountVolume.SetUp failed for volume "kube-api-access-cvwdt" : object "default"/"kube-root-ca.crt" not registered
Pod部署配置
使用的Pod YAML配置如下:
apiVersion: v1 kind: Pod metadata: name: stock-api labels: app: stock-api spec: containers: - name: stock-api image: mpriv32/stock-api:latest envFrom: - secretRef: name: api-credentials restartPolicy: Never
报错根因
该报错由Kubernetes默认自动注入的服务账号投影卷挂载失败触发:
- 所有未显式指定ServiceAccount的Pod,启动时会自动绑定所在命名空间的default服务账号,Kubernetes会同步注入名为
kube-api-access-<随机后缀>的临时卷,用来挂载集群根CA证书kube-root-ca.crt,供Pod内进程访问Kubernetes API时做证书校验。 - 报错明确提示
default命名空间下不存在kube-root-ca.crtConfigMap,这类问题在EKS集群上通常是集群初始化流程异常、或命名空间手动创建/修改时,没有自动生成该集群根CA对应的ConfigMap资源导致。 - 从事件日志可以看到容器已经成功启动,说明该挂载失败处于重试状态,不会直接导致Pod退出,但会持续上报FailedMount告警,如果工作负载本身需要调用Kubernetes API,会出现证书校验失败的功能异常。
修复方案
方案1:补全缺失的kube-root-ca.crt ConfigMap (推荐)
直接在对应命名空间下补全缺失的ConfigMap即可彻底解决问题,操作步骤如下:
- 从EKS集群默认存在根CA配置的kube-system命名空间导出证书内容:
kubectl -n kube-system get configmap kube-root-ca.crt -o jsonpath='{.data.ca\.crt}' > ca.crt - 在default命名空间下创建缺失的ConfigMap:
kubectl -n default create configmap kube-root-ca.crt --from-file=ca.crt=ca.crt - 等待1-2分钟kubelet自动重试挂载,报错会自动消失,无需重建已有Pod。
如果集群内其他命名空间也出现同类报错,重复上述操作,将命令中-n default替换为对应命名空间名称即可。
方案2:关闭服务账号令牌自动投影 (仅适用于无需访问K8S API的工作负载)
如果部署的批处理任务完全不需要和Kubernetes API交互,可以在Pod配置中关闭自动注入逻辑,从根源上避免该卷的挂载动作:
在Pod的spec层级添加automountServiceAccountToken: false配置,修改后的配置片段如下:
spec: automountServiceAccountToken: false containers: - name: stock-api image: mpriv32/stock-api:latest envFrom: - secretRef: name: api-credentials # 其余原有配置保持不变
配置修改后重建Pod即可生效,不会再自动注入kube-api-access-xxx类型的临时卷,也就不会触发对应的挂载报错。
内容的提问来源于stack exchange,提问作者MP32
相关产品推荐
相关产品推荐

