2026 年 OpenClaw Gateway 内置健康探针(/health、/ready)与负载均衡:远程物理 Mac 裸机、Docker Compose 与 Kubernetes 的对齐验收、路径 shadowing 与误报未就绪的可复现 Runbook(配置片段 + FAQ)
SRE 与平台工程在把 OpenClaw Gateway 同时跑在 远程物理 Mac 裸机、Docker Compose 与 Kubernetes 时,常被「四层 LB 与七层反代各说各话、/ready 被 location 抢走、以及 kubelet 探针与真实客户端 Host/TLS 路径不一致」拖进通宵。本文给出三轨道对齐矩阵、七步可签字 Runbook、可直接粘贴的 K8s/Compose/反代片段,以及针对 误报未就绪 的分诊表与 FAQ。
1. 导语:为什么「探针绿」不等于「可接流量」
/health 与 /ready 若缺少明确契约,负载均衡器、Ingress 与 kubelet 往往会各自挑选「最容易绿」的路径:有的只验证 TCP 端口打开,有的命中了反代上的静态页,还有的带着错误的 Host 头直接拿到 200,却与网关真实路由无关。OpenClaw Gateway 在加载 workspace、skills 与上游模型路由时存在冷启动窗口,这会把「进程已监听」与「可接业务流量」拉开数十秒甚至更久。
本文把验收拆成可复制的证据链:语义冻结、路径不被 shadow、探针源与 bind 模式一致、Compose depends_on 与 K8s readiness 同源。若你还在评估多区域物理 Mac 流水线的稳定性基线,可参考 跨国 notarytool 交付里关于节点选择与长尾阈值 的写法,把健康探针纳入同一类「可签字」证据。
下文含对比表、七步 Runbook、YAML/Compose 片段与 FAQ;你可按章节跳转。
2. 三类痛点:语义混用、路径 shadowing、探针源与 bind 不一致
- 语义混用与隐性成本:把重查询或依赖外部网络的检查塞进
/health,会导致 liveness 误杀;反过来把/ready实现得过轻,又会在滚动发布时把未warm副本接进 LB,放大 5xx 与队列堆积。 - 路径 shadowing 与审计风险:更泛化的
location /或 Ingress 默认后端抢在网关规则之前命中,监控看到 200,但业务路径仍指向旧静态资源;审计上难以解释「为何健康与告警打架」。测试机型与系统版本不一致也会污染基线,关于 Sequoia 测试机租赁的决策 可作为对照阅读。 - 稳定性与权限边界:裸机上 launchd 的环境变量与交互式 SSH 会话不一致,探针脚本引用到错误
HOME;K8s 上 kubelet 探针与 VPC LB 健康检查源网段不同,NetworkPolicy 放行其一却拦截其二,表现为「调度已就绪但外部 LB 仍摘流」。
3. 决策矩阵:裸机、Compose、Kubernetes 如何对齐验收
用一张表统一「谁在什么约束下负责哪类健康信号」,避免三套脚本各写各的。
| 维度 | 远程物理 Mac 裸机(launchd) | Docker Compose | Kubernetes |
|---|---|---|---|
| /health 语义 | launchd 周期脚本或 curl -fsS 本机环回,验证事件循环存活 |
healthcheck.test 指向容器内环回或 bridge IP,与 compose 网络一致 |
liveness HTTP GET /health 或 TCP Socket,避免重依赖 |
| /ready 语义 | 仅在配置与关键依赖 OK 时返回 200;与反代 upstream 健康一致 | depends_on: condition: service_healthy 对齐同 URL |
readiness 指向 /ready,配 startupProbe 覆盖冷启动 |
| 负载均衡视角 | 本机或边缘反代终止 TLS;LB 健康检查需带与业务一致 SNI/Host | compose 前再挂边缘 LB 时,注意 published port 与反代 upstream 端口对齐 | Service/Ingress 与外部云 LB 各自维护成员池,须双路径记录 |
| 路径 shadowing 风险 | 本机 nginx/Caddy 多个 server 块顺序错误 | sidecar 反代与 app 容器路径冲突 | Ingress 多规则优先级、Canary 与默认后端抢占 |
| 推荐签字产物 | plist + 两段 curl 输出(直连与经反代) | docker compose ps 与健康日志截图 |
kubectl get endpoints 与探针事件时间线 |
4. 七步落地 Runbook(含配置片段)
-
冻结契约:在变更单写明
/health与/ready的状态码、JSON 字段(例如ok、deps)、最大响应时间与允许的短暂 503 窗口。 -
消除路径 shadowing(nginx 片段示意):将精确路径放在泛化规则之前。
# 精确路径优先,再落到 / location = /health { proxy_pass http://openclaw_gateway; } location = /ready { proxy_pass http://openclaw_gateway; } location / { # 其他站点或静态资源 } -
Kubernetes 探针片段(请按端口与路径替换):
startupProbe: httpGet: path: /ready port: 18789 failureThreshold: 30 periodSeconds: 2 readinessProbe: httpGet: path: /ready port: 18789 periodSeconds: 5 timeoutSeconds: 2 livenessProbe: httpGet: path: /health port: 18789 periodSeconds: 10 timeoutSeconds: 2 -
Docker Compose 健康检查与依赖:
services: openclaw-gateway: image: your.repo/openclaw-gateway@sha256:... healthcheck: test: ["CMD", "curl", "-fsS", "http://127.0.0.1:18789/ready"] interval: 10s timeout: 3s retries: 5 start_period: 60s edge: depends_on: openclaw-gateway: condition: service_healthy -
对齐 bind 与探针源:若网关配置为
bind=lan,避免 kubelet 只验证「进程存在」而 LB 仍指向旧成员;把云厂商健康检查源网段加入 NetworkPolicy/安全组白名单,并在变更单附「LB→节点→Pod」与「Pod 内自测」两组结果。 -
双路径对照与摘流演练:滚动发布前后各执行一次:直连 Pod IP、经 ClusterIP、经 Ingress 域名;记录
/ready返回体差异。若与你团队在 Kubernetes 上归档的 bind=lan、Service 与 NetworkPolicy 对照清单一并执行,可快速判断是否为网络层而非应用层回归。 -
误报未就绪复现包:在实验环境故意把反代
location /ready指到静态 200 页,再观察 Prometheus/云监控「全绿」与业务 5xx 分叉;把修复 diff(调整 location 顺序或改为location = /ready)附在 RCA 模板中,避免同类事故二次发生。
5. 可引用阈值与参数清单
- 冷启动宽限:若网关加载 skills 平均 25–40s,
startupProbe失败阈值 × 周期间隔应覆盖 P99 冷启动 + 20% 缓冲。 - readiness 周期:生产常用 3–10s;与外部 LB 检查周期对齐,避免出现「K8s 已就绪但 LB 仍 30s 才摘流」的窗口。
- 超时分层:建议 liveness 超时 < readiness 超时 < 客户端超时,形成清晰洋葱模型,避免最外层先熔断掩盖根因。
- 滚动最大不可用:双副本场景下
maxUnavailable: 0与maxSurge: 1组合更利于与 /ready 严格耦合;需在变更单声明短暂容量上限。
6. FAQ:误报未就绪与负载均衡
外部 LB 健康检查始终红,但 Pod 内 curl /ready 正常?
优先核对安全组/ACL 是否放行 LB 源网段到 NodePort/Ingress Controller;其次核对 Host/SNI 是否与证书和路由规则一致;最后确认路径未被 shadow 到静态页。
Compose 健康但 K8s 仍 NotReady?
对比两者是否使用同一 URL(HTTP vs HTTPS)、同一端口与同一 Host;K8s 默认不带业务域名 Host 头时,若应用强制虚拟主机路由,会返回非 200;可在探针增加 httpHeaders 或改用 exec 探测。
是否应该把模型上游延迟算进 /ready?
不建议把「每次请求都波动」的外部延迟硬耦合进就绪;可拆成子检查:配置加载、磁盘、DNS、证书与本地队列深度。对外部模型可用降级路由或熔断计数,在 metrics 中暴露而不是让 /ready 长期 503。
裸机上磁盘休眠导致首次 /ready 超时怎么写进基线?
在远程 Mac 上记录「冷启动后第一次」与「稳定运行 30 分钟后」两组延迟;必要时为 launchd 探针增加 ThrottleInterval 或在系统层关闭磁盘休眠,并在变更单注明功耗权衡。
7. 在 Mac mini 上做「黄金对照」为什么更划算
负载均衡与探针问题往往同时涉及TLS、Host 路由与进程绑定三类状态;在 macOS 上你可以用原生工具链快速复现而无需先搭完整集群。把同 digest 的 OpenClaw Gateway放在 Mac mini M4 上跑通 launchd 与反代基线,再映射到 Compose 与 Kubernetes,能显著减少「只在集群里才暴露」的路径 shadowing 与探针源差异。
Apple Silicon 的统一内存在长时间网关进程下通常比同价位小主机更稳,待机功耗约 4W 量级适合作为 7×24 健康探针实验节点;Gatekeeper 与 SIP 也降低了边缘节点被恶意替换二进制带来的隐性风险。对于需要同时对照裸机与编排环境的团队,一台静音、低功耗、长期运行稳定的 Mac mini M4 是非常划算的对照台。
如果你希望把本文 Runbook 落在真实硬件上快速复现,Mac mini M4 是目前兼具性价比与稳定性的起点,现在即可作为标准对照节点入手验证。
用远程 Mac mini 对齐探针与负载均衡基线
同版本网关先在 macOS 上签字,再推进 Compose/K8s,减少路径 shadowing 类通宵事故。