You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:35:27