要实现一个基于 Caddy 的 PVE 高可用管理入口,核心思路是利用 Caddy 的 reverse_proxy 负载均衡与健康检查(Health Checks) 功能。

这样,当你访问同一个域名时,Caddy 会自动检测哪些 PVE 节点在线,并将请求转发给健康的节点。如果某个节点宕机,Caddy 会自动剔除它并跳转到下一个可用节点。

1. 核心 Caddyfile 配置

假设你有三个节点:Node A (1.1.1.1), Node B (2.2.2.2), Node C (3.3.3.3)。你可以这样配置:

Code snippet

pve.yourdomain.com {
    # 开启负载均衡代理
    reverse_proxy {
        # 列出所有 PVE 节点的管理地址(必须带 https 和 8006)
        to https://1.1.1.1:8006 https://2.2.2.2:8006 https://3.3.3.3:8006

        # 负载均衡策略:建议使用 first (始终尝试第一个,挂了才换) 
        # 或者 round_robin (轮询)
        lb_policy first

        # 【关键】主动健康检查
        # Caddy 会定期访问后端,确保节点活着
        health_uri /
        health_interval 10s
        health_timeout 2s
        health_status 2xx

        # 【关键】TLS 配置
        # 因为 PVE 节点自带自签名证书,Caddy 转发时需要跳过验证
        transport http {
            tls_insecure_skip_verify
        }
    }
}

2. 配置详解

  • lb_policy first: 对于 PVE 管理后台,我强烈建议使用 first 而不是 round_robin。因为 PVE 的 Web 登录会产生 Session,如果你频繁在节点间切换,可能会导致频繁掉线。使用 first 可以确保只要第一个节点没挂,你就一直待在第一个节点上。
  • tls_insecure_skip_verify: PVE 默认使用自签名证书(HTTPS 8006),如果不加这一行,Caddy 会因为无法验证上游证书而报错。
  • health_uri /: PVE 的根路径在存活时会返回 200 状态码,这足以作为健康检查的依据。

3. 进阶:解决 Caddy 自身的单点故障

虽然 Caddy 解决了 PVE 节点的跳转问题,但如果 运行 Caddy 的那台服务器 挂了怎么办?

由于你正在使用 Cloudflare,可以结合以下方案实现“全栈高可用”:

  1. 双 Caddy 节点: 在两台不同的 VPS 上运行相同的 Caddy 配置。
  2. Cloudflare 负载均衡 (推荐):

    • 在 Cloudflare 后台,为 pve.yourdomain.com 设置多条 A 记录,分别指向你的多个 Caddy 服务器 IP。
    • 开启 Cloudflare 的“小黄云”(Proxy 模式)。
    • 即使其中一台 Caddy 挂了,Cloudflare 的边缘节点也会尝试重试另一条记录。

4. 注意事项

  • MTU 问题: 考虑到你之前提到的跨地域 VPS 集群,如果网络延迟较高或有 VPN 隧道(如 WireGuard/Tailscale),请确保 Caddy 所在服务器的 MTU 设置正确,否则 Web 界面加载大文件(如 ISO 上传)时可能会卡死。
  • WebSocket 支持: Caddy 默认支持 WebSocket 转发,这对于 PVE 的 noVNC 控制台 至关重要,上述配置无需额外修改即可直接支持控制台操作。