Kubernetes LoadBalancer Service无法获取ELB外部IP,状态Pending
问题描述
我的Kubernetes集群中,LoadBalancer类型的Service始终处于Pending状态,无法获取ELB外部IP。创建初期无事件日志,一段时间后出现如下错误:
Error syncing load balancer: failed to check if load balancer exists
before cleanup: NoCredentialProviders: no valid providers in chain.
Deprecated. For verbose messaging see
aws.Config.CredentialsChainVerboseErrors
对应的Deployment和Service定义如下:
apiVersion: apps/v1 kind: Deployment metadata: name: sample-graphql-fetcher-srv labels: app: sample-graphql-fetcher-srv-api spec: replicas: 1 # tells deployment to run how many pods to run selector: matchLabels: app: sample-graphql-fetcher-srv-api template: metadata: labels: app: sample-graphql-fetcher-srv-api spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - amd64 - arm64 containers: - name: nginx image: <ecr_endpoint>/sample-graphql-fetcher-srv:0.2 ports: - name: http containerPort: 8080 imagePullPolicy: Always #IfNotPresent # env: - name: ENV_VAR value: 'Value' nodeSelector: kubernetes.io/os: linux --- apiVersion: v1 kind: Service metadata: name: sample-graphql-fetcher-srv-service spec: type: LoadBalancer ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: sample-graphql-fetcher-srv-api
该定义在其他集群可正常生成ELB端点,已确认负载均衡器及弹性IP配额充足,且集群中已有两个正常运行的LoadBalancer Service。请问问题可能出在哪里?
问题排查与解决方案
根据错误提示NoCredentialProviders: no valid providers in chain,核心问题是负责创建ELB的Kubernetes云控制器(AWS Cloud Controller Manager)无法获取有效的AWS凭证,导致无法调用AWS API创建负载均衡器。结合你提到的“已有正常运行的LoadBalancer Service”,可以从以下几个方向排查:
1. 云控制器的运行状态与日志
- 检查AWS Cloud Controller Manager(CCM)Pod状态:执行
kubectl get pods -n kube-system | grep cloud-controller-manager,确认所有CCM Pod都处于Running状态,无重启或CrashLoopBackOff情况。 - 查看CCM Pod日志:执行
kubectl logs <cloud-controller-manager-pod-name> -n kube-system,排查是否有凭证相关的错误细节。如果部分CCM Pod出现异常,可能是节点IAM角色配置问题或凭证挂载的Secret损坏。
2. 节点IAM角色配置异常
- 检查集群节点的IAM角色权限:确保节点关联的IAM角色拥有创建、管理ELB的必要权限(如
elasticloadbalancing:*、ec2:DescribeSubnets、ec2:DescribeSecurityGroups等)。如果是新添加的节点,可能未正确绑定集群的节点IAM角色,导致CCM在该节点上无法获取有效凭证。 - 验证节点凭证有效性:在节点上执行
aws sts get-caller-identity,确认能正常返回身份信息。如果返回凭证错误,说明节点的IAM角色配置有误,或者实例元数据服务(IMDS)访问异常。
3. 目标Service的配置冲突
- 检查Service的特殊注解:比如
service.beta.kubernetes.io/aws-load-balancer-type、service.beta.kubernetes.io/aws-load-balancer-subnets等。如果注解指定了不存在的子网、安全组或与现有配置冲突,可能导致CCM无法正常创建ELB,同时触发凭证检查失败的错误(部分场景下CCM会先验证权限再处理配置)。 - 对比正常Service的配置:将该Service的标签、注解、端口配置与已有正常运行的LoadBalancer Service逐一对比,排除配置差异导致的问题。
4. 凭证临时失效或权限变更
- 检查IAM凭证状态:如果集群使用的是Secret挂载的Access Key/Secret Key而非节点IAM角色,确认凭证未过期且权限未被回收。
- 检查AWS STS服务状态:如果所在AWS区域的STS服务出现故障,也可能导致凭证获取失败,可通过AWS控制台查看区域服务健康状态。
临时验证步骤
- 删除并重新创建Service:执行
kubectl delete svc sample-graphql-fetcher-srv-service && kubectl apply -f <你的Service配置文件路径>,排除临时的API Server同步问题。 - 强制Pod调度到正常节点:修改Deployment的
nodeSelector,指定已有正常LoadBalancer Service的节点,验证是否是节点层面的凭证问题。
内容的提问来源于stack exchange,提问作者RoHaN
相关产品推荐
相关产品推荐

