EC2自建Kubernetes集群(非EKS)LoadBalancer服务External-IP pending问题
问题根因
自管理K8s集群默认没有集成AWS云控制器管理器(Cloud Controller Manager, CCM),集群无法自动调用AWS接口创建ELB/ALB/NLB资源,因此LoadBalancer类型Service的External-IP会长期处于pending状态,这是基础组件缺失导致的,和你是否配置Service注解、是否有IAM权限没有直接关联。
解决方案
- 第一步:调整kube-controller-manager启动参数
编辑所有控制面节点的kube-controller-manager静态Pod配置(默认路径/etc/kubernetes/manifests/kube-controller-manager.yaml),添加启动参数--cloud-provider=external,保存后kubelet会自动重启kube-controller-manager组件。 - 第二步:给集群节点打初始化标签
执行命令kubectl label nodes --all node.cloudprovider.kubernetes.io/uninitialized=true,标记节点等待外部CCM完成初始化。 - 第三步:部署对应版本的AWS CCM
按照你集群的K8s大版本,部署官方适配的AWS CCM工作负载,部署前确认已经给CCM对应的ServiceAccount绑定了足够权限的IAM角色(你已经排除IAM权限问题,只要确保角色包含ELB创建、安全组修改、EC2资源查询权限即可)。 - 第四步:修正Service注解并重新创建资源
你之前使用的service.beta.kubernetes.io/aws-load-balancer: "true"是无效注解,没有对应配置逻辑。如果需要创建公网LB,不需要额外加internal注解,仅当需要创建内网LB时保留service.beta.kubernetes.io/aws-load-balancer-internal: "true"注解即可。删除原有pending的Service后重新apply配置即可。
后续排查验证
如果操作完成后Service依然处于pending状态,可以查看CCM组件的运行日志定位问题:kubectl logs -n kube-system -l app=aws-cloud-controller-manager
内容的提问来源于stack exchange,提问作者nischeruku
相关产品推荐
相关产品推荐

