HTTP 与 Web 开发

Kubernetes 环境下的客户端负载均衡

本指南将向你展示如何在 Kubernetes 环境中利用 Vert.x Service Resolver(服务解析器)实现智能的高性能客户端负载均衡(Client-Side Load Balancing)。

你将构建什么

你将构建一个 Vert.x 微服务:

  • 在 / 路径监听外部 HTTP 请求;

  • 使用客户端内置负载均衡器直接向后端集群的多实例 Pod 发起 HTTP 请求;

  • 将目标后端 Pod 的物理地址与响应内容透明回传客户端。

为什么需要客户端负载均衡?

在传统的 Kubernetes 架构中,微服务之间的调用通常经过平台提供的 ClusterIP Service(依赖 kube-proxy 或 iptables/IPVS 实现 4 层转发)。而在海量微服务高并发交互场景下,客户端负载均衡能够直接绕过中心化代理转发,带来显著优势:

  • 更低网络延迟:客户端直连目标 Pod,减少一次网络跳转;

  • 多协议智能流控:在 HTTP/2、gRPC 等长连接多路复用场景下,彻底解决连接级负载不均问题;

  • 可定制化调度算法:支持加权轮询、最小连接数、一致性哈希等丰富策略。

前置要求

  • 文本编辑器或 IDE

  • Java 11 或更高版本

  • Maven 或 Gradle

  • Minikube 或可用的 Kubernetes 集群

  • kubectl 命令行工具

核心架构与服务实现

1. 配置 Kubernetes 服务解析器 (KubeResolver)

Vert.x Service Resolver 允许客户端直接使用 Kubernetes 逻辑服务名称(如 hello-node)发起调用,并在内部透明解析为实时存活的 Pod 物理 IP 端点列表:

2. 配置客户端负载均衡策略

配置经典的轮询(Round-Robin)调度策略:

3. 发起负载均衡请求

在发起 HTTP 请求时,直接传入逻辑服务名:

部署至 Kubernetes 并验证效果

1. 部署具有 3 个副本的后端集群

kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39 -- /agnhost netexec --http-port=8080
kubectl scale deployment hello-node --replicas=3
kubectl expose deployment hello-node --type=LoadBalancer --port=8080

2. 部署 Vert.x 微服务并赋予 Endpoints 观察权限

应用 deployment.yml、service.yml 与 roles.yml(允许 ServiceAccount 监听 Endpoints 变更事件):

kubectl apply -f deployment.yml
kubectl apply -f service.yml
kubectl apply -f roles.yml

3. 测试客户端负载均衡

访问微服务暴露的地址,多次刷新:

Hello from: 10.244.0.48:8080 with: NOW: ...
Hello from: 10.244.0.49:8080 with: NOW: ...
Hello from: 10.244.0.50:8080 with: NOW: ...

你可以清晰看到,请求由客户端直接精准均匀地分发到了后端 3 个不同的 Pod IP 之上!

本文总结

  • 掌握了 Vert.x Service Resolver 在 Kubernetes 上的无缝接入;

  • 理解了客户端负载均衡相比传统 Service 代理的性能优势;

  • 成功验证了基于 Pod Endpoints 的毫秒级拓扑感知与轮询调度。