Comment déployer OpenClaw sur Kubernetes
Des chercheurs en sécurité ont trouvé plus de 135 000 instances OpenClaw totalement exposées sur Internet. Nombre d’entre elles étaient vulnérables à l’exécution de code à distance. La crise de sécurité OpenClaw est bien réelle : CVE critiques, skills malveillants et un problème fondamental dans la gestion de l’authentification par la plupart des déploiements. Lancer OpenClaw sur un VPS avec docker run est simple. Le faire tourner en toute sécurité est un tout autre défi.
Kubernetes résout ce problème. Vous obtenez l’isolation réseau, les limites de ressources, les redémarrages automatiques et des paramètres de sécurité dont la configuration manuelle prendrait des heures. Et avec l’opérateur Kubernetes OpenClaw, vous obtenez tout cela à partir d’un seul fichier YAML.
Ce guide vous emmène de zéro à un agent OpenClaw prêt pour la production sur Kubernetes. Chaque bloc YAML est prêt à être copié-collé.
Pourquoi un opérateur
Faire tourner OpenClaw sur Kubernetes va bien au-delà d’un Deployment et d’un Service. Vous avez besoin d’isolation réseau, de gestion des Secrets, de stockage persistant, de surveillance de la santé, de déploiements de configuration et, optionnellement, d’automatisation du navigateur. Configurer tout cela correctement à la main est fastidieux et source d’erreurs.
Un opérateur Kubernetes encode ces préoccupations dans une seule Custom Resource. Vous déclarez ce que vous voulez, et l’opérateur le réconcilie en continu avec les bons objets Kubernetes. Cela vous apporte :
- La sécurité par défaut. Chaque agent tourne en UID 1000, toutes les capabilities Linux sont supprimées, Seccomp est activé, le système de fichiers root est en lecture seule, et une NetworkPolicy deny-by-default n’autorise que le DNS et le HTTPS en sortie. Aucun durcissement manuel nécessaire.
- Les mises à jour automatiques avec rollback. L’opérateur interroge le registre OCI pour les nouvelles versions, sauvegarde l’espace de travail, déploie la mise à jour et effectue automatiquement un rollback si le nouveau pod échoue aux health checks.
- Les déploiements de configuration. Modifiez votre
spec.config.rawet l’opérateur détecte le changement de hash du contenu, déclenchant une mise à jour progressive. Idem pour la rotation des secrets. - Sauvegarde et restauration. Sauvegarde automatique de l’espace de travail vers un stockage compatible S3 lors de la suppression d’une instance. Restauration dans une nouvelle instance depuis n’importe quel snapshot.
- Authentification du gateway. Génère automatiquement un token gateway par instance. Pas d’appairage manuel, pas de mDNS (qui ne fonctionne pas dans Kubernetes de toute façon).
- Détection de dérive. Toutes les 5 minutes, l’opérateur vérifie que chaque ressource gérée correspond à l’état souhaité. Si quelqu’un modifie manuellement une NetworkPolicy ou supprime un PDB, il est rétabli.
Prérequis
Vous avez besoin de :
- Un cluster Kubernetes (1.28+). Toute distribution conforme fonctionne : EKS, GKE, AKS, k3s, ou un cluster Kind local pour les tests.
kubectlconfiguré pour votre cluster.helmv3 installé.- Une clé API pour votre fournisseur AI (Anthropic, OpenAI, ou tout endpoint compatible OpenAI).
Étape 1 : Installer l’opérateur
L’opérateur est distribué sous forme de chart Helm OCI. Une seule commande l’installe :
helm install openclaw-operator \
oci://ghcr.io/openclaw-rocks/charts/openclaw-operator \
--namespace openclaw-operator-system \
--create-namespace
Vérifiez qu’il tourne :
kubectl get pods -n openclaw-operator-system
Vous devriez voir le pod de l’opérateur à l’état Running. L’opérateur installe également un webhook de validation qui empêche les configurations non sécurisées (comme l’exécution en root).
Étape 2 : Créer votre Secret de clé API
Stockez la clé API de votre fournisseur AI dans un Secret Kubernetes. L’opérateur l’injectera dans le conteneur de l’agent :
kubectl create namespace openclaw
kubectl create secret generic openclaw-api-keys \
--namespace openclaw \
--from-literal=ANTHROPIC_API_KEY=sk-ant-your-key-here
Pour OpenAI ou d’autres fournisseurs, utilisez le nom de variable d’environnement approprié (OPENAI_API_KEY, OPENROUTER_API_KEY, etc.). Vous pouvez inclure plusieurs fournisseurs dans le même Secret.
Conseil : Pour la production, envisagez d’utiliser l’External Secrets Operator pour synchroniser les clés depuis AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager ou Azure Key Vault. La documentation de l’opérateur contient des exemples détaillés.
Étape 3 : Déployer votre premier agent
Créez un fichier nommé 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
Appliquez-le :
kubectl apply -f my-agent.yaml
Cette unique ressource crée un StatefulSet, un Service, un ServiceAccount, un Role, un RoleBinding, une ConfigMap, un PVC, un PDB, une NetworkPolicy et un Secret de token gateway. L’opérateur réconcilie le tout.
Étape 4 : Vérifier qu’il tourne
Observez le démarrage de l’instance :
kubectl get openclawinstances -n openclaw -w
NAME PHASE READY AGE
my-agent Provisioning False 10s
my-agent Running True 45s
Dès que la phase affiche Running et Ready est True, votre agent est en ligne. Consultez les logs :
kubectl logs -n openclaw statefulset/my-agent -f
Pour interagir avec votre agent, faites un port-forward du gateway :
kubectl port-forward -n openclaw svc/my-agent 18789:18789
Puis ouvrez http://localhost:18789 dans votre navigateur.
Étape 5 : Connecter un canal
OpenClaw prend en charge Telegram, Discord, WhatsApp, Signal et d’autres canaux de messagerie. Chaque canal est configuré via des variables d’environnement. Ajoutez le token correspondant à votre Secret :
kubectl create secret generic openclaw-channel-keys \
--namespace openclaw \
--from-literal=TELEGRAM_BOT_TOKEN=your-bot-token-here
Puis référencez-le dans votre instance :
spec:
envFrom:
- secretRef:
name: openclaw-api-keys
- secretRef:
name: openclaw-channel-keys
OpenClaw détecte automatiquement le token et active le canal. Aucune configuration supplémentaire nécessaire.
Cela couvre les bases. Votre agent tourne, est sécurisé et accessible. Le reste de ce guide couvre les fonctionnalités optionnelles que vous pouvez activer quand vous le souhaitez.
Automatisation du navigateur
OpenClaw peut naviguer sur le web, prendre des captures d’écran et interagir avec les pages. L’opérateur rend cela possible en une seule ligne. Il exécute un sidecar Chromium durci dans le même pod, connecté via localhost :
spec:
chromium:
enabled: true
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
L’opérateur injecte automatiquement une variable d’environnement CHROMIUM_URL dans le conteneur principal. Le sidecar tourne en UID 1001 avec un système de fichiers root en lecture seule et son propre contexte de sécurité.
Skills et dépendances d’exécution
Les skills OpenClaw depuis ClawHub peuvent être installés de manière déclarative. L’opérateur lance un conteneur d’initialisation qui récupère chaque skill avant le démarrage de l’agent :
spec:
skills:
- "@anthropic/mcp-server-fetch"
- "@anthropic/mcp-server-filesystem"
Si vos skills ou serveurs MCP nécessitent pnpm ou Python, activez les conteneurs d’initialisation intégrés pour les dépendances d’exécution :
spec:
runtimeDeps:
pnpm: true # Installs pnpm via corepack
python: true # Installs Python 3.12 + uv
Les conteneurs d’initialisation installent ces outils sur le PVC de données, de sorte qu’ils persistent entre les redémarrages sans alourdir l’image du conteneur.
Mises à jour automatiques
OpenClaw publie fréquemment de nouvelles versions. L’opérateur peut les suivre automatiquement, sauvegarder avant la mise à jour et revenir en arrière en cas de problème :
spec:
autoUpdate:
enabled: true
checkInterval: "12h"
backupBeforeUpdate: true
rollbackOnFailure: true
healthCheckTimeout: "10m"
Lorsqu’une nouvelle version apparaît dans le registre, l’opérateur :
- Crée une sauvegarde du PVC de l’espace de travail vers un stockage compatible S3
- Met à jour le tag de l’image sur le StatefulSet
- Attend jusqu’à
healthCheckTimeoutque le pod passe les vérifications de disponibilité - Si le pod ne devient pas ready, restaure le tag d’image précédent et la sauvegarde
Après 3 rollbacks consécutifs échoués, l’opérateur met en pause les mises à jour automatiques et définit une condition pour que vous puissiez enquêter.
Remarque : La mise à jour automatique est un no-op pour les images épinglées par digest (
spec.image.digest). Si vous épinglez par digest, vous contrôlez les mises à jour manuellement.
Durcissement pour la production
L’opérateur est sécurisé par défaut. Voici les paramètres supplémentaires pour les déploiements en production.
Surveillance avec Prometheus
Activez le ServiceMonitor pour collecter les métriques de l’opérateur et des instances :
spec:
observability:
metrics:
enabled: true
serviceMonitor:
enabled: true
interval: "30s"
L’opérateur expose openclaw_reconcile_total, openclaw_reconcile_duration_seconds, openclaw_instance_phase et des compteurs de mises à jour automatiques.
Planifier sur des nœuds dédiés
Si vous exploitez un cluster mixte, utilisez nodeSelector et tolerations pour épingler les agents sur des nœuds dédiés :
spec:
availability:
nodeSelector:
openclaw.rocks/nodepool: openclaw
tolerations:
- key: openclaw.rocks/dedicated
value: openclaw
effect: NoSchedule
Ajouter des règles d’egress personnalisées
La NetworkPolicy par défaut n’autorise que le DNS (port 53) et le HTTPS (port 443). Si votre agent doit atteindre d’autres services (une base de données, une file de messages, une API interne), ajoutez des règles d’egress :
spec:
security:
networkPolicy:
additionalEgress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 5432
protocol: TCP
Identité du fournisseur cloud
Pour AWS IRSA ou GCP Workload Identity, annotez le ServiceAccount géré :
spec:
security:
rbac:
serviceAccountAnnotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789:role/openclaw"
Proxys d’entreprise et CA privées
Si votre cluster utilise un proxy interceptant le TLS, injectez un bundle CA :
spec:
security:
caBundle:
configMapName: corporate-ca-bundle
key: ca-bundle.crt
L’opérateur monte le bundle CA dans tous les conteneurs et définit NODE_EXTRA_CA_CERTS automatiquement.
GitOps
Le CRD OpenClawInstance est un simple fichier YAML. Cela signifie qu’il s’intègre directement dans un workflow GitOps. Stockez vos manifestes d’agents dans un dépôt git et laissez ArgoCD ou Flux les synchroniser avec votre cluster.
Une structure de dépôt typique :
gitops/
└── agents/
├── kustomization.yaml
├── namespace.yaml
├── agent-a.yaml
└── agent-b.yaml
Chaque modification passe par une pull request. Votre équipe examine le diff. Merge sur main, et ArgoCD l’applique. Plus de kubectl apply depuis les laptops, plus de dérive de configuration, une piste d’audit complète.
Le hachage de configuration de l’opérateur rend cela particulièrement fluide. Quand ArgoCD synchronise une spec.config.raw modifiée, l’opérateur détecte le changement de hash du contenu et déclenche automatiquement une mise à jour progressive. Idem pour la rotation des secrets : l’opérateur surveille les Secrets référencés et redémarre les pods lorsqu’ils changent.
Sauvegarde et restauration
L’opérateur prend en charge les sauvegardes compatibles S3. Lorsque vous supprimez une instance, l’opérateur crée automatiquement une sauvegarde du PVC de l’espace de travail avant la suppression.
Pour restaurer un agent depuis une sauvegarde dans une nouvelle instance :
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
L’opérateur télécharge le snapshot, le décompresse dans le PVC et démarre l’agent avec toutes les données de l’espace de travail précédent, les skills et l’historique de conversation intacts.
Inférence locale avec Ollama
Si vous souhaitez que vos agents utilisent des modèles locaux (pour la confidentialité, la latence ou le coût), l’opérateur offre un support Ollama de premier ordre. Pas besoin de configurer un sidecar manuellement : spec.ollama gère le conteneur, le pré-téléchargement des modèles, le stockage et l’allocation GPU :
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
Lorsqu’il est activé, l’opérateur :
- Ajoute un conteneur sidecar Ollama au pod
- Lance un conteneur d’initialisation qui pré-télécharge les modèles listés avant le démarrage de l’agent
- Injecte
OLLAMA_HOST=http://localhost:11434dans le conteneur principal - Alloue le GPU NVIDIA demandé via les limites de ressources
nvidia.com/gpu
Par défaut, les modèles sont stockés dans un volume emptyDir avec une limite de taille configurable. Pour un stockage persistant des modèles entre les redémarrages (afin que les modèles ne soient pas retéléchargés à chaque fois), utilisez un PVC existant :
spec:
ollama:
enabled: true
models: ["llama3.2"]
storage:
existingClaim: ollama-models-pvc
Intégration Tailscale
Exposez votre agent à votre tailnet sans Ingress, sans load balancer ni IP publique. Le champ spec.tailscale de l’opérateur gère l’injection de la clé d’authentification, l’enrichissement de la configuration et les règles NetworkPolicy :
spec:
tailscale:
enabled: true
mode: serve # or "funnel" for public internet access
authKeySecretRef:
name: tailscale-authkey
hostname: my-agent
Créez le Secret de clé d’authentification avec une clé éphémère et réutilisable depuis la console d’administration Tailscale :
kubectl create secret generic tailscale-authkey \
--namespace openclaw \
--from-literal=authkey=tskey-auth-...
En mode serve (par défaut), seuls les membres de votre tailnet peuvent accéder à l’agent. En mode funnel, Tailscale l’expose sur l’Internet public avec HTTPS automatique.
L’opérateur effectue automatiquement les actions suivantes :
- Injecte les variables d’environnement
TS_AUTHKEYetTS_HOSTNAME - Fusionne
gateway.tailscale.modeetgateway.tailscale.resetOnExitdans la configuration OpenClaw - Ajoute les règles d’egress STUN et WireGuard à la NetworkPolicy
Pour une connexion SSO sans mot de passe pour les membres du tailnet, activez authSSO :
spec:
tailscale:
enabled: true
mode: serve
authKeySecretRef:
name: tailscale-authkey
authSSO: true
Cela définit gateway.auth.allowTailscale=true dans la configuration OpenClaw, permettant aux membres du tailnet d’accéder à l’agent sans token gateway séparé.
Sidecars et conteneurs d’initialisation personnalisés
Pour les cas d’utilisation au-delà du support intégré Ollama et Tailscale, l’opérateur accepte des sidecars et des conteneurs d’initialisation arbitraires. Exécutez un Cloud SQL Proxy pour l’accès à la base de données, un transmetteur de logs ou tout autre assistant à côté de votre 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
Les conteneurs d’initialisation personnalisés s’exécutent après le pipeline d’initialisation de l’opérateur (seeding de configuration, 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
Mode de fusion de configuration
Par défaut, l’opérateur écrase le fichier de configuration à chaque redémarrage de pod. Si votre agent modifie sa propre configuration à l’exécution (via des skills ou de l’auto-modification), définissez mergeMode: merge pour fusionner en profondeur la configuration de l’opérateur avec la configuration PVC existante :
spec:
config:
mergeMode: merge
raw:
agents:
defaults:
model:
primary: "anthropic/claude-sonnet-4-20250514"
En mode fusion, les clés spécifiées par l’opérateur ont la priorité, mais les clés ajoutées par l’agent lui-même survivent aux redémarrages.
L’exemple complet
Voici un manifeste prêt pour la production qui combine tout ce qui est présenté dans ce guide :
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
Appliquez-le, et vous disposez d’un agent AI durci, mis à jour automatiquement, capable de naviguer, avec inférence locale, accès tailnet, surveillance, sauvegarde et isolation réseau. Un seul kubectl apply.
Ce que vous obtenez par défaut
Sans toucher au moindre paramètre de sécurité, chaque agent déployé par l’opérateur est livré avec :
- Exécution non-root (UID 1000)
- Système de fichiers root en lecture seule
- Toutes les capabilities Linux supprimées
- Profil Seccomp RuntimeDefault
- NetworkPolicy deny-by-default (egress DNS + HTTPS uniquement)
- ServiceAccount par instance sans montage automatique de token
- PodDisruptionBudget
- Sondes de liveness, readiness et startup
- Token d’authentification gateway généré automatiquement
- Réconciliation de dérive toutes les 5 minutes
Un webhook de validation bloque les tentatives d’exécution en root et avertit en cas de NetworkPolicies désactivées, d’absence de TLS sur l’Ingress et de clés de fournisseur AI non détectées.
Prochaines étapes
- Parcourez la référence API complète pour chaque champ du CRD
- Lisez les guides de déploiement pour EKS, GKE, AKS et Kind
- Configurez des chaînes de fallback de modèles à travers plusieurs fournisseurs AI
- Configurez External Secrets pour Vault, AWS, GCP ou Azure
Si vous rencontrez des problèmes ou avez des retours, ouvrez une issue sur GitHub. Les PRs sont également les bienvenues.
Si vous ne souhaitez pas gérer Kubernetes vous-même, OpenClaw.rocks s’occupe de tout pour vous. Choisissez un plan, connectez un canal, et votre agent est en ligne en quelques secondes.