2026 年 OpenClaw Gateway 內建健康探針(/health、/ready)與負載均衡:遠端實體 Mac 裸機、Docker Compose 與 Kubernetes 的對齊驗收、路徑 Shadowing 與誤報未就緒的可複現 Runbook(設定片段 + FAQ)
維運與平台工程師在遠端實體 Mac 上同時維護 裸機 launchd、Docker Compose 與 Kubernetes 三條交付軌道時,最常卡在「負載均衡探測路徑被應用路由遮蔽」「/ready 與 /health 語意混用」以及「探針在叢集內成功、在 LB 上卻失敗」這類誤報未就緒。本文給出可簽字的對齊矩陣、七步 Runbook、可貼上之Compose 與 K8s 片段,以及依症狀分診的 FAQ;並示範如何把閘道周邊能力(例如 MCP 雙路徑接入)納入同一套健康訊號策略。若你也在調整多區域 Runner 池,可一併參考 GitHub Actions 自託管與 Ephemeral Mac 的閾值矩陣。
1. 導語:為什麼三軌要共用同一份「健康契約」
OpenClaw Gateway 對外提供模型路由、工具與通道能力時,/health 與 /ready 是負載均衡器、Kubernetes 與 Compose 判斷「要不要送流量」的唯一共同語言;一旦三軌各自發明欄位或路徑,就會出現「監控全綠、使用者全紅」的割裂。
本文結論是:把兩個端點的 HTTP 狀態碼、逾時預算、Host 行為與是否允許重定向寫進一份契約,並在反向代理/Ingress 層為它們保留 高優先路由,再用同一組 curl 劇本在三軌重播,即可完成對齊驗收。
閱讀結構包含:痛點拆解、對照表、七步 Runbook、可引用數字與 FAQ。
2. 三類痛點:語意漂移、路徑遮蔽、網路命名空間錯位
- 語意漂移:團隊把重量級依賴檢查塞進 /health,導致探針逾時或被誤判為需要重啟;或把「可接受降級」塞進 /ready,造成滾動更新時全隊列流量被摘除。應固定:/health=行程存活;/ready=願意接客。
- 路徑遮蔽(shadowing):API 閘道或 Web 框架的萬用字元路由先於內建探針匹配,LB 收到 404/HTML 錯誤頁卻仍以為後端活著(若只檢查 TCP)或相反。需在 Nginx、Caddy、Traefik 或 Ingress 註明 精確 path 優先。
- 網路命名空間錯位:容器內
curl 127.0.0.1成功,但 kubelet 從 Pod IP 探測失敗;或閘道只綁回環而 Service 轉發不到。對照 bind=lan/0.0.0.0 與 targetPort 是否一致。
3. 決策矩陣:裸機、Compose、K8s 探針與 LB 對齊
下表用於變更單與事故復盤:每一列都應能在三軌找到對應設定或等價行為。
| 維度 | 遠端實體 Mac 裸機 + 反向代理 | Docker Compose | Kubernetes |
|---|---|---|---|
| 探針來源 | LB/監控 → 代理 → 閘道 | docker healthcheck 從容器網路命名空間 | kubelet 從 Pod IP 與節點路由 |
| /ready 建議語意 | 代理層不做快取破壞;回 200 表示可接客 | 與 K8s 相同;注意 start_period | readiness;失敗則自 Endpoints 摘除 |
| 路徑遮蔽風險 | 高:多 server 區塊順序 | 中:僅容器內路由 | 高:Ingress 規則與 pathType |
| 誤報未就緒首查 | Host/SNI、TLS 終止、301 鏈 | depends_on 不等於健康;檢 CMD | startupProbe、NetworkPolicy、bind |
4. 七步落地驗收與可貼上設定片段
步驟 1:凍結契約
在 README 或內部 wiki 寫明:GET /health 回 200 且 body 可選;GET /ready 在依賴未就緒時回 503(或團隊選定的非 200),並禁止在這兩個 path 上掛認證中介層。
步驟 2:本機冒煙(三軌共用)
curl -fsS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:18789/health
curl -fsS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:18789/ready
將埠號替換為實際閘道埠;若使用 TLS 終止於上游,加上 -k 或正確 CA 僅限於排錯環境。
步驟 3:Docker Compose healthcheck
services:
openclaw-gateway:
image: your-registry/openclaw-gateway:@sha256:...
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:18789/ready || exit 1"]
interval: 10s
timeout: 3s
retries: 3
start_period: 40s
start_period 應覆蓋模型索引或遠端憑證載入的最壞情況,避免啟動期誤判。
步驟 4:Kubernetes 探針
startupProbe:
httpGet:
path: /ready
port: http
failureThreshold: 30
periodSeconds: 2
readinessProbe:
httpGet:
path: /ready
port: http
periodSeconds: 5
timeoutSeconds: 2
failureThreshold: 3
livenessProbe:
httpGet:
path: /health
port: http
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 3
若曾發生「就緒後才暴露埠」的競態,優先加長 startupProbe 而非放寬 readinessProbe,以免長期掩蓋性能退化。
步驟 5:Ingress 路徑優先(防 shadowing)
以 NGINX Ingress 為例,確保 /health 與 /ready 使用精確匹配並排在萬用 path 之前;若使用正則路由,請把探針 path 放在更高 priority。
步驟 6:誤報未就緒分診
若 kubelet 成功而 LB 失敗:比對 Host 標頭、TLS 終止與 重定向鏈;若兩者皆失敗但本機成功:檢查是否只綁 127.0.0.1。可暫時以 TCP Socket 探測隔離 HTTP 層,定位後再切回 HTTP。
步驟 7:簽字歸檔
匯出滾動更新視窗內的 探針成功率、5xx 比例與 P95 啟動時間;附上代理與閘道設定雜湊,並註明回滾觸發條件(例如連續 N 次 /ready 非 200)。
5. 可引用閾值與參數
- readinessProbe.failureThreshold 預設為 3:在
periodSeconds: 5時約 15 秒內連續失敗才會從 Service 摘除,適合作為變更風險溝通數字。 - 雲負載均衡健康檢查間隔常見設定為 5–30 秒:過密會放大閘道日誌與 CPU;過疏會拉長故障檢知時間。
- Compose start_period建議先取閘道冷啟動 P95×1.5,再在新版本發佈後用實測收窄,避免與 K8s
startupProbe預算脫節。
6. FAQ
可以把認證 middleware 掛在 /ready 上嗎?
不建議。探針客戶端未必支援 OAuth 或自簽客戶端憑證;若必須隔離,應改用獨立內部埠或 mTLS 僅開給 kubelet/sidecar,並讓 LB 仍命中無認證的 /health。
為什麼「手動 curl 成功、LB 一直紅」?
優先列印 LB 實際送出的 Host 與 URL;再檢查是否經過 301→302 鏈而探測器未跟隨。最後用抓包對齊閘道 access log 的 request id。
多副本時 /ready 應不應該檢查共享快取?
應只檢查「本副本能否正確服務」的必要條件;共享快取降級可透過 metrics 與告警反映,而不是讓所有副本長期 NotReady。
7. 在 Mac mini 上讓閘道與探針更穩定
本文的驗收路徑高度依賴 長時間一致的本機網路堆疊與低雜訊的 CPU 背景占用:在遠端實體 Mac(尤其是 Mac mini)上,Apple Silicon 的能效讓閘道與 Docker/k3s 可長期維持穩定時鐘與低抖動延遲,macOS 對 launchd、虛擬化與簽章權限的原生整合,也能減少「容器內就緒、主機權限未就緒」這類雙軌錯位。
與同價位常時風扇拉滿的小型 x86 主機相比,Mac mini M4 在待機功耗約 4W 量級、系統崩潰率極低,且內建 Gatekeeper/SIP 可降低被植入惡意二進位的面積,特別適合當成7×24 邊緣閘道或 多區域 Runner 的前置節點。
若你希望把 /health、/ready 與負載均衡驗收跑在最省心的硬體與系統組合上,Mac mini M4 是目前最具性價比的切入點之一;現在即可透過 ZoneMac 取得節點,把上述 Runbook 一次對齊到生產。
準備好體驗高效能 Mac 了嗎?
立即體驗 Mac mini 雲端租賃服務,專為開發者打造的高效能構建環境