101 lines
4.5 KiB
Markdown
101 lines
4.5 KiB
Markdown
# 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
|
||
|
||
```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 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`。
|
||
|
||
```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
|