feat: CoreDNS IPv4 上游、03-03 Tomcat 修复、HAProxy 与验证脚本

- Ansible: 部署时自动配置 CoreDNS forward 为 IPv4,避免 ACME 解析失败
- 01-01/01-07: 文档增加 CoreDNS 设置说明
- 03-03: Tomcat webapps.dist 复制、HTTP/HTTPS 双 Ingress、显式 Dashboard IngressRoute
- traefik-dashboard-acme: tomcat-acme.yaml、404 排查说明
- HAProxy: 健康检查与 PROXY 配置拆分,18080/18443 部署与验证脚本

Made-with: Cursor
This commit is contained in:
2026-03-22 19:02:46 +08:00
parent de1be1dbe5
commit 8a54cac61f
25 changed files with 924 additions and 113 deletions

View File

@@ -16,17 +16,13 @@ opkg install haproxy
若使用 LuCI可在「系统」→「软件包」中搜索 `haproxy` 安装。
## 2. 配置
### 2.1 原生 HAProxy 配置(推荐)
## 2. 配置(原生)
编辑 `/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
**配置目录说明与「cfg 是否正确」的验证层次**`ansible/files/01-08-haproxy/README.md`**仅语法**`./scripts/01-08-verify-haproxy.sh --cfg-only`
### 2.2 UCI 配置(可选)
部分 OpenWrt 使用 UCI 管理 HAProxy编辑 `/etc/config/haproxy`。UCI 结构与选项因版本而异,可参考 [OpenWrt HAProxy 文档](https://openwrt.org/docs/guide-user/services/load_balancing/haproxy)
**无健康检查最简配置**`ansible/files/01-08-haproxy/haproxy-no-check.cfg`(与 Ansible 共用,可复制到 OpenWrt 或通过 playbook 下发)。将 `192.168.2.61``192.168.2.64` 按实际 K3s 节点 IP 修改。如需健康检查见第 3 节;如需真实客户端 IP 见第 5 节 PROXY Protocol。
## 3. 健康检查
@@ -41,49 +37,40 @@ opkg install haproxy
说明443 业务若为 **TCP 透传**backend 是 `mode tcp`,只能选 TCP 或 TLS若需 HTTPS 级检查,需另建 `mode http` 的 backend。
### 3.1 TCP2.1 默认)
### 3.1 TCP
`ansible/files/01-08-haproxy/haproxy.cfg` 中的 backend 块
`haproxy-no-check.cfg` 基础上,各 `server` 行末尾加 `check` 即可
### 3.2 HTTP80 明文)
替换 2.1 中 `backend k3s_http`frontend `http_in` 仍指向 `k3s_http`。在 backend 开头加 `option httpchk GET /`
完整配置:`ansible/files/01-08-haproxy/haproxy-http.cfg``backend k3s_http` 开头加 `option httpchk GET /``k3s_https` 仍为 TCP 检查
### 3.3 TLS443 握手,`mode tcp`
替换 2.1 中 `backend k3s_https`frontend `https_in` 仍指向 `k3s_https`。在 backend 中加 `option ssl-hello-chk`
完整配置:`ansible/files/01-08-haproxy/haproxy-tls.cfg``backend k3s_https` 中加 `option ssl-hello-chk`,做 TLS 握手层检查
### 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
```
完整配置:`ansible/files/01-08-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-08-deploy-openwrt-haproxy.sh`。将 uhttpd 恢复监听 80/443IPv4+IPv6HAProxy 部署到 18080/18443与 LuCI 共存。
```bash
/etc/init.d/haproxy enable
/etc/init.d/haproxy restart
```
验证:从内网访问 `http://<OpenWrt-IP>/``http://<OpenWrt-IP>/demo-m1/`02-05 矩阵),应能到达 Traefik 与后端。
验证:从内网访问 `http://<OpenWrt-IP>:18080/``http://<OpenWrt-IP>:18080/demo-m1/`家庭私网常用 18080/18443),应能到达 Traefik 与后端。
**自动验证**`./scripts/01-08-verify-haproxy-openwrt.sh``./scripts/01-08-verify-haproxy.sh`。经 **ssh onecloud** 作为第三方发起 curl验证 `http://<OpenWrt-IP>:18080``https://<域名>:18443`HTTPS 需 `--https-hosts`)。不部署、不改端口;需 OpenWrt HAProxy 已按 18080/18443 配置。可选 `--deploy-matrix http``--deploy-matrix tls` 一键部署对应 nginx 矩阵后再验证。**验证 HTTPS 时**:可先执行 `./scripts/01-08-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-08-haproxy/haproxy-proxy.cfg`**(仅 TCP 检查 + PROXY
**健康检查与 PROXY 组合**`ansible/files/01-08-haproxy/haproxy-proxy-http-tls.cfg` 为 HTTP 检查 + TLS 检查 + PROXY 的完整示例。
**完整配置**`ansible/files/01-08-haproxy/haproxy-proxy-http-tls.cfg`HTTP 检查 + TLS 检查 + PROXY
Traefik 端需启用 PROXY protocol 监听并信任 OpenWrt 的 IP否则会报错。UCI 配置需参考 OpenWrt HAProxy 文档中的相应选项。
@@ -93,6 +80,34 @@ Traefik 端需启用 PROXY protocol 监听并信任 OpenWrt 的 IP否则会
**防火墙**:确保 OpenWrt 放行实际监听端口80/443 或 18080/18443 等)入站,或将 HAProxy 监听接口加入相应 zone。
## 7. 故障排除
| 现象 | 可能原因 | 排查与处理 |
|------|----------|------------|
| HAProxy 启动失败 | 配置语法错误、端口被占用 | `haproxy -c -f /etc/haproxy.cfg` 校验;用 `netstat -tlnp``ss -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 配置 |
**常用命令**
```bash
# 校验配置
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-工作节点.md`Traefik 入口与 LB 基线