K8s LoadBalancer服务深度解析
在 Kubernetes(k8s)中,LoadBalancer
类型的 Service 是用于将集群内的服务暴露到集群外部的核心资源,尤其适用于需要从公网或外部网络访问集群服务的场景。以下详细说明其作用和工作过程:
一、核心作用
LoadBalancer
类型的 Service 主要解决 **“集群服务对外暴露”** 的问题,具体作用包括:
- 外部访问入口:为集群内的 Pod 提供一个稳定的外部 IP 地址(通常是公网 IP),外部客户端可通过该 IP 直接访问集群内的服务,无需了解 Pod 的动态 IP(Pod 重建会导致 IP 变化)。
- 负载均衡:自动将外部请求分发到后端多个 Pod 上,实现请求的负载分担,提升服务可用性和并发能力。
- 与云厂商集成:在云环境(如 AWS、GCP、阿里云等)中,会自动调用云厂商的负载均衡器(如 AWS ELB、阿里云 SLB),无需手动配置外部负载均衡器。
二、工作过程(以云环境为例)
LoadBalancer
类型的 Service 从创建到生效,经历以下关键步骤:
1. 创建 Service 资源
用户定义 LoadBalancer
类型的 Service YAML 配置,指定后端 Pod 的标签选择器(selector
)、端口映射(ports
)等,示例:
apiVersion: v1
kind: Service
metadata:name: my-loadbalancer-service
spec:selector:app: my-app # 匹配标签为 app=my-app 的 Podports:- port: 80 # Service 暴露的端口(外部访问用)targetPort: 8080 # 后端 Pod 实际监听的端口type: LoadBalancer
执行 kubectl apply -f service.yaml
后,k8s 开始创建 Service。
2. 自动关联云厂商负载均衡器
- k8s 集群(通常是云厂商托管的集群,如 EKS、ACK)检测到
type: LoadBalancer
后,会通过云控制器管理器(Cloud Controller Manager) 调用云厂商的 API(如 AWS EC2 API、阿里云 SLB API),自动创建一个云负载均衡器(如 ELB、SLB)。 - 云负载均衡器会被分配一个外部 IP 地址(公网 IP),用于外部客户端访问。
3. 配置负载均衡规则
- k8s 自动将 Service 的端口映射(如外部 80 端口 → 内部 Pod 8080 端口)同步到云负载均衡器,确保外部请求通过 80 端口进入时,能正确转发到 Pod 的 8080 端口。
- 同时,k8s 会将匹配
selector
的 Pod 节点(Node)和端口注册到云负载均衡器的后端服务器列表中。
4. 外部请求转发流程
当外部客户端(如用户浏览器)通过负载均衡器的外部 IP: 端口(如 123.45.67.89:80
)发起请求时:
- 请求首先到达云厂商的负载均衡器(如 ELB)。
- 负载均衡器根据预设规则(如轮询、权重),将请求转发到集群内的某个 Node 的对应端口(由 k8s 自动配置的 NodePort,通常是 30000-32767 范围内的随机端口)。
- Node 上的
kube-proxy
组件接收到请求后,根据 Service 与 Pod 的关联关系,将请求转发到后端的某个 Pod(通过 iptables 或 IPVS 规则)。 - Pod 处理请求后,将响应按原路返回给外部客户端。
5. 动态更新(Pod 变化时)
- 当后端 Pod 因扩缩容、故障重建等原因发生变化时(IP 或数量改变),k8s 会自动更新 Service 的 endpoints(后端 Pod 列表)。
- 云控制器管理器会同步更新云负载均衡器的后端服务器列表,确保负载均衡规则始终指向可用的 Pod,无需人工干预。
三、关键特点与注意事项
- 依赖云环境:
LoadBalancer
类型的 Service 在自建集群(非云环境) 中通常无法自动创建负载均衡器,此时外部 IP 可能显示为<pending>
,需手动配置外部负载均衡器并关联 NodePort。 - 成本与资源:云厂商的负载均衡器通常是收费资源,需注意成本控制;且每个
LoadBalancer
Service 会对应一个独立的负载均衡器,不适合大量创建。 - 会话亲和性:可通过
sessionAffinity: ClientIP
配置会话亲和性,使来自同一客户端 IP 的请求始终转发到同一个 Pod(适用于需要保持会话的场景)。 - 健康检查:云负载均衡器会自动对后端 Node/Pod 进行健康检查(如 TCP 端口探测),若检测到故障,会自动剔除异常节点,确保请求仅转发到健康的 Pod。
总结
LoadBalancer
类型的 Service 是云环境中暴露 k8s 服务的首选方案,其核心价值在于:自动集成云厂商负载均衡器,提供稳定的外部访问入口,实现请求负载均衡,并动态适配后端 Pod 变化,大幅简化了服务对外暴露的复杂度。