Kubernetes 上的 OpenClaw

在 Kubernetes 上執行 OpenClaw 的最小起點——這不是 production-ready 的部署。涵蓋核心資源,旨在讓你依據環境調整。

為什麼不用 Helm?

OpenClaw 是一個容器加幾個設定檔。有趣的客製化在於 agent 內容(markdown 檔案、技能、設定覆寫),不在基礎設施範本化。Kustomize 處理 overlay 而不需要 Helm chart 的額外負擔。如果部署變複雜,可以在這些 manifest 之上疊加 Helm chart。

你需要什麼

  • 運行中的 Kubernetes 叢集(AKS、EKS、GKE、k3s、kind、OpenShift 等)
  • kubectl 已連接到叢集
  • 至少一個模型供應商的 API 金鑰

快速開始

# 替換為你的供應商:ANTHROPIC、GEMINI、OPENAI 或 OPENROUTER
export <PROVIDER>_API_KEY="..."
./scripts/k8s/deploy.sh

kubectl port-forward svc/openclaw 18789:18789 -n openclaw
open http://localhost:18789

取得閘道 token 並貼入 Control UI:

kubectl get secret openclaw-secrets -n openclaw -o jsonpath='{.data.OPENCLAW_GATEWAY_TOKEN}' | base64 -d

本機除錯時,./scripts/k8s/deploy.sh --show-token 會在部署後印出 token。

使用 Kind 本機測試

如果沒有叢集,用 Kind 建立本機叢集:

./scripts/k8s/create-kind.sh           # 自動偵測 docker 或 podman
./scripts/k8s/create-kind.sh --delete  # 刪除

然後照常用 ./scripts/k8s/deploy.sh 部署。

逐步說明

1) 部署

選項 A — API 金鑰在環境變數中(一步完成):

# 替換為你的供應商:ANTHROPIC、GEMINI、OPENAI 或 OPENROUTER
export <PROVIDER>_API_KEY="..."
./scripts/k8s/deploy.sh

腳本建立含有 API 金鑰和自動產生閘道 token 的 Kubernetes Secret,然後部署。如果 Secret 已存在,會保留現有 token 和未變更的供應商金鑰。

選項 B — 分開建立 secret:

export <PROVIDER>_API_KEY="..."
./scripts/k8s/deploy.sh --create-secret
./scripts/k8s/deploy.sh

使用 --show-token 將 token 印到 stdout 用於本機測試。

2) 存取閘道

kubectl port-forward svc/openclaw 18789:18789 -n openclaw
open http://localhost:18789

部署內容

Namespace: openclaw(可透過 OPENCLAW_NAMESPACE 設定)
├── Deployment/openclaw        # 單一 pod,init 容器 + 閘道
├── Service/openclaw           # ClusterIP,連接埠 18789
├── PersistentVolumeClaim      # 10Gi 用於 agent 狀態和設定
├── ConfigMap/openclaw-config  # openclaw.json + AGENTS.md
└── Secret/openclaw-secrets    # 閘道 token + API 金鑰

客製化

Agent 指令

編輯 scripts/k8s/manifests/configmap.yaml 中的 AGENTS.md 並重新部署:

./scripts/k8s/deploy.sh

閘道設定

編輯 scripts/k8s/manifests/configmap.yaml 中的 openclaw.json。完整參考請見閘道設定

新增供應商

帶額外金鑰重新執行:

export ANTHROPIC_API_KEY="..."
export OPENAI_API_KEY="..."
./scripts/k8s/deploy.sh --create-secret
./scripts/k8s/deploy.sh

現有供應商金鑰在 Secret 中保留,除非你覆寫。

或直接修補 Secret:

kubectl patch secret openclaw-secrets -n openclaw \
  -p '{"stringData":{"<PROVIDER>_API_KEY":"..."}}'
kubectl rollout restart deployment/openclaw -n openclaw

自訂 namespace

OPENCLAW_NAMESPACE=my-namespace ./scripts/k8s/deploy.sh

自訂映像

編輯 scripts/k8s/manifests/deployment.yaml 中的 image 欄位:

image: ghcr.io/openclaw/openclaw:2026.3.1

超越 port-forward 的存取

預設 manifest 將閘道綁定到 pod 內的 loopback。這適用於 kubectl port-forward,但不適用於需要存取 pod IP 的 Kubernetes Service 或 Ingress。

要透過 Ingress 或負載平衡器暴露閘道:

  • scripts/k8s/manifests/configmap.yaml 中的閘道綁定從 loopback 改為符合你部署模型的 non-loopback 綁定
  • 保持閘道驗證啟用並使用適當的 TLS-terminated 入口點
  • 使用支援的網頁安全模型(如 HTTPS/Tailscale Serve 和明確的 allowed origins)設定 Control UI 的遠端存取

重新部署

./scripts/k8s/deploy.sh

套用所有 manifest 並重啟 pod 以取得設定或 secret 變更。

清除

./scripts/k8s/deploy.sh --delete

刪除 namespace 及其中所有資源,包含 PVC。

架構備註

  • 閘道預設綁定到 pod 內的 loopback,因此內建設定適用 kubectl port-forward
  • 無 cluster-scoped 資源——一切在單一 namespace 中
  • 安全性:readOnlyRootFilesystemdrop: ALL capabilities、非 root 使用者(UID 1000)
  • 預設設定將 Control UI 保持在較安全的本機存取路徑:loopback 綁定 + kubectl port-forwardhttp://127.0.0.1:18789
  • 超越 localhost 存取時,使用支援的遠端模型:HTTPS/Tailscale + 適當的閘道綁定和 Control UI origin 設定
  • Secret 在暫存目錄中產生並直接套用到叢集——不會在儲存庫 checkout 中寫入 secret 資料

檔案結構

scripts/k8s/
├── deploy.sh                   # 建立 namespace + secret,透過 kustomize 部署
├── create-kind.sh              # 本機 Kind 叢集(自動偵測 docker/podman)
└── manifests/
    ├── kustomization.yaml      # Kustomize base
    ├── configmap.yaml          # openclaw.json + AGENTS.md
    ├── deployment.yaml         # 含安全強化的 Pod spec
    ├── pvc.yaml                # 10Gi 持久儲存
    └── service.yaml            # ClusterIP,連接埠 18789