Hoe OpenClaw te deployen op Kubernetes
Beveiligingsonderzoekers hebben meer dan 135.000 OpenClaw-instanties gevonden die volledig onbeschermd op het internet staan. Veel daarvan waren kwetsbaar voor remote code execution. De OpenClaw-beveiligingscrisis is reëel: kritieke CVE’s, kwaadaardige skills en een fundamenteel probleem met hoe de meeste deployments authenticatie afhandelen. OpenClaw draaien op een VPS met docker run is eenvoudig. Het veilig draaien is een heel ander verhaal.
Kubernetes lost dat probleem op. U krijgt netwerkisolatie, resource limits, automatische herstarts en beveiligingsinstellingen die uren zouden kosten om handmatig te configureren. En met de OpenClaw Kubernetes Operator krijgt u dit alles vanuit één enkel YAML-bestand.
Deze handleiding brengt u van nul naar een productie-klare OpenClaw agent op Kubernetes. Elk YAML-blok is klaar om te kopiëren en plakken.
Waarom een operator
OpenClaw op Kubernetes draaien is meer dan een Deployment en een Service. U heeft netwerkisolatie, Secret-beheer, persistente opslag, health monitoring, config rollouts en optioneel browserautomatisering nodig. Dit alles correct handmatig configureren is omslachtig en foutgevoelig.
Een Kubernetes operator codeert deze behoeften in één enkele Custom Resource. U declareert wat u wilt, en de operator reconcilieert het continu naar de juiste Kubernetes-objecten. Dat geeft u:
- Beveiliging standaard. Elke agent draait als UID 1000, alle Linux capabilities verwijderd, Seccomp ingeschakeld, read-only root filesystem en een default-deny NetworkPolicy die alleen DNS- en HTTPS-egress toestaat. Geen handmatige hardening nodig.
- Auto-updates met rollback. De operator controleert het OCI-register op nieuwe versies, maakt een backup van de workspace, rolt de update uit en maakt automatisch een rollback als de nieuwe pod de health checks niet haalt.
- Config rollouts. Wijzig uw
spec.config.rawen de operator detecteert dat de content hash is veranderd, wat een rolling update activeert. Hetzelfde geldt voor secret-rotatie. - Backup en herstel. Automatische workspace-backup naar S3-compatibele opslag bij het verwijderen van een instantie. Herstel naar een nieuwe instantie vanuit elke snapshot.
- Gateway auth. Genereert automatisch een gateway-token per instantie. Geen handmatige koppeling, geen mDNS (dat in Kubernetes sowieso niet werkt).
- Drift-detectie. Elke 5 minuten controleert de operator of elke beheerde resource overeenkomt met de gewenste staat. Als iemand handmatig een NetworkPolicy bewerkt of een PDB verwijdert, wordt het teruggebracht.
Vereisten
U heeft nodig:
- Een Kubernetes-cluster (1.28+). Elke conforme distributie werkt: EKS, GKE, AKS, k3s, of een lokaal Kind-cluster voor testen.
kubectlgeconfigureerd voor uw cluster.helmv3 geïnstalleerd.- Een API-key voor uw AI-provider (Anthropic, OpenAI, of elk OpenAI-compatibel endpoint).
Stap 1: De operator installeren
De operator wordt geleverd als OCI Helm chart. Eén commando installeert hem:
helm install openclaw-operator \
oci://ghcr.io/openclaw-rocks/charts/openclaw-operator \
--namespace openclaw-operator-system \
--create-namespace
Controleer of hij draait:
kubectl get pods -n openclaw-operator-system
U zou de operator pod in de status Running moeten zien. De operator installeert ook een validating webhook die onveilige configuraties voorkomt (zoals draaien als root).
Stap 2: Uw API-key Secret aanmaken
Sla uw AI-provider API-key op in een Kubernetes Secret. De operator injecteert deze in de 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
Voor OpenAI of andere providers gebruikt u de juiste omgevingsvariabelenaam (OPENAI_API_KEY, OPENROUTER_API_KEY, etc.). U kunt meerdere providers in hetzelfde Secret opnemen.
Tip: Voor productie kunt u overwegen de External Secrets Operator te gebruiken om keys te synchroniseren vanuit AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager of Azure Key Vault. De documentatie van de operator bevat gedetailleerde voorbeelden.
Stap 3: Uw eerste agent deployen
Maak een bestand genaamd 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
Pas het toe:
kubectl apply -f my-agent.yaml
Deze enkele resource creëert een StatefulSet, Service, ServiceAccount, Role, RoleBinding, ConfigMap, PVC, PDB, NetworkPolicy en een gateway-token Secret. De operator reconcilieert alles.
Stap 4: Controleren of het draait
Volg het opstarten van de instantie:
kubectl get openclawinstances -n openclaw -w
NAME PHASE READY AGE
my-agent Provisioning False 10s
my-agent Running True 45s
Zodra de fase Running toont en Ready True is, is uw agent actief. Bekijk de logs:
kubectl logs -n openclaw statefulset/my-agent -f
Om met uw agent te communiceren, port-forward de gateway:
kubectl port-forward -n openclaw svc/my-agent 18789:18789
Open vervolgens http://localhost:18789 in uw browser.
Stap 5: Een kanaal verbinden
OpenClaw ondersteunt Telegram, Discord, WhatsApp, Signal en andere berichtenkanalen. Elk kanaal wordt geconfigureerd via omgevingsvariabelen. Voeg het relevante token toe aan uw Secret:
kubectl create secret generic openclaw-channel-keys \
--namespace openclaw \
--from-literal=TELEGRAM_BOT_TOKEN=your-bot-token-here
Verwijs er vervolgens naar in uw instantie:
spec:
envFrom:
- secretRef:
name: openclaw-api-keys
- secretRef:
name: openclaw-channel-keys
OpenClaw detecteert automatisch het token en activeert het kanaal. Geen aanvullende configuratie nodig.
Dat dekt de basis. Uw agent draait, is beveiligd en bereikbaar. De rest van deze handleiding behandelt optionele functies die u kunt activeren wanneer u er klaar voor bent.
Browserautomatisering
OpenClaw kan op het web surfen, screenshots maken en met pagina’s interacteren. De operator maakt dit een toevoeging van één regel. Hij draait een geharde Chromium sidecar in dezelfde pod, verbonden via localhost:
spec:
chromium:
enabled: true
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
De operator injecteert automatisch een CHROMIUM_URL-omgevingsvariabele in de hoofdcontainer. De sidecar draait als UID 1001 met een read-only root filesystem en een eigen security context.
Skills en runtime-afhankelijkheden
OpenClaw skills van ClawHub kunnen declaratief worden geïnstalleerd. De operator draait een init container die elke skill ophaalt voordat de agent start:
spec:
skills:
- "@anthropic/mcp-server-fetch"
- "@anthropic/mcp-server-filesystem"
Als uw skills of MCP-servers pnpm of Python nodig hebben, activeer de ingebouwde init containers voor runtime-afhankelijkheden:
spec:
runtimeDeps:
pnpm: true # Installs pnpm via corepack
python: true # Installs Python 3.12 + uv
De init containers installeren deze tools op de data PVC, zodat ze herstarts overleven zonder de container-image op te blazen.
Auto-updates
OpenClaw brengt regelmatig nieuwe versies uit. De operator kan deze automatisch volgen, een backup maken voor het updaten en terugdraaien als er iets misgaat:
spec:
autoUpdate:
enabled: true
checkInterval: "12h"
backupBeforeUpdate: true
rollbackOnFailure: true
healthCheckTimeout: "10m"
Wanneer een nieuwe versie in het register verschijnt, doet de operator het volgende:
- Maakt een backup van de workspace PVC naar S3-compatibele opslag
- Werkt de image tag bij op het StatefulSet
- Wacht tot
healthCheckTimeoutdat de pod de readiness checks haalt - Als de pod niet ready wordt, herstelt hij de vorige image tag en de backup
Na 3 opeenvolgende mislukte rollbacks pauzeert de operator auto-update en stelt een conditie in zodat u kunt onderzoeken.
Opmerking: Auto-update is een no-op voor digest-gepinde images (
spec.image.digest). Als u per digest pint, beheert u updates handmatig.
Productiehardening
De operator wordt standaard veilig geleverd. Hier zijn de extra knoppen voor productie-deployments.
Monitoring met Prometheus
Activeer de ServiceMonitor om operator- en instantie-metrics te scrapen:
spec:
observability:
metrics:
enabled: true
serviceMonitor:
enabled: true
interval: "30s"
De operator stelt openclaw_reconcile_total, openclaw_reconcile_duration_seconds, openclaw_instance_phase en auto-update-tellers beschikbaar.
Plannen op dedicated nodes
Als u een gemengd cluster draait, gebruik nodeSelector en tolerations om agents aan dedicated nodes te koppelen:
spec:
availability:
nodeSelector:
openclaw.rocks/nodepool: openclaw
tolerations:
- key: openclaw.rocks/dedicated
value: openclaw
effect: NoSchedule
Aangepaste egress-regels toevoegen
De standaard NetworkPolicy staat alleen DNS (poort 53) en HTTPS (poort 443) toe. Als uw agent andere services moet bereiken (een database, een message queue, een interne API), voeg egress-regels toe:
spec:
security:
networkPolicy:
additionalEgress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 5432
protocol: TCP
Cloud provider-identiteit
Voor AWS IRSA of GCP Workload Identity, annoteer het beheerde ServiceAccount:
spec:
security:
rbac:
serviceAccountAnnotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789:role/openclaw"
Bedrijfsproxies en privé-CA’s
Als uw cluster een TLS-onderscheppende proxy gebruikt, injecteer een CA-bundel:
spec:
security:
caBundle:
configMapName: corporate-ca-bundle
key: ca-bundle.crt
De operator mount de CA-bundel in alle containers en stelt NODE_EXTRA_CA_CERTS automatisch in.
GitOps
Het OpenClawInstance CRD is een gewoon YAML-bestand. Dat betekent dat het direct past in een GitOps-workflow. Sla uw agent-manifests op in een git-repository en laat ArgoCD of Flux ze synchroniseren met uw cluster.
Een typische repostructuur:
gitops/
└── agents/
├── kustomization.yaml
├── namespace.yaml
├── agent-a.yaml
└── agent-b.yaml
Elke wijziging gaat via een pull request. Uw team reviewt de diff. Merge naar main, en ArgoCD past het toe. Geen kubectl apply vanaf laptops, geen configuratiedrift, volledig auditspoor.
De config hashing van de operator maakt dit bijzonder soepel. Wanneer ArgoCD een gewijzigde spec.config.raw synchroniseert, detecteert de operator dat de content hash is veranderd en activeert automatisch een rolling update. Hetzelfde voor secret-rotatie: de operator monitort gerefereerde Secrets en herstart pods wanneer ze veranderen.
Backup en herstel
De operator ondersteunt S3-compatibele backups. Wanneer u een instantie verwijdert, maakt de operator automatisch een backup van de workspace PVC voor de verwijdering.
Om een agent te herstellen vanuit een backup in een nieuwe instantie:
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
De operator downloadt de snapshot, pakt deze uit in de PVC en start de agent met alle eerdere workspace-data, skills en gespreksgeschiedenis intact.
Lokale inferentie met Ollama
Als u wilt dat agents lokale modellen gebruiken (voor privacy, latentie of kosten), heeft de operator eersteklas Ollama-ondersteuning. Geen handmatige sidecar-configuratie nodig: spec.ollama regelt de container, het vooraf downloaden van modellen, opslag en GPU-toewijzing:
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
Wanneer ingeschakeld, doet de operator het volgende:
- Voegt een Ollama sidecar container toe aan de pod
- Draait een init container die de vermelde modellen vooraf downloadt voordat de agent start
- Injecteert
OLLAMA_HOST=http://localhost:11434in de hoofdcontainer - Wijst de gevraagde NVIDIA GPU toe via
nvidia.com/gpuresource limits
Standaard worden modellen opgeslagen in een emptyDir-volume met een configureerbare groottelimiet. Voor persistente modelopslag tussen herstarts (zodat modellen niet elke keer opnieuw worden gedownload), gebruik een bestaande PVC:
spec:
ollama:
enabled: true
models: ["llama3.2"]
storage:
existingClaim: ollama-models-pvc
Tailscale-integratie
Stel uw agent beschikbaar voor uw tailnet zonder Ingress, load balancers of publieke IP’s. Het spec.tailscale-veld van de operator regelt auth key-injectie, config-verrijking en NetworkPolicy-regels:
spec:
tailscale:
enabled: true
mode: serve # or "funnel" for public internet access
authKeySecretRef:
name: tailscale-authkey
hostname: my-agent
Maak het auth key Secret aan met een ephemeral, herbruikbare key van de Tailscale admin-console:
kubectl create secret generic tailscale-authkey \
--namespace openclaw \
--from-literal=authkey=tskey-auth-...
In serve-modus (standaard) kunnen alleen leden van uw tailnet de agent bereiken. In funnel-modus stelt Tailscale het beschikbaar op het publieke internet met automatisch HTTPS.
De operator doet automatisch het volgende:
- Injecteert
TS_AUTHKEYenTS_HOSTNAMEomgevingsvariabelen - Voegt
gateway.tailscale.modeengateway.tailscale.resetOnExitsamen in de OpenClaw-configuratie - Voegt STUN- en WireGuard-egress-regels toe aan de NetworkPolicy
Voor wachtwoordloze SSO-login voor tailnet-leden, activeer authSSO:
spec:
tailscale:
enabled: true
mode: serve
authKeySecretRef:
name: tailscale-authkey
authSSO: true
Dit stelt gateway.auth.allowTailscale=true in de OpenClaw-configuratie in, zodat tailnet-leden de agent kunnen benaderen zonder apart gateway-token.
Aangepaste sidecars en init containers
Voor gebruik voorbij de ingebouwde Ollama- en Tailscale-ondersteuning accepteert de operator willekeurige sidecars en init containers. Draai een Cloud SQL Proxy voor database-toegang, een log forwarder of elke andere helper naast uw 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
Aangepaste init containers draaien na de eigen init-pipeline van de operator (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-modus
Standaard overschrijft de operator het configuratiebestand bij elke pod-herstart. Als uw agent zijn eigen configuratie wijzigt tijdens runtime (via skills of zelfmodificatie), stel mergeMode: merge in voor een deep-merge van de operator-configuratie met de bestaande PVC-configuratie:
spec:
config:
mergeMode: merge
raw:
agents:
defaults:
model:
primary: "anthropic/claude-sonnet-4-20250514"
In merge-modus winnen door de operator opgegeven keys, maar keys die de agent zelf heeft toegevoegd overleven herstarts.
Het volledige voorbeeld
Hier is een productie-klaar manifest dat alles uit deze handleiding combineert:
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
Pas het toe, en u heeft een geharde, automatisch bijgewerkte, browser-capabele AI-agent met lokale inferentie, tailnet-toegang, monitoring, backup en netwerkisolatie. Eén kubectl apply.
Wat u standaard krijgt
Zonder ook maar één beveiligingsinstelling aan te raken, wordt elke door de operator gedeployde agent geleverd met:
- Niet-root uitvoering (UID 1000)
- Read-only root filesystem
- Alle Linux capabilities verwijderd
- Seccomp RuntimeDefault profiel
- Default-deny NetworkPolicy (alleen DNS + HTTPS egress)
- Per-instantie ServiceAccount zonder token auto-mounting
- PodDisruptionBudget
- Liveness, readiness en startup probes
- Automatisch gegenereerd gateway-authenticatietoken
- 5-minuten drift-reconciliatie
Een validating webhook blokkeert pogingen om als root te draaien en waarschuwt bij uitgeschakelde NetworkPolicies, ontbrekende TLS op Ingress en niet-gedetecteerde AI-provider keys.
Volgende stappen
- Bekijk de volledige API-referentie voor elk CRD-veld
- Lees de deployment-handleidingen voor EKS, GKE, AKS en Kind
- Stel model fallback-ketens in over meerdere AI-providers
- Configureer External Secrets voor Vault, AWS, GCP of Azure
Als u problemen ondervindt of feedback heeft, open een issue op GitHub. PR’s zijn ook welkom.
Als u Kubernetes niet zelf wilt beheren, regelt OpenClaw.rocks dit alles voor u. Kies een plan, verbind een kanaal, en uw agent is in seconden live.