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

101 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 01-08 OpenWrt HAProxy 负载均衡
> 在 OpenWrt 上安装并配置 HAProxy将 80/443 流量转发到 K3s 集群节点Traefik 入口),实现单一入口与负载均衡。
## 前置条件
- OpenWrt 与 K3s 节点同网段(如 192.168.2.0/24OpenWrt 通常为网关(如 192.168.2.1
- 已完成 `01-02-k3s-工作节点.md``01-07`Traefik 入口 80/443 已在各节点可达
## 1. 安装 HAProxy
```bash
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 文档](https://openwrt.org/docs/guide-user/services/load_balancing/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 TCP2.1 默认)
`ansible/files/01-08-haproxy/haproxy.cfg` 中的 backend 块。
### 3.2 HTTP80 明文)
替换 2.1 中 `backend k3s_http`frontend `http_in` 仍指向 `k3s_http`。在 backend 开头加 `option httpchk GET /`
### 3.3 TLS443 握手,`mode tcp`
替换 2.1 中 `backend k3s_https`frontend `https_in` 仍指向 `k3s_https`。在 backend 中加 `option ssl-hello-chk`
### 3.4 HTTPS443 应用层,`mode http` + `ssl`
适用于 **HAProxy 在 443 终结 TLS** 的场景frontend 需 `mode http``bind` 时带 ssl。若仍为 TCP 透传,用 3.3 即可。需与 Traefik 路由匹配的 `Host`;自签/内网 CA 可用 `verify none`,生产建议 `ca-file`
```haproxy
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. 启动与验证
```bash
/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