Ubuntu Overlay 负载均衡器配置指南
前置说明与总体思路
- Overlay 网络用于在 Ubuntu 上跨主机连接容器,常见实现基于 VXLAN 隧道;负载均衡并非 Overlay 的内置能力,通常通过在 Overlay 前部署 HAProxy/Nginx 等反向代理,或直接使用编排平台的 Service/VIP 能力来实现。若使用 Docker Swarm/Kubernetes,可直接利用其内置负载均衡与服务发现;若使用独立主机,则在负载均衡器所在节点将后端写为 Overlay 网络中容器的服务名或容器名 即可完成服务发现与转发。
方案一 Docker Swarm 原生负载均衡
- 适用场景:已在 Ubuntu 上部署 Docker Swarm 集群,需快速获得跨主机、带健康检查与服务发现的负载均衡。
- 操作步骤:
- 初始化与管理节点
- 其他节点加入
- docker swarm join --token :
- 创建跨主机 Overlay 网络
- docker network create --driver overlay my_overlay
- 部署带副本的服务并接入 Overlay
- docker service create --name my_service --network my_overlay --replicas 3 nginx
- 访问与验证
- 通过服务名访问:curl http://my_service;Swarm 为该服务分配 VIP,默认 轮询 分发到各副本。多次请求应看到来自不同容器的响应。
方案二 外部负载均衡器 HAProxy 或 Nginx 接入 Overlay
- 适用场景:已有独立 Ubuntu 主机作为入口,后端是运行在 Overlay 中的容器,需要灵活的路由、ACL、熔断等能力。
- 前置准备
- 所有后端容器加入同一 Overlay 网络(如 my_overlay),并能被解析(服务名或容器名可达)。
- HAProxy 示例(/etc/haproxy/haproxy.cfg)
- 关键要点:frontend 监听 80;backend 使用 balance roundrobin/leastconn/source;server 行使用 Overlay 内的服务名:端口 并开启 check 健康检查。
- 最小可用配置片段:
- frontend http_front
- bind *:80
- default_backend http_back
- backend http_back
- balance roundrobin
- server web1 web1:80 check
- server web2 web2:80 check
- 启动与验证
- sudo systemctl start haproxy && sudo systemctl enable haproxy
- 访问 http://<LB_IP>/,多次请求应分发到不同后端容器。
- Nginx 示例(/etc/nginx/conf.d/lb.conf 或 /etc/nginx/nginx.conf 的 http 段内)
- 关键要点:upstream 中使用 服务名;proxy_pass 指向 upstream;设置常用转发头。
- 最小可用配置片段:
- http {
- upstream overlay_backend {
- server web1:80;
- server web2:80;
- }
- server {
- listen 80;
- location / {
- proxy_pass http://overlay_backend;
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- }
- }
- }
- 启动与验证
- sudo systemctl restart nginx
- 访问 http://<LB_IP>/ 验证分发效果。
方案三 Kubernetes Service 负载均衡
- 适用场景:在 Ubuntu 节点上运行 Kubernetes,Pod 使用 Overlay/CNI(如 Flannel/Calico),需要稳定的服务抽象与负载均衡。
- 操作步骤
- 部署应用副本
- kubectl create deployment my-app --image=nginx --replicas=3
- 暴露为 ClusterIP 服务(默认 轮询)
- kubectl expose deployment my-app --type=ClusterIP --port=80
- 验证
- kubectl get svc my-app 查看 ClusterIP,在集群内访问该 IP 验证分发;如需外部访问,可改为 NodePort/LoadBalancer 类型。
算法选择与高可用建议
- 算法选择
- 轮询(Round Robin):默认策略,适合后端性能相近的场景。
- 最少连接(Least Connections):适合请求处理时长差异较大的场景。
- 源地址哈希(IP Hash):用于会话保持(如购物车)。
- 高可用与入口优化
- 在 HAProxy/Nginx 前部署 Keepalived 提供 VIP,实现故障自动切换;结合 systemd 保证进程自启与健康检查,提升整体可靠性。