4.5 KiB
01-08 OpenWrt HAProxy 负载均衡
在 OpenWrt 上安装并配置 HAProxy,将 80/443 流量转发到 K3s 集群节点(Traefik 入口),实现单一入口与负载均衡。
前置条件
- OpenWrt 与 K3s 节点同网段(如 192.168.2.0/24),OpenWrt 通常为网关(如 192.168.2.1)
- 已完成
01-02-k3s-工作节点.md或01-07,Traefik 入口 80/443 已在各节点可达
1. 安装 HAProxy
opkg update
opkg install haproxy
若使用 LuCI,可在「系统」→「软件包」中搜索 haproxy 安装。
2. 配置
2.1 原生 HAProxy 配置(推荐)
编辑 /etc/haproxy.cfg 或包提供的配置路径(部分 OpenWrt 使用 /etc/haproxy/haproxy.cfg)。可在 /etc/init.d/haproxy 中查看实际配置文件路径。
完整配置见 ansible/files/01-08-haproxy/haproxy.cfg(与 Ansible 共用,可复制到 OpenWrt 或通过 playbook 下发)。将 192.168.2.61~192.168.2.64 按实际 K3s 节点 IP 修改。健康检查默认为 TCP,如需升级见第 3 节;如需真实客户端 IP 见第 5 节 PROXY Protocol。
2.2 UCI 配置(可选)
部分 OpenWrt 使用 UCI 管理 HAProxy,编辑 /etc/config/haproxy。UCI 结构与选项因版本而异,可参考 OpenWrt HAProxy 文档
3. 健康检查
分四类:TCP、HTTP、TLS、HTTPS,由浅到深。
| 类型 | 说明 | 适用端口 |
|---|---|---|
| TCP | server ... check,端口能连即通过 |
80、443 等 |
| HTTP | option httpchk,明文 HTTP 请求 |
80 |
| TLS | option ssl-hello-chk,TLS 握手层 |
443(mode tcp) |
| HTTPS | option httpchk + server ... ssl,HTTP over TLS |
443(mode http) |
说明:443 业务若为 TCP 透传,backend 是 mode tcp,只能选 TCP 或 TLS;若需 HTTPS 级检查,需另建 mode http 的 backend。
3.1 TCP(2.1 默认)
即 ansible/files/01-08-haproxy/haproxy.cfg 中的 backend 块。
3.2 HTTP(80 明文)
替换 2.1 中 backend k3s_http 块;frontend http_in 仍指向 k3s_http。在 backend 开头加 option httpchk GET /。
3.3 TLS(443 握手,mode tcp)
替换 2.1 中 backend k3s_https 块;frontend https_in 仍指向 k3s_https。在 backend 中加 option ssl-hello-chk。
3.4 HTTPS(443 应用层,mode http + ssl)
适用于 HAProxy 在 443 终结 TLS 的场景(frontend 需 mode http 且 bind 时带 ssl)。若仍为 TCP 透传,用 3.3 即可。需与 Traefik 路由匹配的 Host;自签/内网 CA 可用 verify none,生产建议 ca-file。
backend k3s_https_httpchk
mode http
option httpchk GET / HTTP/1.1\r\nHost:\ your-ingress.example.com
default-server ssl verify none
server ylc61 192.168.2.61:443 check
server ylc62 192.168.2.62:443 check
server ylc63 192.168.2.63:443 check
server ylc64 192.168.2.64:443 check
4. 启动与验证
/etc/init.d/haproxy enable
/etc/init.d/haproxy restart
验证:从内网访问 http://<OpenWrt-IP>/ 或 http://<OpenWrt-IP>/demo-m1/(02-05 矩阵),应能到达 Traefik 与后端。
5. PROXY Protocol(可选)
若 Traefik 需获取真实客户端 IP,可在 HAProxy 后端每个 server 行添加 send-proxy-v2,并在 Traefik 配置 trustedIPs 包含 OpenWrt 网段(见 03-02-k3s-traefik-acme.md)。
完整配置见 ansible/files/01-08-haproxy/haproxy-proxy.cfg(仅 TCP 检查 + PROXY)。
健康检查与 PROXY 组合:ansible/files/01-08-haproxy/haproxy-proxy-http-tls.cfg 为 HTTP 检查 + TLS 检查 + PROXY 的完整示例。
Traefik 端需启用 PROXY protocol 监听并信任 OpenWrt 的 IP,否则会报错。UCI 配置需参考 OpenWrt HAProxy 文档中的相应选项。
6. 端口与防火墙
80/443 被封:家庭网络若被运营商封禁 80/443,可改用 18080/18443 等非标准端口,供直接访问或配合 Cloudflare CDN 端口转发。将 frontend 的 bind *:80、bind *:443 改为 bind *:18080、bind *:18443 即可;Traefik 入口及后端保持不变。
防火墙:确保 OpenWrt 放行实际监听端口(80/443 或 18080/18443 等)入站,或将 HAProxy 监听接口加入相应 zone。
相关文档
01-02-k3s-工作节点.md:Traefik 入口与 LB 基线02-05-nginx-验证矩阵-一键部署.md:验证矩阵(按入口 IP 访问)03-02-k3s-traefik-acme.md:PROXY protocol、trustedIPs