コンテンツにスキップ

OpenClawをKubernetesへデプロイ:最短で構築する方法

Kubernetes で新しいツールを動かそうとするとき、複雑な設定やマニフェストの管理に圧倒されてしまうことはありませんか?「もっとシンプルに、まずは動く環境を手に入れたい」というのは、多くの開発者が抱える共通の悩みです。

OpenClaw を Kubernetes 上で動かすための、最小限のスタート地点をご紹介します。これは本番環境用ではなく、コアとなるリソースを把握し、自分の環境に合わせて調整していくためのベースとして活用してください。

OpenClaw は、いくつかの設定ファイルを持つシンプルな単一コンテナです。カスタマイズの肝は、インフラのテンプレート化ではなく、エージェントの内容(Markdown ファイル、スキル、設定の上書き)にあります。Kustomize を使えば、Helm チャートのようなオーバーヘッドなしでオーバーレイを処理できます。もしデプロイがより複雑になった場合は、これらのマニフェストの上に Helm チャートを重ねることも可能です。

  • kubectl が接続された、実行中の Kubernetes クラスター(AKS, EKS, GKE, k3s, kind, OpenShift など)
  • 少なくとも 1 つのモデルプロバイダーの API key
Terminal window
# Replace with your provider: ANTHROPIC, GEMINI, OPENAI, or OPENROUTER
export <PROVIDER>_API_KEY="..."
./scripts/k8s/deploy.sh
kubectl port-forward svc/openclaw 18789:18789 -n openclaw
open http://localhost:18789

Gateway のトークンを取得して、Control UI に貼り付けてください:

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

ローカルでのデバッグ用に、./scripts/k8s/deploy.sh --show-token を実行すると、デプロイ後にトークンを表示できます。

クラスターが手元にない場合は、Kind を使ってローカルに作成しましょう:

Terminal window
./scripts/k8s/create-kind.sh # auto-detects docker or podman
./scripts/k8s/create-kind.sh --delete # tear down

作成後は、通常通り ./scripts/k8s/deploy.sh でデプロイできます。

オプション A — 環境変数に API key を設定(ワンステップ):

Terminal window
# Replace with your provider: ANTHROPIC, GEMINI, OPENAI, or OPENROUTER
export <PROVIDER>_API_KEY="..."
./scripts/k8s/deploy.sh

このスクリプトは、API key と自動生成された Gateway トークンを含む Kubernetes Secret を作成し、デプロイを実行します。すでに Secret が存在する場合は、現在の Gateway トークンと、変更されていないプロバイダーのキーを保持します。

オプション B — Secret を個別に作成:

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

ローカルテストでトークンを標準出力に表示したい場合は、どちらのコマンドでも --show-token を使用してください。

Terminal window
kubectl port-forward svc/openclaw 18789:18789 -n openclaw
open http://localhost:18789
Namespace: openclaw (configurable via OPENCLAW_NAMESPACE)
├── Deployment/openclaw # Single pod, init container + gateway
├── Service/openclaw # ClusterIP on port 18789
├── PersistentVolumeClaim # 10Gi for agent state and config
├── ConfigMap/openclaw-config # openclaw.json + AGENTS.md
└── Secret/openclaw-secrets # Gateway token + API keys

エージェントの指示(Agent instructions)

Section titled “エージェントの指示(Agent instructions)”

scripts/k8s/manifests/configmap.yaml 内の AGENTS.md を編集して再デプロイします:

Terminal window
./scripts/k8s/deploy.sh

scripts/k8s/manifests/configmap.yaml 内の openclaw.json を編集します。詳細なリファレンスは Gateway configuration を参照してください。

追加のキーをエクスポートして再実行します:

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

既存のプロバイダーキーは、上書きしない限り Secret 内に保持されます。

または、Secret に直接パッチを当てることもできます:

Terminal window
kubectl patch secret openclaw-secrets -n openclaw \
-p '{"stringData":{"<PROVIDER>_API_KEY":"..."}}'
kubectl rollout restart deployment/openclaw -n openclaw
Terminal window
OPENCLAW_NAMESPACE=my-namespace ./scripts/k8s/deploy.sh

scripts/k8s/manifests/deployment.yaml の image フィールドを編集します:

image: ghcr.io/openclaw/openclaw:2026.3.1

デフォルトのマニフェストでは、Gateway は Pod 内部のループバックにバインドされています。これは kubectl port-forward では機能しますが、Pod の IP に到達する必要がある Kubernetes の Service や Ingress パスでは機能しません。

Ingress やロードバランサー経由で Gateway を公開したい場合は、以下の対応が必要です:

  • scripts/k8s/manifests/configmap.yaml 内の Gateway のバインド設定を、loopback からデプロイモデルに合わせた非ループバックのバインドに変更する
  • Gateway の認証を有効にしたまま、適切な TLS 終端ポイントを使用する
  • リモートアクセス用に、サポートされている Web セキュリティモデル(HTTPS/Tailscale Serve や、必要に応じた明示的な許可オリジンの設定など)を使用して Control UI を構成する
Terminal window
./scripts/k8s/deploy.sh

これにより、すべてのマニフェストが適用され、Pod が再起動して設定や Secret の変更が反映されます。

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

これにより、Namespace とその中のすべてのリソース(PVC を含む)が削除されます。

アーキテクチャに関する注意点

Section titled “アーキテクチャに関する注意点”
  • Gateway はデフォルトで Pod 内のループバックにバインドされるため、同梱のセットアップは kubectl port-forward 用となっています。
  • クラスター全体に影響するリソース(Cluster-scoped resources)は使用せず、すべてが単一の Namespace 内で完結します。
  • セキュリティ面では、readOnlyRootFilesystem、drop: ALL ケーパビリティ、非ルートユーザー(UID 1000)の使用を採用しています。
  • デフォルト設定では、Control UI はより安全なローカルアクセスパス(ループバックバインドと kubectl port-forward による http://127.0.0.1:18789 へのアクセス)を維持します。
  • localhost 以外のアクセスに移行する場合は、サポートされているリモートモデル(HTTPS/Tailscale と適切な Gateway バインド、Control UI のオリジン設定)を使用してください。
  • Secret は一時ディレクトリで生成され、クラスターに直接適用されます。リポジトリのチェックアウト内に Secret の情報が書き込まれることはありません。
scripts/k8s/
├── deploy.sh # Creates namespace + secret, deploys via kustomize
├── create-kind.sh # Local Kind cluster (auto-detects docker/podman)
└── manifests/
├── kustomization.yaml # Kustomize base
├── configmap.yaml # openclaw.json + AGENTS.md
├── deployment.yaml # Pod spec with security hardening
├── pvc.yaml # 10Gi persistent storage
└── service.yaml # ClusterIP on 18789

困ったときは AI Setup Assistant に相談してみてください。

OpenClaw

OpenClaw Expert

まだ解決しませんか?

このページで解決しない場合は、OpenClaw Expertに直接質問してください。