Kubespray搭建K8s集群启用AWS cloud provider后CCM CrashLoopBackOff求助
Kubespray集群AWS Cloud Provider故障排查方案
1 版本兼容性校验
你当前使用的是gcr.io/k8s-staging-provider-aws/cloud-controller-manager:v20210510-v1.21.0-alpha.0预发布版本镜像,首先确认两点:
- 你的Kubernetes集群主版本需为1.20+,低于该版本会出现核心API不兼容问题直接导致进程崩溃
- 建议替换为对应集群版本的正式发布版CCM镜像,避免预发布版本的已知功能缺陷
2 拉取Pod日志定位具体错误
执行以下命令获取崩溃前的运行日志,是定位问题最直接的手段:
kubectl logs -n kube-system aws-cloud-controller-manager-kbjwb --previous
常见错误原因如下:
IAM权限不足
AWS CCM需要调用AWS云API的对应权限,确认:
- 控制面节点的EC2实例角色已经附加了AWS CCM所需的最小权限策略
- 若使用AKSK secret方式授权,确认凭证有效、权限配置正确,且CCM manifest中已经正确挂载对应secret
节点标签缺失
所有集群节点必须预先添加node.cloudprovider.kubernetes.io/uninitialized=true标签,CCM完成节点初始化后会自动移除该标签,未配置会触发节点校验失败崩溃
集群名称配置不匹配
CCM启动参数中指定的cluster-name必须和你的Kubernetes集群名称一致,否则无法识别关联的AWS资源
3 建议替换手动配置为Kubespray原生配置
你手动修改静态Pod、kubelet配置的方式容易出现配置遗漏或重启后被覆盖的问题,Kubespray本身支持通过inventory变量一键开启AWS external cloud provider,无需手动修改配置:
在inventory的group_vars中添加以下参数:
cloud_provider: external external_cloud_provider: aws
配置完成后重新运行Kubespray的cluster.yml playbook即可自动完成所有控制面、kubelet的参数配置,规避手动修改的错误。
4 额外校验点
- 执行
ps aux | grep kubelet确认所有节点的kubelet--cloud-provider=external参数已全局生效 - 确认集群关联的VPC、子网、安全组等AWS资源已经配置了对应集群标识的标签,CCM需要通过标签识别关联资源
内容的提问来源于stack exchange,提问作者Mohamed El Gamal
相关产品推荐
相关产品推荐

