En este documento, se explica cómo habilitar la función Agent Sandbox en un clúster de Google Kubernetes Engine (GKE). También se explica cómo crear un entorno de zona de pruebas en el clúster para ejecutar código no confiable de forma segura.
Para obtener una descripción general de cómo la función Agent Sandbox aísla el código no confiable generado por IA, consulta Acerca de GKE Agent Sandbox.
Costos
Agent Sandbox se ofrece sin cargo adicional en GKE. Los precios de GKE se aplican a los recursos que creas.
Para evitar cargos innecesarios, asegúrate de inhabilitar GKE o borrar el proyecto después de completar este documento.
Antes de comenzar
-
En la consola de Google Cloud , en la página del selector de proyectos, selecciona o crea un proyecto de Google Cloud .
Roles necesarios para seleccionar o crear un proyecto
- Selecciona un proyecto: Para seleccionar un proyecto, no se requiere un rol de IAM específico. Puedes seleccionar cualquier proyecto en el que se te haya otorgado un rol.
-
Crea un proyecto: Para crear un proyecto, necesitas el rol de Creador de proyectos
(
roles/resourcemanager.projectCreator), que contiene el permisoresourcemanager.projects.create. Obtén más información para otorgar roles.
-
Verifica que la facturación esté habilitada para tu proyecto de Google Cloud .
Habilita las APIs de Artifact Registry y Google Kubernetes Engine si aún no están habilitadas.
Roles necesarios para habilitar las APIs
Para habilitar APIs, necesitas el permiso
serviceusage.services.enable. Si creaste el proyecto, es probable que ya tengas este permiso a través del rol de propietario (roles/owner). De lo contrario, puedes obtener este permiso a través del rol de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin). Obtén más información para otorgar roles.-
En la consola de Google Cloud , activa Cloud Shell.
- Asegúrate de que tu clúster ejecute la versión 1.36.3-gke.1767000 o posterior de GKE (admite la API de
v1beta1).
Define las variables de entorno
Para simplificar los comandos que ejecutas en este documento, puedes configurar variables de entorno en Cloud Shell. En Cloud Shell, define las siguientes variables de entorno útiles ejecutando los siguientes comandos:
export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME="agent-sandbox-cluster"
export LOCATION="us-central1"
export CLUSTER_VERSION="1.36.3-gke.1767000"
export NODE_POOL_NAME="agent-sandbox-pool"
export MACHINE_TYPE="e2-standard-2"
A continuación, se explica cada una de estas variables de entorno:
PROJECT_ID: Es el ID de tu proyecto de Google Cloud actual. Definir esta variable ayuda a garantizar que todos los recursos, como tu clúster de GKE, se creen en el proyecto correcto.CLUSTER_NAME: Es el nombre de tu clúster de GKE, por ejemplo,agent-sandbox-cluster.LOCATION: Es la región o zona de Google Cloud en la que se crea tu clúster de GKE. Establece este parámetro en la región (por ejemplo,us-central1) si creas un clúster de Autopilot o en la zona (por ejemplo,us-central1-a) si creas un clúster estándar.CLUSTER_VERSION: Es la versión de GKE que ejecutará tu clúster (1.36.3-gke.1767000o posterior).NODE_POOL_NAME: Es el nombre del grupo de nodos que ejecutará cargas de trabajo en zona de pruebas, por ejemplo,agent-sandbox-pool. Esta variable solo es necesaria si creas un clúster de GKE Standard.MACHINE_TYPE: el tipo de máquina de los nodos del grupo de nodos, por ejemplo,e2-standard-2. Para obtener detalles sobre las diferentes series de máquinas y elegir entre las distintas opciones, consulta la Guía de comparación y recursos de familias de máquinas. Esta variable solo es obligatoria si creas un clúster de GKE Estándar.
Habilita Agent Sandbox
Puedes habilitar la función Agent Sandbox cuando creas un clúster nuevo o cuando actualizas uno existente.
Habilita Agent Sandbox cuando crees un clúster de GKE nuevo
Te recomendamos que uses un clúster de Autopilot para una experiencia de Kubernetes completamente administrada. Para elegir el modo de operación de GKE que se adapte mejor a tus cargas de trabajo, consulta Elige un modo de operación de GKE.
Autopilot
Para crear un clúster de GKE Autopilot nuevo con Agent
Sandbox habilitado, incluye la marca --enable-agent-sandbox:
gcloud beta container clusters create-auto ${CLUSTER_NAME} \
--location=${LOCATION} \
--cluster-version=${CLUSTER_VERSION} \
--enable-agent-sandbox
En el caso de un clúster de Autopilot, asegúrate de que la variable de entorno LOCATION esté configurada en una región (por ejemplo, us-central1).
Estándar
Para crear un clúster de GKE Standard nuevo con Agent Sandbox habilitado, debes crear el clúster, agregar un grupo de nodos con gVisor habilitado y, luego, habilitar la función de Agent Sandbox. Para ahorrar costos, te recomendamos que crees un clúster zonal con un solo nodo por grupo:
Crea el clúster:
gcloud beta container clusters create ${CLUSTER_NAME} \ --location=${LOCATION} \ --num-nodes=1 \ --cluster-version=${CLUSTER_VERSION}Para este clúster de Standard, asegúrate de que la variable de entorno
LOCATIONesté configurada en una zona (por ejemplo,us-central1-a).Crea un grupo de nodos independiente con gVisor habilitado:
gcloud container node-pools create ${NODE_POOL_NAME} \ --cluster=${CLUSTER_NAME} \ --machine-type=${MACHINE_TYPE} \ --location=${LOCATION} \ --num-nodes=1 \ --image-type=cos_containerd \ --sandbox=type=gvisorEl valor de
LOCATIONdebe ser la misma zona que usaste cuando creaste el clúster.Actualiza el clúster para habilitar la función de Agent Sandbox:
gcloud beta container clusters update ${CLUSTER_NAME} \ --location=${LOCATION} \ --enable-agent-sandbox
Habilita Agent Sandbox cuando actualices un clúster de GKE existente
Para habilitar Agent Sandbox en un clúster existente, este debe ejecutar la versión
1.36.3-gke.1767000 o una posterior, que admite la API de v1beta1.
Asegúrate de que la variable de entorno LOCATION esté configurada en la región o zona donde se encuentra tu clúster existente.
Si usas un clúster de GKE Standard, Agent Sandbox depende de gVisor. Si tu clúster estándar no tiene un grupo de nodos habilitado para gVisor, primero debes crear uno:
gcloud container node-pools create ${NODE_POOL_NAME} \ --cluster=${CLUSTER_NAME} \ --machine-type=${MACHINE_TYPE} \ --location=${LOCATION} \ --image-type=cos_containerd \ --sandbox=type=gvisorActualiza el clúster para habilitar la función de Agent Sandbox:
gcloud beta container clusters update ${CLUSTER_NAME} \ --location=${LOCATION} \ --enable-agent-sandbox
Verifica la configuración
Para verificar si la función Agent Sandbox está habilitada, inspecciona la descripción del clúster.
gcloud beta container clusters describe ${CLUSTER_NAME} \
--location=${LOCATION} \
--format="value(addonsConfig.agentSandboxConfig.enabled)"
Si creaste un clúster de Autopilot, la ubicación es la región (por ejemplo, us-central1). Si creaste un clúster de Standard, la ubicación es la zona (por ejemplo, us-central1-a).
Si la función se habilita correctamente, el comando devuelve True.
Requisitos de implementación de la zona de pruebas del agente
Para implementar correctamente una carga de trabajo, como Sandbox o SandboxTemplate, tu manifiesto YAML debe incluir parámetros de configuración y seguridad específicos.
GKE aplica estos requisitos con una política de admisión de validación (VAP). Si no se cumplen estos requisitos, el controlador de admisión rechaza la implementación.
Configuración obligatoria
Tu manifiesto de implementación debe incluir los siguientes parámetros de configuración:
runtimeClassName: gvisor: Garantiza que el Pod se ejecute en una zona de pruebas de gVisor.automountServiceAccountToken: false: evita que el Pod active automáticamente el token de la cuenta de servicio predeterminada.securityContext.runAsNonRoot: true: Garantiza que el contenedor no se ejecute como usuario raíz.securityContext.capabilities.drop: ["ALL"]: Descarta todas las capacidades de Linux del contenedor.resources.limits: Debes especificar los límites de CPU y memoria para evitar posibles situaciones de denegación del servicio (DoS).nodeSelector: Debe segmentarse parasandbox.gke.io/runtime: gvisor.tolerations: Debe incluir una tolerancia para el taintsandbox.gke.io/runtime=gvisor:NoSchedule.
Configuración prohibida
Tu manifiesto de implementación no debe incluir ninguno de los siguientes elementos:
hostNetwork: true,hostPID: trueohostIPC: trueprivileged: trueen contextos de seguridad de contenedores.HostPathde volúmenes.- Se agregaron capacidades (
capabilities.add). - Configuración de
hostPort. - Sysctls personalizados
- Volúmenes proyectados para tokens o certificados de cuentas de servicio.
Implementa un entorno de zona de pruebas
Recomendamos implementar un entorno de zona de pruebas definiendo un SandboxTemplate y manteniendo listas las instancias precalentadas con un SandboxWarmPool. Luego, puedes solicitar una instancia de este grupo de nodos preparado con un SandboxClaim. Como alternativa, puedes crear una zona de pruebas directamente, pero este enfoque no admite grupos de preparación.
SandboxTemplate, SandboxWarmPool, SandboxClaim y Sandbox son recursos personalizados de Kubernetes.
Recomendado: Crea una SandboxTemplate y un SandboxWarmPool
SandboxTemplate actúa como un esquema reutilizable. SandboxWarmPool ayuda a garantizar que una cantidad especificada de Pods preparados previamente siempre se ejecute y esté lista para reclamarse. El uso de este recurso personalizado minimiza la latencia de inicio.
Para implementar un entorno de zona de pruebas creando SandboxTemplate y SandboxWarmPool, completa los siguientes pasos:
En Cloud Shell, crea un archivo llamado
sandbox-template.yamlcon el siguiente contenido:apiVersion: extensions.agents.x-k8s.io/v1beta1 kind: SandboxTemplate metadata: name: python-runtime-template namespace: default spec: podTemplate: metadata: labels: sandbox-type: python-runtime spec: runtimeClassName: gvisor # Required automountServiceAccountToken: false # Required securityContext: runAsNonRoot: true # Required nodeSelector: sandbox.gke.io/runtime: gvisor # Required tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" # Required containers: - name: runtime image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0 ports: - containerPort: 8888 resources: requests: cpu: "250m" memory: "512Mi" limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required restartPolicy: OnFailureAplica el manifiesto
SandboxTemplate:kubectl apply -f sandbox-template.yamlCrea un archivo llamado
sandbox-warmpool.yamlcon el siguiente contenido:apiVersion: extensions.agents.x-k8s.io/v1beta1 kind: SandboxWarmPool metadata: name: python-runtime-warmpool namespace: default labels: app: python-runtime-warmpool spec: replicas: 2 sandboxTemplateRef: # This must match the name of the SandboxTemplate. name: python-runtime-templateAplica el manifiesto
SandboxWarmPool:kubectl apply -f sandbox-warmpool.yaml
Crea un SandboxClaim
SandboxClaim solicita una zona de pruebas del grupo de preparación. Como creaste un grupo de nodos en espera, el Sandbox creado adopta un Pod en ejecución del grupo en lugar de iniciar un Pod nuevo.
Para solicitar un entorno de pruebas de la reserva activa creando un SandboxClaim, completa los siguientes pasos:
Crea un archivo llamado
sandbox-claim.yamlcon el siguiente contenido:apiVersion: extensions.agents.x-k8s.io/v1beta1 kind: SandboxClaim metadata: name: sandbox-claim namespace: default spec: warmPoolRef: # This must match the name of the SandboxWarmPool. name: python-runtime-warmpoolAplica el manifiesto
SandboxClaim:kubectl apply -f sandbox-claim.yamlVerifica que el entorno de pruebas, el reclamo y el grupo de instancias en espera estén listos:
kubectl get sandboxwarmpool,sandboxclaim,sandbox,pod
Alternativa: Crea una zona de pruebas directamente
Si no necesitas los tiempos de inicio rápidos que proporcionan los grupos de instancias activas, puedes implementar una zona de pruebas directamente sin usar plantillas.
Para implementar un entorno de zona de pruebas creando una zona de pruebas directamente, completa los siguientes pasos:
Crea un archivo llamado
sandbox.yamlcon el siguiente contenido:apiVersion: agents.x-k8s.io/v1beta1 kind: Sandbox metadata: name: sandbox-example-2 spec: replicas: 1 podTemplate: metadata: labels: sandbox: sandbox-example spec: runtimeClassName: gvisor restartPolicy: OnFailure automountServiceAccountToken: false # Required securityContext: runAsNonRoot: true # Required runAsUser: 1000 # Required if image defaults to root (e.g. busybox) nodeSelector: sandbox.gke.io/runtime: gvisor tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" # Required containers: - name: my-container image: busybox command: ["/bin/sh", "-c"] args: ["sleep 3600000; echo 'Container finished successfully'; exit 0"] securityContext: capabilities: drop: ["ALL"] # Required allowPrivilegeEscalation: false resources: limits: cpu: "100m" memory: "128Mi" # RequiredAplica el manifiesto
Sandbox:kubectl apply -f sandbox.yamlVerifica que el entorno de pruebas se esté ejecutando:
kubectl get sandbox
Migra la zona de pruebas del agente de v1alpha1 a v1beta1
Si tu clúster se implementó con una versión anterior de Agent Sandbox usando recursos personalizados de v1alpha1, puedes actualizar a la versión 1.36.3-gke.1767000 de GKE o una posterior con un tiempo de inactividad de la carga de trabajo casi nulo.
Nota: Este procedimiento de migración se aplica a los clústeres que usan la función administrada de GKE Agent Sandbox (
--enable-agent-sandbox). Si implementaste Agent Sandbox con manifiestos de código abierto, consulta la guía de migración upstream.
Principales diferencias entre las APIs de v1alpha1 y v1beta1
| Concepto | Comportamiento de v1alpha1 |
Comportamiento de v1beta1 |
Impacto de la migración |
|---|---|---|---|
| Destinos de SandboxClaim | Se permite la referencia directa a SandboxTemplate sin un grupo de instancias en espera (inicio en frío). |
Requiere una referencia a un SandboxWarmPool (spec.warmPoolRef.name). |
Los reclamos de inicio en frío se deben asignar a un grupo preparado secundario (replicas: 0). |
| Modo de operación de la zona de pruebas | Se infiere a partir de los campos de réplicas o de estado. | Valor explícito para el campo spec.operatingMode (como Running o Suspended) |
El webhook de conversión asigna y establece automáticamente este campo. |
| Versión de almacenamiento de CustomResourceDefinition | v1alpha1 almacenado en etcd (storage: true). |
v1beta1 almacenado en etcd (storage: true). |
El webhook se convierte de forma dinámica; el paso posterior a la actualización vuelve a conservar los objetos de etcd. |
| Webhook de conversión | Ninguno | Activo en /convert (puerto 9447) |
Es una conversión bidireccional entre v1alpha1 y v1beta1. |
Migra con la herramienta de migración
Para crear automáticamente grupos de preparación de sombra y volver a conservar el almacenamiento persistente, usa la secuencia de comandos de migración canónica del repositorio de Agent Sandbox.
Descarga y prepara la secuencia de comandos:
curl -LO https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/v0.5.6/helm/files/migrate.sh
chmod +x migrate.sh
Manual de ejecución de la migración paso a paso
Para migrar un clúster existente con un tiempo de inactividad de la carga de trabajo casi nulo, completa las siguientes tres fases en orden:
Fase 1: Fase de arranque previa a la actualización
Crea una copia de seguridad de los recursos existentes: Guarda una copia de seguridad en formato YAML de los recursos declarativos de Agent Sandbox (
sandboxtemplates,sandboxwarmpoolsysandboxclaims):kubectl get sandboxtemplates,sandboxwarmpools,sandboxclaims \ --all-namespaces -o yaml > agent-sandbox-v1alpha1-backup.yamlVerifica el cumplimiento de la seguridad de la plantilla: Asegúrate de que los recursos
SandboxTemplateexistentes cumplan con los requisitos de implementación de Agent Sandbox. Durante la migración del almacenamiento en la fase 3, el controlador de admisión rechaza las actualizaciones de las plantillas que no cumplen con estas políticas de seguridad.Obtén una vista previa de los grupos de sombra que se crearán:
./migrate.sh --phase=bootstrap --dry-runEjecuta la fase de arranque:
./migrate.sh --phase=bootstrapVerifica los grupos de servidores de respaldo creados:
kubectl get sandboxwarmpools --all-namespaces \ -o custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name,REPLICAS:.spec.replicas,SHADOW:.metadata.annotations.agents\.x-k8s\.io/migration-shadow"
Fase 2: Actualiza el plano de control de GKE
Actualiza el plano de control de GKE a la versión 1.36.3-gke.1767000 o posterior:
gcloud container clusters upgrade ${CLUSTER_NAME} \
--location=${LOCATION} \
--master \
--cluster-version=1.36.3-gke.1767000
Durante el lanzamiento del plano de control, ten en cuenta lo siguiente:
- Los Pods no se reinician ni tienen tiempo de inactividad.
- El nuevo controlador y el extremo del webhook
/convertse implementan en el plano de control.
Fase 3: Migración del almacenamiento posterior a la actualización
Una vez que se complete la actualización del plano de control, actualiza tus credenciales y vuelve a escribir los objetos etcd almacenados ejecutando la fase de migración del almacenamiento:
./migrate.sh --phase=migrate
Lista de tareas de verificación posterior a la migración
| Marcar elemento | Comando | Resultado esperado |
|---|---|---|
| Versiones de almacenamiento de CustomResourceDefinition | kubectl get crd sandboxes.agents.x-k8s.io sandboxclaims.extensions.agents.x-k8s.io sandboxtemplates.extensions.agents.x-k8s.io sandboxwarmpools.extensions.agents.x-k8s.io -o jsonpath='{range .items[*]}{.metadata.name}{": storedVersions="}{.status.storedVersions}{"\n"}{end}' |
Se muestran los 4 CustomResourceDefinitions:storedVersions=["v1beta1"] |
| Continuidad del grupo de anuncios | kubectl get pods -n default -o wide |
Status: 1/1 RunningRestarts: 0(se aplica a los clústeres con zonas de pruebas en ejecución activas) |
| Vinculación de reclamos | kubectl get sandboxclaims -n default -o yaml |
spec.warmPoolRef.name: shadow-pool-...status.conditions: Ready=True (requiere que la plantilla cumpla con los requisitos de admisión) |
| Compatibilidad con v1alpha1 | kubectl get sandboxes.v1alpha1.agents.x-k8s.io |
Muestra una advertencia de baja y devuelve el recurso |
| CRUD nativo de v1beta1 | kubectl apply -f sandbox-claim.yaml |
Se aplica con 0 advertencias |
Si un CustomResourceDefinition sigue mostrando ["v1alpha1", "v1beta1"] en .status.storedVersions después de que se complete la fase de migración, se trata del comportamiento esperado de Kubernetes.
La secuencia de comandos de migración reescribe todos los registros existentes en v1beta1 en etcd, pero
Kubernetes no quita automáticamente las versiones obsoletas de la
lista status.storedVersions.
Después de confirmar que se migraron todos los recursos, puedes, de manera opcional, quitar v1alpha1 de las versiones almacenadas:
for crd in \
sandboxes.agents.x-k8s.io \
sandboxclaims.extensions.agents.x-k8s.io \
sandboxtemplates.extensions.agents.x-k8s.io \
sandboxwarmpools.extensions.agents.x-k8s.io; do
kubectl patch crd "${crd}" --subresource=status --type=merge \
-p '{"status":{"storedVersions":["v1beta1"]}}'
done
Soluciona problemas de migración
Si tienes problemas después de actualizar el plano de control o ejecutar la migración de almacenamiento, resuélvelos en lugar de intentar cambiar a una versión anterior del plano de control:
El reclamo está atascado en
WarmPoolNotFound:Si se actualizó un reclamo de
v1alpha1inicio en frío sin ejecutar./migrate.sh --phase=bootstrap, crea manualmente el grupo semicaliente de sombra faltante:apiVersion: extensions.agents.x-k8s.io/v1beta1 kind: SandboxWarmPool metadata: name: shadow-pool-TEMPLATE_NAME namespace: NAMESPACE annotations: agents.x-k8s.io/migration-shadow: "true" spec: replicas: 0 sandboxTemplateRef: name: TEMPLATE_NAMESi una reclamación nombró un grupo de preparación específico que ya no existe, crea el recurso
SandboxWarmPoolfaltante con ese nombre o actualizaspec.warmPoolRef.nameen la reclamación para hacer referencia a un grupo de preparación existente.
Condición del reclamo
Ready=False: Ejecutakubectl describe sandboxclaimpara inspeccionar los eventos del reclamo. Asegúrate de que elSandboxTemplateal que se hace referencia cumpla con todos los requisitos de implementación de la zona de pruebas del agente y vuelve a aplicar la plantilla si es necesario.Errores de conversión o del controlador: Ejecuta
kubectl get leases -n gke-managed-agentsandboxpara verificar que el arrendamiento de la elección del líder del plano de control esté activo. Si los problemas persisten, comunícate con Atención al cliente de Cloud.
Inhabilitar la zona de pruebas del agente
Para inhabilitar la función de zona de pruebas del agente, usa el
comando gcloud beta container clusters update con la
marca --no-enable-agent-sandbox.
gcloud beta container clusters update ${CLUSTER_NAME} \
--location=${LOCATION} \
--no-enable-agent-sandbox
Si creaste un clúster de Autopilot, la ubicación es la región (por ejemplo, us-central1). Si creaste un clúster estándar, la ubicación es la zona (por ejemplo, us-central1-a).
Limpia los recursos
Para evitar que se apliquen cargos a tu cuenta de Google Cloud , borra el clúster de GKE que creaste.
gcloud container clusters delete $CLUSTER_NAME \
--location=${LOCATION} \
--quiet
Si creaste un clúster de Autopilot, la ubicación es la región (por ejemplo, us-central1). Si creaste un clúster estándar, la ubicación es la zona (por ejemplo, us-central1-a).
¿Qué sigue?
- Obtén más información para guardar y restablecer entornos de Agent Sandbox con instantáneas de Pods.
- Obtén información sobre la tecnología subyacente que usa la zona de pruebas de agentes.
- Obtén más información sobre la seguridad de GKE.
- Explora el proyecto de código abierto de Agent Sandbox en GitHub.
- Obtén más información para usar Kata Containers de código abierto con Agent Sandbox. Kata Containers no es un Google Cloud producto. Si instalas y usas este software, eres responsable de la administración y la solución de problemas. La asistencia y los ANS de Google no se aplican a los Kata Containers.