Hosting
Kubernetes
Un point de départ minimal pour exécuter OpenClaw sur Kubernetes, et non un déploiement prêt pour la production. Il couvre les ressources essentielles et doit être adapté à votre environnement.
Pourquoi ne pas utiliser Helm
OpenClaw est un conteneur unique accompagné de quelques fichiers de configuration. Les personnalisations pertinentes concernent le contenu de l’agent (fichiers Markdown, Skills, substitutions de configuration), et non la création de modèles d’infrastructure. Kustomize gère les superpositions sans la charge supplémentaire d’un chart Helm. Ajoutez un chart Helm au-dessus de ces manifestes si votre déploiement devient plus complexe.
Prérequis
- Un cluster Kubernetes opérationnel (AKS, EKS, GKE, k3s, kind, OpenShift, etc.)
kubectlconnecté à votre cluster- Une clé d’API pour au moins un fournisseur de modèles
Démarrage rapide
# Remplacez par votre fournisseur : ANTHROPIC, GEMINI, OPENAI ou OPENROUTERexport <PROVIDER>_API_KEY="..."./scripts/k8s/deploy.sh kubectl port-forward svc/openclaw 18789:18789 -n openclawopen http://localhost:18789Par défaut, deploy.sh crée une authentification par jeton. Récupérez le jeton Gateway généré pour l’interface de contrôle :
kubectl get secret openclaw-secrets -n openclaw -o jsonpath='{.data.OPENCLAW_GATEWAY_TOKEN}' | base64 -dPour le débogage local, ./scripts/k8s/deploy.sh --show-token affiche le jeton après le déploiement.
Tests locaux avec Kind
Si vous ne disposez pas d’un cluster, créez-en un localement avec Kind :
./scripts/k8s/create-kind.sh # détecte automatiquement docker ou podman./scripts/k8s/create-kind.sh --delete # supprime le clusterDéployez ensuite normalement avec ./scripts/k8s/deploy.sh.
Étapes détaillées
1) Déployer
Option A : clé d’API dans l’environnement (une seule étape)
# Remplacez par votre fournisseur : ANTHROPIC, GEMINI, OPENAI ou OPENROUTERexport <PROVIDER>_API_KEY="..."./scripts/k8s/deploy.shLe script crée un Secret Kubernetes contenant la clé d’API et un jeton Gateway généré automatiquement, puis effectue le déploiement. Si le Secret existe déjà, il conserve le jeton Gateway actuel ainsi que toutes les clés de fournisseur qui ne sont pas modifiées.
Option B : créer le Secret séparément
export <PROVIDER>_API_KEY="..."./scripts/k8s/deploy.sh --create-secret./scripts/k8s/deploy.shAjoutez --show-token à l’une ou l’autre commande pour afficher le jeton sur la sortie standard lors des tests locaux.
2) Accéder au Gateway
kubectl port-forward svc/openclaw 18789:18789 -n openclawopen http://localhost:18789Ressources déployées
Espace de noms : openclaw (configurable via OPENCLAW_NAMESPACE)├── Deployment/openclaw # Pod unique, conteneur d’initialisation + Gateway├── Service/openclaw # ClusterIP sur le port 18789├── PersistentVolumeClaim # 10 Gio pour l’état et la configuration de l’agent├── ConfigMap/openclaw-config # openclaw.json + AGENTS.md└── Secret/openclaw-secrets # Jeton Gateway + clés d’APIPersonnalisation
Instructions de l’agent
Modifiez le fichier AGENTS.md dans scripts/k8s/manifests/configmap.yaml, puis redéployez :
./scripts/k8s/deploy.shConfiguration du Gateway
Modifiez openclaw.json dans scripts/k8s/manifests/configmap.yaml. Consultez la configuration du Gateway pour obtenir la référence complète.
Ajouter des fournisseurs
Réexécutez le déploiement après avoir exporté les clés supplémentaires :
export ANTHROPIC_API_KEY="..."export OPENAI_API_KEY="..."./scripts/k8s/deploy.sh --create-secret./scripts/k8s/deploy.shLes clés de fournisseur existantes restent dans le Secret, sauf si vous les remplacez.
Vous pouvez également modifier directement le Secret :
kubectl patch secret openclaw-secrets -n openclaw \ -p '{"stringData":{"<PROVIDER>_API_KEY":"..."}}'kubectl rollout restart deployment/openclaw -n openclawEspace de noms personnalisé
OPENCLAW_NAMESPACE=my-namespace ./scripts/k8s/deploy.shImage personnalisée
Modifiez le champ image dans scripts/k8s/manifests/deployment.yaml :
image: ghcr.io/openclaw/openclaw:slim # principale ; miroir Docker Hub officiel : openclaw/openclawExposer le service au-delà de la redirection de port
Les manifestes par défaut lient le Gateway à local loopback dans le pod. Cela fonctionne avec kubectl port-forward, mais pas avec un Service Kubernetes ou un chemin Ingress qui doit accéder directement à l’adresse IP du pod.
Pour exposer le Gateway au moyen d’un Ingress ou d’un équilibreur de charge :
- Dans
scripts/k8s/manifests/configmap.yaml, remplacez la liaison du Gatewayloopbackpar une liaison qui n’utilise pas local loopback et qui correspond à votre modèle de déploiement. - Maintenez l’authentification du Gateway activée et utilisez un point d’entrée approprié avec terminaison TLS.
- Configurez l’interface de contrôle pour l’accès distant à l’aide du modèle de sécurité Web pris en charge (par exemple, HTTPS/Tailscale Serve et des origines autorisées explicites si nécessaire).
Redéployer
./scripts/k8s/deploy.shCette commande applique tous les manifestes et redémarre le pod afin de prendre en compte toute modification de configuration ou de Secret.
Suppression
./scripts/k8s/deploy.sh --deleteCette commande supprime l’espace de noms et toutes les ressources qu’il contient, y compris le PVC.
Remarques sur l’architecture
- Par défaut, le Gateway est lié à local loopback dans le pod ; la configuration fournie est donc destinée à
kubectl port-forward. - Aucune ressource à l’échelle du cluster ; tout se trouve dans un seul espace de noms.
- Renforcement de la sécurité :
readOnlyRootFilesystem, capacitésdrop: ALL, utilisateur non-root (UID 1000). - La configuration par défaut maintient l’interface de contrôle sur la voie d’accès local la plus sûre : liaison local loopback et
kubectl port-forwardvershttp://127.0.0.1:18789. - Si vous étendez l’accès au-delà de localhost, utilisez le modèle distant pris en charge : HTTPS/Tailscale, avec la liaison Gateway et les paramètres d’origine de l’interface de contrôle appropriés.
- Les secrets sont générés dans un répertoire temporaire et appliqués directement au cluster ; aucun contenu secret n’est écrit dans la copie de travail du dépôt.
Structure des fichiers
scripts/k8s/├── deploy.sh # Crée l’espace de noms et le Secret, puis déploie via kustomize├── create-kind.sh # Cluster Kind local (détecte automatiquement docker/podman)└── manifests/ ├── kustomization.yaml # Base Kustomize ├── configmap.yaml # openclaw.json + AGENTS.md ├── deployment.yaml # Spécification du pod avec renforcement de la sécurité ├── pvc.yaml # Stockage persistant de 10 Gio └── service.yaml # ClusterIP sur le port 18789