Pending 是什么意思
LoadBalancer 类型的 Service 自己不产生外部地址:它把请求交给集群里的负载均衡控制器,由控制器向云平台或外部系统申请地址,成功后才写进 status.loadBalancer.ingress,kubectl 表里的 EXTERNAL-IP 才会有值。长期显示 <pending> 表示「还没有控制器为它分配地址」,属于等待状态而非故障状态,排查方向是找有没有可用的 LB 实现,而不是反复改 Service。
基本信息
| 适用对象 | type: LoadBalancer 的 Service |
|---|---|
| 地址来源 | status.loadBalancer.ingress(由控制器写入) |
| 执行者 | 云厂商 cloud-controller-manager,或 MetalLB / OpenELB / kube-vip 等 |
| 前置条件 | 控制器 Pod 正常、Service 有可用后端、配额与权限充足 |
| 替代入口 | NodePort(先验证服务本身是否正常) |
典型使用场景
- 云托管集群:控制器调用云 API 创建 CLB/SLB 并回填地址,Pending 说明云侧调用失败或凭据过期
- 裸金属自建集群:未安装 MetalLB、OpenELB、kube-vip 一类实现时 Pending 是预期行为,需要按需引入或改用 NodePort
- 混合环境:集群里同时存在多个 LB 控制器时可能互相抢管同一个 Service,表现为地址迟迟不回填
- 排障时区分层次:先用 NodePort 访问确认 Pod 与 Service 端到端正常,再集中处理 LB 层
- 变更前评估影响:删除重建 LoadBalancer Service 会释放并重新申请地址,公网 IP 可能改变
诊断顺序
诊断顺序
kubectl get svc web-lb -n prod # 先看 TYPE 与 EXTERNAL-IP 两列
kubectl describe svc web-lb -n prod | tail -20 # 事件里常有云侧配额、权限、子网相关原文
kubectl get pods -A | grep -i -E 'cloud-controller|metallb|openelb|kube-vip' # 有没有 LB 控制器
kubectl get events -A --field-selector involvedObject.name=web-lb # 按对象名过滤事件
kubectl get endpoints web-lb -n prod # 后端为空时先修后端,地址申请未必是根因常见原因对照
| 现象 | 可能的层 | 下一步动作 |
|---|---|---|
| EXTERNAL-IP 一直 pending,controller-manager 未运行 | 集群缺少 LB 实现 | 裸金属装 MetalLB/OpenELB,云上检查 cloud-controller-manager 副本与日志 |
| 有控制器但地址始终不回填 | 控制器调用外部 API 失败 | 看控制器日志中的鉴权、配额、子网、安全组报错 |
| 地址回填后访问不通 | 外部入口或安全组 | 检查云侧监听器、健康检查与安全组放行 |
| 外部端口丢弃部分流量 | externalTrafficPolicy 为 Local 且节点无后端 | 扩容副本或改回 Cluster 策略 |
MetalLB 这类实现区分二层宣告与 BGP 宣告:用 BGP 模式时需要上游路由器配合宣告网段,配错时地址虽然回填,但外部网络完全到不了,表现为「有 IP 但访问超时」。
删除 LoadBalancer Service 会连带释放云侧负载均衡实例,重新创建会分配新的公网地址,依赖固定 IP 的 DNS 记录与备案需同步更新,属于有外部影响的操作。