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.raw en 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.
  • kubectl geconfigureerd voor uw cluster.
  • helm v3 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:

  1. Maakt een backup van de workspace PVC naar S3-compatibele opslag
  2. Werkt de image tag bij op het StatefulSet
  3. Wacht tot healthCheckTimeout dat de pod de readiness checks haalt
  4. 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:

  1. Voegt een Ollama sidecar container toe aan de pod
  2. Draait een init container die de vermelde modellen vooraf downloadt voordat de agent start
  3. Injecteert OLLAMA_HOST=http://localhost:11434 in de hoofdcontainer
  4. Wijst de gevraagde NVIDIA GPU toe via nvidia.com/gpu resource 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_AUTHKEY en TS_HOSTNAME omgevingsvariabelen
  • Voegt gateway.tailscale.mode en gateway.tailscale.resetOnExit samen 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

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.