LoadBalancer 服务是什么
负载均衡类型的服务会向底层环境申请一个外部负载均衡器,并把服务的后端挂到它后面,从而得到一个集群外可直接访问的地址。在云上这一能力由云控制器与相应注解驱动;在自建集群里需要有对应实现才能生效,否则服务会长期停在等待外部地址的状态。
地址从哪来
创建对象后,外部地址不是立刻就有:控制器需要调用底层接口去创建负载均衡器、配置健康检查与监听规则,再把地址写回对象状态。这段时间里地址显示为等待中。地址出现之后,真正的转发由底层负载均衡器完成,集群内的虚拟地址依然保留。
基本信息
| 适用环境 | 支持负载均衡能力的云环境,或自建集群配合对应实现 |
|---|---|
| 语法 | 服务类型设为负载均衡 |
| 外部地址 | 申请成功后写入对象状态,未成功前显示等待中 |
| 云侧行为 | 负载均衡器类型、健康检查与计费由云平台与注解决定 |
| 流量策略 | 可选集群级或本地级,影响源地址保留与转发路径 |
| 清理 | 删除对象应触发底层负载均衡器回收 |
典型使用场景
- 对外提供服务:业务需要在公网或内网直接访问
- 简单四层暴露:不需要按域名与路径分发时用它更直接
- 多种协议支持:非 HTTP 协议的外部暴露通常走这一方式
- 临时敞开入口:验证或演示阶段快速获得一个外部地址
- 内网负载均衡:只在内部网络申请负载均衡器承载内部服务
- 迁移过渡:在引入七层入口之前先用它承接外部流量
清单与查看
清单与查看
apiVersion: v1
kind: Service
metadata:
name: web-lb
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb # 云厂商注解示例
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
targetPort: 8080
protocol: TCP
externalTrafficPolicy: Cluster # 默认值,客户端源地址可能不保留确认外部地址
确认外部地址
kubectl get svc web-lb -o wide # 看地址分配
kubectl get svc web-lb -o jsonpath='{.status.loadBalancer.ingress}' # 只看外部地址
kubectl describe svc web-lb | grep -A3 'LoadBalancer Ingress' # 描述里的入口信息
kubectl get events -n <命名空间> --sort-by=.lastTimestamp | tail -10 # 看控制器报错状态与现象
| 现象 | 含义 | 下一步 |
|---|---|---|
| 外部地址一直等待中 | 控制器未成功创建负载均衡器 | 查看控制器日志与事件报错 |
| 地址已分配但不通 | 安全组或健康检查未通过 | 核对安全组规则与后端就绪状态 |
| 源地址看不到 | 默认流量策略未保留源地址 | 需要时改为本地级并评估影响 |
| 底层资源未回收 | 对象删除时控制器异常 | 确认负载均衡器是否仍存在并手工清理 |
云上的负载均衡器通常按规格与流量计费,测试环境用完应及时删除服务对象,触发资源回收。
默认流量策略下请求可能经过节点二次转发,客户端源地址会被替换;需要保留源地址时改用本地级,同时注意后端分布对流量均衡的影响。