Cómo desplegar OpenClaw en Kubernetes
Investigadores de seguridad han encontrado más de 135.000 instancias de OpenClaw completamente expuestas en Internet. Muchas de ellas eran vulnerables a ejecución remota de código. La crisis de seguridad de OpenClaw es real: CVE críticos, skills maliciosos y un problema fundamental en la forma en que la mayoría de los despliegues manejan la autenticación. Ejecutar OpenClaw en un VPS con docker run es fácil. Ejecutarlo de forma segura es un problema completamente diferente.
Kubernetes resuelve ese problema. Obtiene aislamiento de red, límites de recursos, reinicios automáticos y configuraciones de seguridad que llevarían horas configurar manualmente. Y con el Operador de Kubernetes de OpenClaw, obtiene todo esto desde un único archivo YAML.
Esta guía le lleva de cero a un agente OpenClaw listo para producción en Kubernetes. Cada bloque YAML está listo para copiar y pegar.
Por qué un operador
Ejecutar OpenClaw en Kubernetes es más que un Deployment y un Service. Necesita aislamiento de red, gestión de Secrets, almacenamiento persistente, monitorización de salud, despliegues de configuración y, opcionalmente, automatización del navegador. Configurar todo esto correctamente a mano es tedioso y propenso a errores.
Un operador de Kubernetes codifica estas necesidades en un único Custom Resource. Usted declara lo que quiere, y el operador lo reconcilia continuamente con los objetos Kubernetes correctos. Eso le proporciona:
- Seguridad por defecto. Cada agente se ejecuta como UID 1000, todas las capabilities de Linux eliminadas, Seccomp habilitado, sistema de archivos root de solo lectura y una NetworkPolicy deny-by-default que solo permite egress de DNS y HTTPS. Sin necesidad de endurecimiento manual.
- Actualizaciones automáticas con rollback. El operador consulta el registro OCI en busca de nuevas versiones, respalda el espacio de trabajo, despliega la actualización y realiza automáticamente un rollback si el nuevo pod no pasa los health checks.
- Despliegues de configuración. Cambie su
spec.config.rawy el operador detecta que el hash del contenido cambió, activando una actualización progresiva. Lo mismo para la rotación de secrets. - Respaldo y restauración. Respaldo automático del espacio de trabajo a almacenamiento compatible con S3 al eliminar una instancia. Restauración en una nueva instancia desde cualquier snapshot.
- Autenticación del gateway. Genera automáticamente un token de gateway por instancia. Sin emparejamiento manual, sin mDNS (que de todas formas no funciona en Kubernetes).
- Detección de deriva. Cada 5 minutos, el operador verifica que cada recurso gestionado coincida con el estado deseado. Si alguien edita manualmente una NetworkPolicy o elimina un PDB, se reconcilia de vuelta.
Prerrequisitos
Necesita:
- Un clúster de Kubernetes (1.28+). Cualquier distribución conforme funciona: EKS, GKE, AKS, k3s o un clúster Kind local para pruebas.
kubectlconfigurado para su clúster.helmv3 instalado.- Una clave API de su proveedor de AI (Anthropic, OpenAI o cualquier endpoint compatible con OpenAI).
Paso 1: Instalar el operador
El operador se distribuye como un chart Helm OCI. Un comando lo instala:
helm install openclaw-operator \
oci://ghcr.io/openclaw-rocks/charts/openclaw-operator \
--namespace openclaw-operator-system \
--create-namespace
Verifique que está en ejecución:
kubectl get pods -n openclaw-operator-system
Debería ver el pod del operador en estado Running. El operador también instala un webhook de validación que previene configuraciones inseguras (como ejecutar como root).
Paso 2: Crear su Secret de clave API
Almacene la clave API de su proveedor de AI en un Secret de Kubernetes. El operador la inyectará en el contenedor del agente:
kubectl create namespace openclaw
kubectl create secret generic openclaw-api-keys \
--namespace openclaw \
--from-literal=ANTHROPIC_API_KEY=sk-ant-your-key-here
Para OpenAI u otros proveedores, use el nombre de variable de entorno apropiado (OPENAI_API_KEY, OPENROUTER_API_KEY, etc.). Puede incluir múltiples proveedores en el mismo Secret.
Consejo: Para producción, considere usar el External Secrets Operator para sincronizar claves desde AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager o Azure Key Vault. La documentación del operador tiene ejemplos detallados.
Paso 3: Desplegar su primer agente
Cree un archivo llamado 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
Aplíquelo:
kubectl apply -f my-agent.yaml
Este único recurso crea un StatefulSet, un Service, un ServiceAccount, un Role, un RoleBinding, una ConfigMap, un PVC, un PDB, una NetworkPolicy y un Secret de token de gateway. El operador reconcilia todo.
Paso 4: Verificar que está en ejecución
Observe cómo arranca la instancia:
kubectl get openclawinstances -n openclaw -w
NAME PHASE READY AGE
my-agent Provisioning False 10s
my-agent Running True 45s
Una vez que la fase muestre Running y Ready sea True, su agente está activo. Revise los logs:
kubectl logs -n openclaw statefulset/my-agent -f
Para interactuar con su agente, haga port-forward del gateway:
kubectl port-forward -n openclaw svc/my-agent 18789:18789
Luego abra http://localhost:18789 en su navegador.
Paso 5: Conectar un canal
OpenClaw soporta Telegram, Discord, WhatsApp, Signal y otros canales de mensajería. Cada canal se configura mediante variables de entorno. Agregue el token correspondiente a su Secret:
kubectl create secret generic openclaw-channel-keys \
--namespace openclaw \
--from-literal=TELEGRAM_BOT_TOKEN=your-bot-token-here
Luego refiéralo en su instancia:
spec:
envFrom:
- secretRef:
name: openclaw-api-keys
- secretRef:
name: openclaw-channel-keys
OpenClaw detecta automáticamente el token y habilita el canal. No se necesita configuración adicional.
Eso cubre lo básico. Su agente está en ejecución, asegurado y accesible. El resto de esta guía cubre funcionalidades opcionales que puede habilitar cuando esté listo.
Automatización del navegador
OpenClaw puede navegar por la web, tomar capturas de pantalla e interactuar con páginas. El operador lo convierte en una adición de una sola línea. Ejecuta un sidecar Chromium endurecido en el mismo pod, conectado a través de localhost:
spec:
chromium:
enabled: true
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
El operador inyecta automáticamente una variable de entorno CHROMIUM_URL en el contenedor principal. El sidecar se ejecuta como UID 1001 con un sistema de archivos root de solo lectura y su propio contexto de seguridad.
Skills y dependencias de ejecución
Los skills de OpenClaw desde ClawHub se pueden instalar de forma declarativa. El operador ejecuta un contenedor de inicialización que descarga cada skill antes de que el agente arranque:
spec:
skills:
- "@anthropic/mcp-server-fetch"
- "@anthropic/mcp-server-filesystem"
Si sus skills o servidores MCP necesitan pnpm o Python, habilite los contenedores de inicialización integrados para dependencias de ejecución:
spec:
runtimeDeps:
pnpm: true # Installs pnpm via corepack
python: true # Installs Python 3.12 + uv
Los contenedores de inicialización instalan estas herramientas en el PVC de datos, por lo que persisten entre reinicios sin inflar la imagen del contenedor.
Actualizaciones automáticas
OpenClaw publica nuevas versiones con frecuencia. El operador puede rastrearlas automáticamente, respaldar antes de actualizar y revertir si algo sale mal:
spec:
autoUpdate:
enabled: true
checkInterval: "12h"
backupBeforeUpdate: true
rollbackOnFailure: true
healthCheckTimeout: "10m"
Cuando aparece una nueva versión en el registro, el operador:
- Crea un respaldo del PVC del espacio de trabajo en almacenamiento compatible con S3
- Actualiza el tag de la imagen en el StatefulSet
- Espera hasta
healthCheckTimeouta que el pod pase las verificaciones de disponibilidad - Si el pod no logra estar ready, restaura el tag de imagen anterior y el respaldo
Después de 3 rollbacks fallidos consecutivos, el operador pausa las actualizaciones automáticas y establece una condición para que pueda investigar.
Nota: La actualización automática no tiene efecto para imágenes fijadas por digest (
spec.image.digest). Si fija por digest, usted controla las actualizaciones manualmente.
Endurecimiento para producción
El operador viene seguro por defecto. Aquí están los controles adicionales para despliegues en producción.
Monitorización con Prometheus
Habilite el ServiceMonitor para recopilar métricas del operador y las instancias:
spec:
observability:
metrics:
enabled: true
serviceMonitor:
enabled: true
interval: "30s"
El operador expone openclaw_reconcile_total, openclaw_reconcile_duration_seconds, openclaw_instance_phase y contadores de actualizaciones automáticas.
Programar en nodos dedicados
Si ejecuta un clúster mixto, use nodeSelector y tolerations para fijar agentes a nodos dedicados:
spec:
availability:
nodeSelector:
openclaw.rocks/nodepool: openclaw
tolerations:
- key: openclaw.rocks/dedicated
value: openclaw
effect: NoSchedule
Agregar reglas de egress personalizadas
La NetworkPolicy por defecto solo permite DNS (puerto 53) y HTTPS (puerto 443). Si su agente necesita alcanzar otros servicios (una base de datos, una cola de mensajes, una API interna), agregue reglas de egress:
spec:
security:
networkPolicy:
additionalEgress:
- to:
- ipBlock:
cidr: 10.0.0.0/8
ports:
- port: 5432
protocol: TCP
Identidad del proveedor cloud
Para AWS IRSA o GCP Workload Identity, anote el ServiceAccount gestionado:
spec:
security:
rbac:
serviceAccountAnnotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789:role/openclaw"
Proxies corporativos y CAs privadas
Si su clúster usa un proxy que intercepta TLS, inyecte un bundle de CA:
spec:
security:
caBundle:
configMapName: corporate-ca-bundle
key: ca-bundle.crt
El operador monta el bundle de CA en todos los contenedores y establece NODE_EXTRA_CA_CERTS automáticamente.
GitOps
El CRD OpenClawInstance es un archivo YAML simple. Eso significa que se integra directamente en un flujo de trabajo GitOps. Almacene sus manifiestos de agentes en un repositorio git y deje que ArgoCD o Flux los sincronicen con su clúster.
Una estructura de repositorio típica:
gitops/
└── agents/
├── kustomization.yaml
├── namespace.yaml
├── agent-a.yaml
└── agent-b.yaml
Cada cambio pasa por un pull request. Su equipo revisa el diff. Merge a main, y ArgoCD lo aplica. Sin kubectl apply desde laptops, sin deriva de configuración, registro de auditoría completo.
El hashing de configuración del operador hace que esto sea especialmente fluido. Cuando ArgoCD sincroniza una spec.config.raw modificada, el operador detecta que el hash del contenido cambió y activa automáticamente una actualización progresiva. Lo mismo para la rotación de secrets: el operador vigila los Secrets referenciados y reinicia pods cuando cambian.
Respaldo y restauración
El operador soporta respaldos compatibles con S3. Cuando elimina una instancia, el operador crea automáticamente un respaldo del PVC del espacio de trabajo antes de la eliminación.
Para restaurar un agente desde un respaldo en una nueva instancia:
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
El operador descarga el snapshot, lo descomprime en el PVC e inicia el agente con todos los datos del espacio de trabajo anterior, skills e historial de conversación intactos.
Inferencia local con Ollama
Si desea que los agentes usen modelos locales (por privacidad, latencia o costo), el operador tiene soporte de primera clase para Ollama. No necesita configurar un sidecar manualmente: spec.ollama gestiona el contenedor, la descarga previa de modelos, el almacenamiento y la asignación de 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
Cuando está habilitado, el operador:
- Agrega un contenedor sidecar Ollama al pod
- Ejecuta un contenedor de inicialización que descarga previamente los modelos listados antes de que el agente arranque
- Inyecta
OLLAMA_HOST=http://localhost:11434en el contenedor principal - Asigna la GPU NVIDIA solicitada a través de límites de recursos
nvidia.com/gpu
Por defecto, los modelos se almacenan en un volumen emptyDir con un límite de tamaño configurable. Para almacenamiento persistente de modelos entre reinicios (para que los modelos no se vuelvan a descargar cada vez), use un PVC existente:
spec:
ollama:
enabled: true
models: ["llama3.2"]
storage:
existingClaim: ollama-models-pvc
Integración con Tailscale
Exponga su agente a su tailnet sin Ingress, load balancers ni IPs públicas. El campo spec.tailscale del operador gestiona la inyección de la clave de autenticación, el enriquecimiento de la configuración y las reglas de NetworkPolicy:
spec:
tailscale:
enabled: true
mode: serve # or "funnel" for public internet access
authKeySecretRef:
name: tailscale-authkey
hostname: my-agent
Cree el Secret de clave de autenticación con una clave efímera y reutilizable desde la consola de administración de Tailscale:
kubectl create secret generic tailscale-authkey \
--namespace openclaw \
--from-literal=authkey=tskey-auth-...
En modo serve (el predeterminado), solo los miembros de su tailnet pueden acceder al agente. En modo funnel, Tailscale lo expone a Internet público con HTTPS automático.
El operador realiza automáticamente las siguientes acciones:
- Inyecta las variables de entorno
TS_AUTHKEYyTS_HOSTNAME - Fusiona
gateway.tailscale.modeygateway.tailscale.resetOnExiten la configuración de OpenClaw - Agrega reglas de egress STUN y WireGuard a la NetworkPolicy
Para inicio de sesión SSO sin contraseña para miembros del tailnet, habilite authSSO:
spec:
tailscale:
enabled: true
mode: serve
authKeySecretRef:
name: tailscale-authkey
authSSO: true
Esto establece gateway.auth.allowTailscale=true en la configuración de OpenClaw, permitiendo a los miembros del tailnet acceder al agente sin un token de gateway separado.
Sidecars y contenedores de inicialización personalizados
Para casos de uso más allá del soporte integrado de Ollama y Tailscale, el operador acepta sidecars y contenedores de inicialización arbitrarios. Ejecute un Cloud SQL Proxy para acceso a base de datos, un reenviador de logs o cualquier otro auxiliar junto a su agente:
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
Los contenedores de inicialización personalizados se ejecutan después del pipeline de inicialización del operador (seeding de configuración, 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
Modo de fusión de configuración
Por defecto, el operador sobrescribe el archivo de configuración en cada reinicio de pod. Si su agente modifica su propia configuración en tiempo de ejecución (a través de skills o automodificación), establezca mergeMode: merge para fusionar en profundidad la configuración del operador con la configuración PVC existente:
spec:
config:
mergeMode: merge
raw:
agents:
defaults:
model:
primary: "anthropic/claude-sonnet-4-20250514"
En modo fusión, las claves especificadas por el operador tienen prioridad, pero las claves que el agente agregó por su cuenta sobreviven a los reinicios.
El ejemplo completo
Aquí tiene un manifiesto listo para producción que combina todo lo presentado en esta guía:
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
Aplíquelo, y tendrá un agente AI endurecido, con actualizaciones automáticas, capacidad de navegación, inferencia local, acceso tailnet, monitorización, respaldo y aislamiento de red. Un solo kubectl apply.
Lo que obtiene de serie
Sin tocar una sola configuración de seguridad, cada agente desplegado por el operador incluye:
- Ejecución no root (UID 1000)
- Sistema de archivos root de solo lectura
- Todas las capabilities de Linux eliminadas
- Perfil Seccomp RuntimeDefault
- NetworkPolicy deny-by-default (solo egress DNS + HTTPS)
- ServiceAccount por instancia sin montaje automático de token
- PodDisruptionBudget
- Sondas de liveness, readiness y startup
- Token de autenticación de gateway generado automáticamente
- Reconciliación de deriva cada 5 minutos
Un webhook de validación bloquea intentos de ejecutar como root y advierte sobre NetworkPolicies deshabilitadas, falta de TLS en Ingress y claves de proveedor AI no detectadas.
Próximos pasos
- Explore la referencia API completa para cada campo del CRD
- Lea las guías de despliegue para EKS, GKE, AKS y Kind
- Configure cadenas de fallback de modelos a través de múltiples proveedores AI
- Configure External Secrets para Vault, AWS, GCP o Azure
Si encuentra problemas o tiene comentarios, abra una issue en GitHub. Los PRs también son bienvenidos.
Si no desea operar Kubernetes usted mismo, OpenClaw.rocks se encarga de todo por usted. Elija un plan, conecte un canal, y su agente estará activo en segundos.