So deployen Sie OpenClaw auf Kubernetes
Sicherheitsforscher haben über 135.000 OpenClaw-Instanzen entdeckt, die völlig ungeschützt im Internet erreichbar sind. Viele davon waren anfällig für Remote Code Execution. Die OpenClaw-Sicherheitskrise ist real: kritische CVEs, bösartige Skills und ein grundlegendes Problem damit, wie die meisten Deployments Authentifizierung handhaben. OpenClaw mit docker run auf einem VPS zu starten ist einfach. Es sicher zu betreiben ist eine ganz andere Herausforderung.
Kubernetes löst dieses Problem. Sie erhalten Netzwerkisolierung, Ressourcenlimits, automatische Neustarts und Sicherheitsstandards, deren manuelle Konfiguration Stunden dauern würde. Und mit dem OpenClaw Kubernetes Operator bekommen Sie all das aus einer einzigen YAML-Datei.
Diese Anleitung führt Sie von null zu einem produktionsreifen OpenClaw Agent auf Kubernetes. Jeder YAML-Block ist bereit zum Kopieren und Einfügen.
Warum ein Operator
OpenClaw auf Kubernetes zu betreiben ist mehr als ein Deployment und ein Service. Sie brauchen Netzwerkisolierung, Secret-Management, persistenten Speicher, Health Monitoring, Config Rollouts und optional Browser-Automatisierung. All das korrekt per Hand zu verdrahten ist mühsam und fehleranfällig.
Ein Kubernetes Operator kodiert diese Anforderungen in eine einzige Custom Resource. Sie deklarieren, was Sie wollen, und der Operator gleicht es kontinuierlich mit den richtigen Kubernetes-Objekten ab. Das gibt Ihnen:
- Sicherheit ab Werk. Jeder Agent läuft als UID 1000, alle Linux Capabilities sind deaktiviert, Seccomp ist aktiviert, das Root-Dateisystem ist schreibgeschützt, und eine Default-Deny NetworkPolicy erlaubt nur DNS- und HTTPS-Egress. Kein manuelles Hardening nötig.
- Auto-Updates mit Rollback. Der Operator prüft die OCI Registry auf neue Versionen, sichert den Workspace, rollt das Update aus und macht automatisch ein Rollback, wenn der neue Pod die Health Checks nicht besteht.
- Config Rollouts. Ändern Sie Ihre
spec.config.raw, und der Operator erkennt die geänderte Content-Hash und löst ein Rolling Update aus. Dasselbe gilt für Secret-Rotation. - Backup und Restore. Automatisches Workspace-Backup auf S3-kompatiblen Speicher bei Instanz-Löschung. Wiederherstellung in eine neue Instanz aus jedem Snapshot.
- Gateway Auth. Generiert automatisch einen Gateway-Token pro Instanz. Kein manuelles Pairing, kein mDNS (das in Kubernetes ohnehin nicht funktioniert).
- Drift Detection. Alle 5 Minuten prüft der Operator, ob jede verwaltete Ressource dem gewünschten Zustand entspricht. Wenn jemand manuell eine NetworkPolicy bearbeitet oder ein PDB löscht, wird es zurückgesetzt.
Voraussetzungen
Sie benötigen:
- Einen Kubernetes-Cluster (1.28+). Jede konforme Distribution funktioniert: EKS, GKE, AKS, k3s oder ein lokaler Kind-Cluster zum Testen.
kubectl, konfiguriert für Ihren Cluster.helmv3 installiert.- Einen API Key für Ihren AI-Provider (Anthropic, OpenAI oder einen beliebigen OpenAI-kompatiblen Endpoint).
Schritt 1: Den Operator installieren
Der Operator wird als OCI Helm Chart ausgeliefert. Ein Befehl installiert ihn:
helm install openclaw-operator \
oci://ghcr.io/openclaw-rocks/charts/openclaw-operator \
--namespace openclaw-operator-system \
--create-namespace
Überprüfen Sie, ob er läuft:
kubectl get pods -n openclaw-operator-system
Sie sollten den Operator Pod im Status Running sehen. Der Operator installiert außerdem einen Validating Webhook, der unsichere Konfigurationen verhindert (wie das Ausführen als Root).
Schritt 2: Ihr API-Key-Secret erstellen
Speichern Sie Ihren AI-Provider-API-Key in einem Kubernetes Secret. Der Operator injiziert ihn in den Agent-Container:
kubectl create namespace openclaw
kubectl create secret generic openclaw-api-keys \
--namespace openclaw \
--from-literal=ANTHROPIC_API_KEY=sk-ant-your-key-here
Für OpenAI oder andere Provider verwenden Sie den entsprechenden Umgebungsvariablennamen (OPENAI_API_KEY, OPENROUTER_API_KEY usw.). Sie können mehrere Provider im selben Secret hinterlegen.
Tipp: Für die Produktion sollten Sie den External Secrets Operator in Betracht ziehen, um Keys aus AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager oder Azure Key Vault zu synchronisieren. Die Operator-Dokumentation enthält detaillierte Beispiele.
Schritt 3: Ihren ersten Agent deployen
Erstellen Sie eine Datei namens my-agent.yaml:
apiVersion: openclaw.rocks/v1alpha1
kind: OpenClawInstance
metadata:
name: my-agent
namespace: openclaw
spec:
envFrom:
- secretRef:
name: openclaw-api-keys
config:
raw:
agents:
defaults:
model:
primary: "anthropic/claude-sonnet-4-20250514"
storage:
persistence:
enabled: true
size: 10Gi
Wenden Sie es an:
kubectl apply -f my-agent.yaml
Diese einzelne Ressource erstellt ein StatefulSet, einen Service, ein ServiceAccount, eine Role, ein RoleBinding, eine ConfigMap, ein PVC, ein PDB, eine NetworkPolicy und ein Gateway-Token-Secret. Der Operator gleicht alles ab.
Schritt 4: Prüfen, ob es läuft
Beobachten Sie, wie die Instanz hochfährt:
kubectl get openclawinstances -n openclaw -w
NAME PHASE READY AGE
my-agent Provisioning False 10s
my-agent Running True 45s
Sobald die Phase Running und Ready True anzeigt, ist Ihr Agent aktiv. Prüfen Sie die Logs:
kubectl logs -n openclaw statefulset/my-agent -f
Um mit Ihrem Agent zu interagieren, leiten Sie das Gateway per Port-Forward weiter:
kubectl port-forward -n openclaw svc/my-agent 18789:18789
Öffnen Sie dann http://localhost:18789 in Ihrem Browser.
Schritt 5: Einen Kanal verbinden
OpenClaw unterstützt Telegram, Discord, WhatsApp, Signal und weitere Messaging-Kanäle. Jeder Kanal wird über Umgebungsvariablen konfiguriert. Fügen Sie das entsprechende Token zu Ihrem Secret hinzu:
kubectl create secret generic openclaw-channel-keys \
--namespace openclaw \
--from-literal=TELEGRAM_BOT_TOKEN=your-bot-token-here
Referenzieren Sie es dann in Ihrer Instanz:
spec:
envFrom:
- secretRef:
name: openclaw-api-keys
- secretRef:
name: openclaw-channel-keys
OpenClaw erkennt das Token automatisch und aktiviert den Kanal. Keine zusätzliche Konfiguration nötig.
Das deckt die Grundlagen ab. Ihr Agent läuft, ist abgesichert und erreichbar. Der Rest dieser Anleitung behandelt optionale Features, die Sie aktivieren können, wenn Sie bereit sind.
Browser-Automatisierung
OpenClaw kann im Web surfen, Screenshots erstellen und mit Seiten interagieren. Der Operator macht das zu einer einzeiligen Ergänzung. Er führt einen gehärteten Chromium Sidecar im selben Pod aus, verbunden über localhost:
spec:
chromium:
enabled: true
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
Der Operator injiziert automatisch eine CHROMIUM_URL-Umgebungsvariable in den Hauptcontainer. Der Sidecar läuft als UID 1001 mit einem schreibgeschützten Root-Dateisystem und eigenem Security Context.
Skills und Laufzeitabhängigkeiten
OpenClaw Skills von ClawHub können deklarativ installiert werden. Der Operator führt einen Init Container aus, der jeden Skill vor dem Start des Agents abruft:
spec:
skills:
- "@anthropic/mcp-server-fetch"
- "@anthropic/mcp-server-filesystem"
Wenn Ihre Skills oder MCP Server pnpm oder Python benötigen, aktivieren Sie die eingebauten Init Container für Laufzeitabhängigkeiten:
spec:
runtimeDeps:
pnpm: true # Installs pnpm via corepack
python: true # Installs Python 3.12 + uv
Die Init Container installieren diese Tools auf dem Data PVC, sodass sie Neustarts überleben, ohne das Container-Image aufzublähen.
Auto-Updates
OpenClaw veröffentlicht häufig neue Versionen. Der Operator kann diese automatisch verfolgen, vor dem Update sichern und bei Problemen zurückrollen:
spec:
autoUpdate:
enabled: true
checkInterval: "12h"
backupBeforeUpdate: true
rollbackOnFailure: true
healthCheckTimeout: "10m"
Wenn eine neue Version in der Registry erscheint, führt der Operator folgende Schritte aus:
- Erstellt ein Backup des Workspace PVC auf S3-kompatiblen Speicher
- Aktualisiert den Image Tag am StatefulSet
- Wartet bis zu
healthCheckTimeout, bis der Pod die Readiness Checks besteht - Falls der Pod nicht ready wird, stellt er den vorherigen Image Tag und das Backup wieder her
Nach 3 aufeinanderfolgenden fehlgeschlagenen Rollbacks pausiert der Operator Auto-Update und setzt eine Condition, damit Sie untersuchen können.
Hinweis: Auto-Update ist ein No-Op für Digest-gepinnte Images (
spec.image.digest). Wenn Sie per Digest pinnen, steuern Sie Updates manuell.
Produktionshärtung
Der Operator wird standardmäßig sicher ausgeliefert. Hier sind die zusätzlichen Stellschrauben für Produktions-Deployments.
Monitoring mit Prometheus
Aktivieren Sie den ServiceMonitor, um Operator- und Instanz-Metriken zu scrapen:
spec:
observability:
metrics:
enabled: true
serviceMonitor:
enabled: true
interval: "30s"
Der Operator stellt openclaw_reconcile_total, openclaw_reconcile_duration_seconds, openclaw_instance_phase und Auto-Update-Zähler bereit.
Auf dedizierten Nodes planen
Wenn Sie einen gemischten Cluster betreiben, verwenden Sie nodeSelector und tolerations, um Agents an dedizierte Nodes zu binden:
spec:
availability:
nodeSelector:
openclaw.rocks/nodepool: openclaw
tolerations:
- key: openclaw.rocks/dedicated
value: openclaw
effect: NoSchedule
Benutzerdefinierte Egress-Regeln hinzufügen
Die Standard-NetworkPolicy erlaubt nur DNS (Port 53) und HTTPS (Port 443). Wenn Ihr Agent andere Services erreichen muss (eine Datenbank, eine Message Queue, eine interne API), fügen Sie Egress-Regeln hinzu:
spec:
security:
networkPolicy:
additionalEgress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 5432
protocol: TCP
Cloud-Provider-Identität
Für AWS IRSA oder GCP Workload Identity annotieren Sie das verwaltete ServiceAccount:
spec:
security:
rbac:
serviceAccountAnnotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789:role/openclaw"
Firmeneigene Proxys und private CAs
Wenn Ihr Cluster einen TLS-terminierenden Proxy verwendet, injizieren Sie ein CA-Bundle:
spec:
security:
caBundle:
configMapName: corporate-ca-bundle
key: ca-bundle.crt
Der Operator mountet das CA-Bundle in alle Container und setzt NODE_EXTRA_CA_CERTS automatisch.
GitOps
Das OpenClawInstance CRD ist eine einfache YAML-Datei. Das bedeutet, es passt direkt in einen GitOps-Workflow. Speichern Sie Ihre Agent-Manifeste in einem Git-Repository und lassen Sie ArgoCD oder Flux sie mit Ihrem Cluster synchronisieren.
Eine typische Repo-Struktur:
gitops/
└── agents/
├── kustomization.yaml
├── namespace.yaml
├── agent-a.yaml
└── agent-b.yaml
Jede Änderung geht durch einen Pull Request. Ihr Team reviewed den Diff. Merge auf main, und ArgoCD wendet es an. Kein kubectl apply von Laptops, kein Configuration Drift, vollständiges Audit Trail.
Das Config Hashing des Operators macht dies besonders reibungslos. Wenn ArgoCD eine geänderte spec.config.raw synchronisiert, erkennt der Operator die geänderte Content-Hash und löst automatisch ein Rolling Update aus. Dasselbe gilt für Secret-Rotation: Der Operator überwacht referenzierte Secrets und startet Pods bei Änderungen neu.
Backup und Restore
Der Operator unterstützt S3-kompatible Backups. Wenn Sie eine Instanz löschen, erstellt der Operator automatisch ein Backup des Workspace PVC vor dem Teardown.
Um einen Agent aus einem Backup in eine neue Instanz wiederherzustellen:
apiVersion: openclaw.rocks/v1alpha1
kind: OpenClawInstance
metadata:
name: my-agent-restored
namespace: openclaw
spec:
restoreFrom: "s3://bucket/path/to/backup.tar.gz"
envFrom:
- secretRef:
name: openclaw-api-keys
storage:
persistence:
enabled: true
size: 10Gi
Der Operator lädt den Snapshot herunter, entpackt ihn in das PVC und startet den Agent mit allen vorherigen Workspace-Daten, Skills und dem Konversationsverlauf.
Lokale Inferenz mit Ollama
Wenn Sie möchten, dass Agents lokale Modelle verwenden (für Datenschutz, Latenz oder Kosten), bietet der Operator erstklassigen Ollama-Support. Kein manuelles Sidecar-Setup nötig: spec.ollama übernimmt Container, Model Pre-Pulling, Speicher und GPU-Zuweisung:
spec:
ollama:
enabled: true
models:
- "llama3.2"
- "nomic-embed-text"
gpu: 1
resources:
requests:
cpu: "2"
memory: 4Gi
limits:
cpu: "4"
memory: 8Gi
storage:
sizeLimit: 30Gi
Bei Aktivierung führt der Operator folgende Schritte aus:
- Fügt einen Ollama Sidecar Container zum Pod hinzu
- Führt einen Init Container aus, der die aufgelisteten Modelle vor dem Agent-Start herunterlädt
- Injiziert
OLLAMA_HOST=http://localhost:11434in den Hauptcontainer - Weist die angeforderte NVIDIA GPU über
nvidia.com/gpuRessourcenlimits zu
Standardmäßig werden Modelle in einem emptyDir-Volume mit konfigurierbarer Größenbegrenzung gespeichert. Für persistenten Modellspeicher über Neustarts hinweg (damit Modelle nicht jedes Mal neu heruntergeladen werden) verwenden Sie ein vorhandenes PVC:
spec:
ollama:
enabled: true
models: ["llama3.2"]
storage:
existingClaim: ollama-models-pvc
Tailscale-Integration
Machen Sie Ihren Agent ohne Ingress, Load Balancer oder öffentliche IPs in Ihrem Tailnet erreichbar. Das spec.tailscale-Feld des Operators übernimmt Auth-Key-Injection, Config-Anreicherung und NetworkPolicy-Regeln:
spec:
tailscale:
enabled: true
mode: serve # or "funnel" for public internet access
authKeySecretRef:
name: tailscale-authkey
hostname: my-agent
Erstellen Sie das Auth-Key-Secret mit einem ephemeren, wiederverwendbaren Key aus der Tailscale Admin-Konsole:
kubectl create secret generic tailscale-authkey \
--namespace openclaw \
--from-literal=authkey=tskey-auth-...
Im serve-Modus (Standard) können nur Mitglieder Ihres Tailnets den Agent erreichen. Im funnel-Modus macht Tailscale ihn mit automatischem HTTPS im öffentlichen Internet erreichbar.
Der Operator führt automatisch folgende Schritte aus:
- Injiziert die Umgebungsvariablen
TS_AUTHKEYundTS_HOSTNAME - Fügt
gateway.tailscale.modeundgateway.tailscale.resetOnExitin die OpenClaw-Konfiguration ein - Fügt STUN- und WireGuard-Egress-Regeln zur NetworkPolicy hinzu
Für passwortloses SSO-Login für Tailnet-Mitglieder aktivieren Sie authSSO:
spec:
tailscale:
enabled: true
mode: serve
authKeySecretRef:
name: tailscale-authkey
authSSO: true
Dies setzt gateway.auth.allowTailscale=true in der OpenClaw-Konfiguration, sodass Tailnet-Mitglieder den Agent ohne separaten Gateway-Token nutzen können.
Benutzerdefinierte Sidecars und Init Container
Für Anwendungsfälle über den eingebauten Ollama- und Tailscale-Support hinaus akzeptiert der Operator beliebige Sidecars und Init Container. Betreiben Sie einen Cloud SQL Proxy für Datenbankzugriff, einen Log Forwarder oder einen beliebigen anderen Helper neben Ihrem Agent:
spec:
sidecars:
- name: cloudsql-proxy
image: gcr.io/cloud-sql-connectors/cloud-sql-proxy:2
args: ["--structured-logs", "project:region:instance"]
resources:
requests:
cpu: 100m
memory: 128Mi
Benutzerdefinierte Init Container laufen nach der eigenen Init-Pipeline des Operators (Config Seeding, pnpm, Python, Skills):
spec:
initContainers:
- name: fetch-data
image: curlimages/curl:8.5.0
command: ["sh", "-c", "curl -o /data/dataset.json https://..."]
volumeMounts:
- name: data
mountPath: /data
Config Merge Mode
Standardmäßig überschreibt der Operator die Config-Datei bei jedem Pod-Neustart. Wenn Ihr Agent seine eigene Konfiguration zur Laufzeit modifiziert (durch Skills oder Selbstmodifikation), setzen Sie mergeMode: merge, um die Operator-Konfiguration mit der vorhandenen PVC-Konfiguration tief zu mergen:
spec:
config:
mergeMode: merge
raw:
agents:
defaults:
model:
primary: "anthropic/claude-sonnet-4-20250514"
Im Merge-Modus haben vom Operator angegebene Schlüssel Vorrang, aber vom Agent selbst hinzugefügte Schlüssel überleben Neustarts.
Das vollständige Beispiel
Hier ist ein produktionsreifes Manifest, das alles aus dieser Anleitung kombiniert:
apiVersion: openclaw.rocks/v1alpha1
kind: OpenClawInstance
metadata:
name: production-agent
namespace: openclaw
spec:
envFrom:
- secretRef:
name: openclaw-api-keys
config:
mergeMode: merge
raw:
agents:
defaults:
model:
primary: "anthropic/claude-sonnet-4-20250514"
skills:
- "@anthropic/mcp-server-fetch"
runtimeDeps:
pnpm: true
chromium:
enabled: true
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
ollama:
enabled: true
models: ["llama3.2"]
gpu: 1
resources:
requests:
cpu: "2"
memory: 4Gi
tailscale:
enabled: true
mode: serve
authKeySecretRef:
name: tailscale-authkey
authSSO: true
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 2000m
memory: 4Gi
storage:
persistence:
enabled: true
size: 10Gi
autoUpdate:
enabled: true
checkInterval: "24h"
backupBeforeUpdate: true
rollbackOnFailure: true
observability:
metrics:
enabled: true
serviceMonitor:
enabled: true
# Remove or adjust these if you don't use dedicated nodes
availability:
nodeSelector:
openclaw.rocks/nodepool: openclaw
tolerations:
- key: openclaw.rocks/dedicated
value: openclaw
effect: NoSchedule
Wenden Sie es an, und Sie haben einen gehärteten, automatisch aktualisierenden, browserfähigen AI Agent mit lokaler Inferenz, Tailnet-Zugang, Monitoring, Backup und Netzwerkisolierung. Ein einziges kubectl apply.
Was Sie sofort erhalten
Ohne eine einzige Sicherheitseinstellung anzufassen, wird jeder vom Operator deployte Agent ausgeliefert mit:
- Nicht-Root-Ausführung (UID 1000)
- Schreibgeschütztem Root-Dateisystem
- Allen deaktivierten Linux Capabilities
- Seccomp RuntimeDefault Profil
- Default-Deny NetworkPolicy (nur DNS + HTTPS Egress)
- Eigenem ServiceAccount pro Instanz ohne Token-Auto-Mounting
- PodDisruptionBudget
- Liveness, Readiness und Startup Probes
- Automatisch generiertem Gateway-Authentifizierungstoken
- 5-Minuten-Drift-Reconciliation
Ein Validating Webhook blockiert Versuche, als Root zu starten, und warnt bei deaktivierten NetworkPolicies, fehlendem TLS auf Ingress und nicht erkannten AI-Provider-Keys.
Nächste Schritte
- Durchstöbern Sie die vollständige API-Referenz für jedes CRD-Feld
- Lesen Sie die Deployment-Anleitungen für EKS, GKE, AKS und Kind
- Richten Sie Model-Fallback-Ketten über mehrere AI-Provider ein
- Konfigurieren Sie External Secrets für Vault, AWS, GCP oder Azure
Wenn Sie auf Probleme stoßen oder Feedback haben, eröffnen Sie ein Issue auf GitHub. PRs sind ebenfalls willkommen.
Wenn Sie Kubernetes nicht selbst betreiben möchten, übernimmt OpenClaw.rocks all das für Sie. Wählen Sie einen Plan, verbinden Sie einen Kanal, und Ihr Agent ist in Sekunden live.