Files
Deploy-Laboratory/docs/01-08-openwrt-haproxy.md
2026-03-21 04:36:06 +08:00

4.5 KiB
Raw Blame History

01-08 OpenWrt HAProxy 负载均衡

在 OpenWrt 上安装并配置 HAProxy将 80/443 流量转发到 K3s 集群节点Traefik 入口),实现单一入口与负载均衡。

前置条件

  • OpenWrt 与 K3s 节点同网段(如 192.168.2.0/24OpenWrt 通常为网关(如 192.168.2.1
  • 已完成 01-02-k3s-工作节点.md01-07Traefik 入口 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.61192.168.2.64 按实际 K3s 节点 IP 修改。健康检查默认为 TCP,如需升级见第 3 节;如需真实客户端 IP 见第 5 节 PROXY Protocol。

2.2 UCI 配置(可选)

部分 OpenWrt 使用 UCI 管理 HAProxy编辑 /etc/config/haproxy。UCI 结构与选项因版本而异,可参考 OpenWrt HAProxy 文档

3. 健康检查

分四类:TCPHTTPTLSHTTPS,由浅到深。

类型 说明 适用端口
TCP server ... check,端口能连即通过 80、443 等
HTTP option httpchk,明文 HTTP 请求 80
TLS option ssl-hello-chkTLS 握手层 443mode tcp
HTTPS option httpchk + server ... sslHTTP over TLS 443mode http

说明443 业务若为 TCP 透传backend 是 mode tcp,只能选 TCP 或 TLS若需 HTTPS 级检查,需另建 mode http 的 backend。

3.1 TCP2.1 默认)

ansible/files/01-08-haproxy/haproxy.cfg 中的 backend 块。

3.2 HTTP80 明文)

替换 2.1 中 backend k3s_httpfrontend http_in 仍指向 k3s_http。在 backend 开头加 option httpchk GET /

3.3 TLS443 握手,mode tcp

替换 2.1 中 backend k3s_httpsfrontend https_in 仍指向 k3s_https。在 backend 中加 option ssl-hello-chk

3.4 HTTPS443 应用层,mode http + ssl

适用于 HAProxy 在 443 终结 TLS 的场景frontend 需 mode httpbind 时带 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 *:80bind *:443 改为 bind *:18080bind *:18443 即可Traefik 入口及后端保持不变。

防火墙:确保 OpenWrt 放行实际监听端口80/443 或 18080/18443 等)入站,或将 HAProxy 监听接口加入相应 zone。

相关文档

  • 01-02-k3s-工作节点.mdTraefik 入口与 LB 基线
  • 02-05-nginx-验证矩阵-一键部署.md:验证矩阵(按入口 IP 访问)
  • 03-02-k3s-traefik-acme.mdPROXY protocol、trustedIPs