Files
Deploy-Laboratory/docs/01-07-openwrt-haproxy.md
jack be97836e0d chore: 清理调试脚本并收敛到 Ansible 流程
移除已废弃的调试/验证脚本与空目录,统一文档与脚本说明到 ansible-playbook 的部署方式,避免失效引用和误用路径。

Made-with: Cursor
2026-03-23 19:18:55 +08:00

6.5 KiB
Raw Blame History

01-07 OpenWrt HAProxy 负载均衡

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

前置条件

  • OpenWrt 与 K3s 节点同网段(如 192.168.2.0/24OpenWrt 通常为网关(如 192.168.2.1
  • 已完成 01-02-k3s-工作节点.md01-06Traefik 入口 80/443 已在各节点可达

1. 安装 HAProxy

opkg update
opkg install haproxy

若使用 LuCI可在「系统」→「软件包」中搜索 haproxy 安装。

2. 配置(原生)

编辑 /etc/haproxy.cfg 或包提供的配置路径(部分 OpenWrt 使用 /etc/haproxy/haproxy.cfg)。可在 /etc/init.d/haproxy 中查看实际配置文件路径。

配置目录说明与「cfg 是否正确」的验证层次:见 ansible/files/01-07-haproxy/README.md仅语法./scripts/01-07-verify-haproxy.sh --cfg-only)。

无健康检查最简配置ansible/files/01-07-haproxy/haproxy-no-check.cfg(与 Ansible 共用,可复制到 OpenWrt 或通过 playbook 下发)。将 192.168.2.61192.168.2.64 按实际 K3s 节点 IP 修改。如需健康检查见第 3 节;如需真实客户端 IP 见第 5 节 PROXY Protocol。

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 TCP

haproxy-no-check.cfg 基础上,各 server 行末尾加 check 即可。

3.2 HTTP80 明文)

完整配置:ansible/files/01-07-haproxy/haproxy-http.cfgbackend k3s_http 开头加 option httpchk GET /k3s_https 仍为 TCP 检查。

3.3 TLS443 握手,mode tcp

完整配置:ansible/files/01-07-haproxy/haproxy-tls.cfgbackend k3s_https 中加 option ssl-hello-chk,做 TLS 握手层检查。

3.4 HTTPS443 应用层,mode http + ssl

完整配置:ansible/files/01-07-haproxy/haproxy-https.cfg。适用于 HAProxy 在 443 终结 TLS由 HAProxy 提供证书) 的场景frontend 需 bind *:443 ssl crt ...)。需与 Traefik 路由匹配的 Host;自签/内网 CA 用 verify none,生产建议 ca-file。若仍为 TCP 透传,用 3.3 即可。

4. 启动与验证

一键部署uhttpd 80/443 + HAProxy 18080/18443./scripts/01-07-deploy-openwrt-haproxy.sh。将 uhttpd 恢复监听 80/443IPv4+IPv6HAProxy 部署到 18080/18443与 LuCI 共存。

/etc/init.d/haproxy enable
/etc/init.d/haproxy restart

验证:从内网访问 http://<OpenWrt-IP>:18080/http://<OpenWrt-IP>:18080/demo-m1/(家庭私网常用 18080/18443应能到达 Traefik 与后端。

自动验证./scripts/01-07-verify-haproxy-openwrt.sh./scripts/01-07-verify-haproxy.sh。经 ssh onecloud 作为第三方发起 curl验证 http://<OpenWrt-IP>:18080https://<域名>:18443HTTPS 需 --https-hosts)。不部署、不改端口;需 OpenWrt HAProxy 已按 18080/18443 配置。可选 --deploy-matrix http--deploy-matrix tls 一键部署对应 nginx 矩阵后再验证。验证 HTTPS 时:可先执行 ./scripts/01-07-deploy-nginx-tls-via-ylc61.sh,经 ssh ylc61 在控制节点上一键部署 nginx TLS 矩阵,再带 --https-hosts 'test01.jackadam.top,...' 验证。验证通过后默认更新 docs/00-02-验证矩阵.md--no-update-matrix 跳过)。

5. PROXY Protocol可选

若 Traefik 需获取真实客户端 IP可在 HAProxy 后端每个 server 行添加 send-proxy-v2,并在 Traefik 配置 trustedIPs 包含 OpenWrt 网段(见 03-02-k3s-traefik-acme.md)。

完整配置ansible/files/01-07-haproxy/haproxy-proxy-http-tls.cfgHTTP 检查 + 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。

7. 故障排除

现象 可能原因 排查与处理
HAProxy 启动失败 配置语法错误、端口被占用 haproxy -c -f /etc/haproxy.cfg 校验;用 netstat -tlnpss -tlnp 查端口占用
curl 到网关 80 返回 LuCI uhttpd 占 80HAProxy 若用 80 会冲突 家庭私网建议 HAProxy 用 18080/18443与 LuCI 共存
502 Bad Gateway / 后端全部 down K3s 节点不可达、健康检查过严 curl http://<节点IP>/ 直连节点;放宽 check 或改用 TCP 检查
HTTP 可达但 HTTPS 不通 TLS 透传与检查类型不匹配 443 若为 mode tcp,用 TCP 或 TLS 检查;mode http 时用 HTTPS 检查并核对 Host
日志显示 PROXY protocol 错误 Traefik 未启用或未信任 OpenWrt 确认 Traefik 入口启用 PROXY、trustedIPs 含 OpenWrt 网段;或暂时去掉 send-proxy-v2
修改配置后无效果 未重启、配置路径错误 /etc/init.d/haproxy restart;确认 /etc/init.d/haproxy 中读取的 cfg 路径
外网访问不到 运营商封 80/443、防火墙未放行 改用 18080/18443 或配合 Cloudflare检查 firewall 规则与 zone 配置

常用命令

# 校验配置
haproxy -c -f /etc/haproxy.cfg

# 手动前台启动便于看输出、init.d 不可用时)
haproxy -f /etc/haproxy.cfg

# 查看 HAProxy 状态(若使用 init.d
/etc/init.d/haproxy status

# 直连 K3s 节点验证
curl -v http://192.168.2.61/

相关文档

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