2026年 OpenClaw Gateway 内蔵ヘルス探針(/health、/ready)と負荷分散:リモート物理 Mac 裸機、Docker Compose と Kubernetes の検収揃え——パスシャドウイングと誤検知の NotReady 再現 Runbook(設定断片+FAQ)
ZoneMac リモート物理 Mac 上の OpenClaw Gateway を運用するチームは、localhost では 200 なのに nginx 越しは HTML、Kubernetes だけ NotReady といった「経路別の真偽」に悩まされます。本稿は /health と /ready の契約を 裸機+リバプロ、Docker Compose、Kubernetes で揃える手順と、パスシャドウイング・偽陽性の FAQ をまとめます。
はじめに:三つの実行形態、一つの契約
裸機の launchd、Compose の healthcheck、Kubernetes の livenessProbe/readinessProbe は、同じ意味契約に乗せるのがコツです。/health は「プロセスとイベントループが生きているか(安く再起動判断)」、/ready は「宣言した依存が揃ったときだけユーザー向けトラフィックを受ける」です。逆プロキシが広い location で先に応答すると、LB だけが温かいという地獄になります。
クライアントからゲートウェイまでの経路整合は SSH ローカル転送と Tailscale Serve の比較(Windows/Linux から macOS 物理ノード) と併読すると、検収 curl の出所がブレません。外向き WebSocket の表面硬化と緊急パッチの流れは v2026.4.5 緊急アップデート Runbook が近い文脈です。
1. 痛みの分解:シャドウイング、意味のズレ、監査コスト
- パスシャドウイング。 静的
location /や SPA のtry_filesが/readyに先に 200 を返し、OpenClaw には届きません。LB はプール健全と判断しますがゲートウェイは未検査です。 - プラットフォーム間の意味ドリフト。 Compose の
healthyはエンジン視点です。Kubernetes の Service セレクタが重なる、Ingress が意図しないカナリアへ流すと、観測は「緑」でも実トラフィックは別リビジョンです。 - 監査と安定性の隠れコスト。 liveness に
/readyを流用すると依存の瞬断が Pod 再起動に直結します。リモート Mac 群では Screen Sharing やエージェント状態のフラップ、オンノイズに化けます。
2. 意思決定表:各シグナルをどこで見るか
設計レビューで「誰が何を観測するか」を先に固定します。YAML を貼る前の一枚です。
| シグナル | 裸 Mac+リバプロ | Docker Compose | Kubernetes |
|---|---|---|---|
| /health(安価) | LB→nginx→gateway。CDN キャッシュを避ける | 公開ポートへの healthcheck | livenessProbe.httpGet.path=/health |
| /ready(厳格) | ユーザーと同じ Host+TLS。静的に隠さない | depends_on: condition service_healthy | readinessProbe+コールド用 startupProbe |
| 典型故障モード | prefix location が proxy_pass に勝つ | 公開ポート≠ホスト LB ポート | NetworkPolicy が kubelet サブネットを遮断 |
3. 七ステップ揃え込み Runbook
- 呼び出し元の列挙。 クラウド LB、nginx の
server_name、Compose、Helm、監視の ad-hoc curl を表にし、空欄を潰します。 - シャドウイングの実証。 プロキシホストから
curl -svH 'Host: your.api' https://127.0.0.1/readyと、ゲートウェイのループバック直叩きを diff します。 - catch-all より前に固定。
location = /healthとlocation = /readyを上流へproxy_pass。proxy_buffering offとCache-Control: no-storeを付与します。 - Compose:LB タイムアウトに寄せる。
interval/timeout/retriesを外部 LB の約 80% 以内に揃え、先に optimistic に緑にしないようにします。 - Kubernetes:Probe の分離。 liveness→
/health、readiness→/ready。モデルルータのウォームアップにはstartupProbeのfailureThresholdを伸ばします。 - ロールアウト稽古。 Blue/Green または Rolling で
kubectl get endpointsとゲートウェイログを並走し、/readyが新リビジョンで立ってからトラフィックが移ることを確認します。 - 証跡のアーカイブ。 マスクした
nginx -T、Compose、kubectl describe podをタイムスタンプ付きで保存し、次の偽 NotReady に備えます。
4. 設定断片
4.1 nginx:プローブ専用 location(シャドウ回避)
location = /health { proxy_pass http://openclaw_gateway; proxy_http_version 1.1;
proxy_set_header Host $host; proxy_buffering off; add_header Cache-Control "no-store"; }
location = /ready { proxy_pass http://openclaw_gateway; proxy_http_version 1.1;
proxy_set_header Host $host; proxy_buffering off; add_header Cache-Control "no-store"; }
4.2 Docker Compose:healthcheck と依存ゲート
services:
openclaw-gateway:
image: your.registry/openclaw-gateway@sha256:…
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:18789/health"]
interval: 15s
timeout: 3s
retries: 5
start_period: 120s
edge-proxy:
depends_on:
openclaw-gateway:
condition: service_healthy
4.3 Kubernetes:startup+readiness+liveness
startupProbe:
httpGet: { path: /ready, port: http }
periodSeconds: 5
failureThreshold: 30
readinessProbe:
httpGet: { path: /ready, port: http }
periodSeconds: 10
timeoutSeconds: 3
livenessProbe:
httpGet: { path: /health, port: http }
periodSeconds: 20
timeoutSeconds: 2
port: http は containerPort 名に合わせてください。TLS を Ingress で終端する場合は、メッシュの sidecar 有無に合わせてコンテナ素のポートへ向けるかを揃えます。
5. 引用用パラメータ(3 点)
- 18789 — Mac ノードでよく使われる OpenClaw gateway の HTTP 面。必ず
openclaw.jsonまたはリリースノートで実ポートを確定してから LB テンプレに焼き込みます。 - 120 秒の
start_period— コールドモデルキャッシュや Secret マウント遅延を吸う初手。2 週間の P95 で削ります。 - readiness 3 秒タイムアウト — 遅い上流と kubelet の攻撃性の折り合い。
failureThresholdで粘らせ、無限タイムアウトで本物の停滞を隠さないようにします。
6. FAQ:再現可能な偽陽性
nginx の背後で /health と /ready のパスシャドウイングとは?
広い prefix や SPA フォールバックが、上流の OpenClaw に届く前にプローブへ応答している状態です。HTML の 200 と JSON の 200 が混在するので、location の順序・proxy_pass 先・プローブ経路のキャッシュ無効化を確認します。
liveness と readiness の両方を /ready にしてよい?
推奨しません。liveness は安い /health、readiness は依存を表す /ready に分け、依存の瞬断で Pod が不必要に再起動しないようにします。
Compose は healthy なのに LB がドレインするのはなぜ?
コンテナのネットワーク名前空間と、LB が見る Host・TLS・パスが一致していないためです。LB 管理面から本番と同じ curl(SNI・URL・ヘッダ)を実行して差分を取ります。
リモート物理 Mac でデプロイ直後に偽の NotReady が出る原因は?
コールドキャッシュ、初回ハンドシェイク、Secret ボリューム遅延で /ready が初期タイムアウトを超えます。startupProbe や Compose の start_period で観測根拠を取ってから閾値を絞ります。
7. このゲートウェイ層に Mac mini が向く理由
プローブの意味は「ホストが落ちず、経路がブレない」ことから成り立ちます。Apple Silicon の Mac mini は待機電力が小さく、ラックやデスクでも静音で長時間稼働向きです。curl、launchctl、Docker Desktop/Colima、SSH が素直に揃う Unix 系スタックで、Windows 端末群のようなドライバ摩擦が少ないのも運用の楽さに直結します。
macOS の Gatekeeper、SIP、FileVault は、長寿命のエージェントトークンをゲートウェイ横に置くときの改ざんリスクを下げます。/ready が外向き自動化の合図になるほど、その静かな境界が効いてきます。
本文の検収 curl をそのまま回せるノードを手早く確保したいなら、Mac mini M4 は 2026 年時点でも現実的な基準線です。下の CTA から ZoneMac のゲートウェイ向け構成を比較し、ここで書いた三地点検証をそのまま本番前チェックに転用してください。
OpenClaw 専用 Mac ゲートウェイを今すぐ試す
本 Runbook が前提とする SSH 到達性とヘルスチェック運用に合わせたリモート Mac mini を、従量課金で利用できます。