En este documento, se proporcionan implementaciones de referencia para administrar el almacenamiento de las zonas de pruebas del agente adaptadas a las necesidades del ciclo de vida de datos de tus agentes.
Según las necesidades del ciclo de vida de datos de tus agentes, elige una de las siguientes configuraciones:
- Configura un lugar de trabajo con estado
- Configura una restauración de un momento determinado y una transferencia de propiedad
- Configura un lugar de trabajo efímero
Para obtener más información sobre cómo elegir una solución de almacenamiento, consulta Elige el almacenamiento para las cargas de trabajo de agentes de IA.
En el siguiente documento, se usa la StorageClass dynamic-rwo para la selección
automática del tipo de disco
para aprovisionar discos compatibles con los tipos de máquinas de los nodos en los que se programan los
pods de la zona de pruebas del agente. Para asegurarte de que GKE aprovisione
volúmenes de Hyperdisk Balanced para el almacenamiento de tus agentes, debes
programar las zonas de pruebas del agente en los nodos de familias de máquinas
compatibles, como
N4. De lo contrario, GKE recurre a pd-balanced.
En este documento, se implementa el modo de acceso a los datos Lugar de trabajo aislado privado mediante el acceso ReadWriteOnce (RWO). En este modo, un agente se inicia con un directorio de almacenamiento aislado privado al que tiene acceso exclusivo de lectura y escritura.
A menos que se especifique lo contrario, las implementaciones de referencia de este documento usan la creación directa de la zona de pruebas, que se aplica a los agentes que toleran la latencia de inicio de varios segundos. Para lograr una latencia de inicio inferior a un segundo para los lugares de trabajo con estado o de restauración de un momento determinado, debes usar los grupos de nodos en espera de la zona de pruebas del agente de GKE. Para vincular el almacenamiento a un pod de grupo de nodos en espera reclamado, se requieren secuencias de comandos personalizadas y un DaemonSet con privilegios. Para obtener una implementación de referencia, consulta este ejemplo de GitHub.
Modos de acceso alternativos
Para admitir modos de acceso alternativos, puedes modificar las definiciones de volumen y de instantánea en las configuraciones:
- Lugar de trabajo colaborativo: cambia
accessModesaReadWriteManyy usa una StorageClass compatible con RWX, como Filestore Multishares (Enterprise) (enterprise-multishare-rwx). - Lugar de trabajo de bifurcación de exploración: Activa la carpeta de la
plantilla como de solo lectura y proporciona un bloc de notas borrador escribible independiente.
Para la plantilla base, debes usar almacenamiento que admita varios archivos adjuntos de solo lectura, como Hyperdisk ML con
ReadOnlyMany(ROX) modo de acceso o Filestore Multishares con el modo de acceso RWX.
Antes de comenzar
Habilita la zona de pruebas del agente en tu clúster.
Configura un lugar de trabajo con estado
Usa este patrón para conservar el estado más reciente de los archivos de un agente. Es útil cuando tu agente debe conservar el estado cuando se pausa o finaliza la sesión del agente (se borra la zona de pruebas del agente) y restablecer los datos del estado más reciente cuando se activa la sesión del agente (se vuelve a crear la zona de pruebas del agente).
La implementación de referencia de esta sección usa la creación directa de la zona de pruebas y se aplica a los agentes que toleran la latencia de inicio de varios segundos.
Este enfoque usa recursos estándar de PersistentVolumeClaim (PVC) de GKE para vincular una zona de pruebas a una PVC preexistente que contiene los datos de un usuario.
El patrón de lugar de trabajo con estado sigue esta secuencia de eventos:
- Aprovisionamiento: El administrador o el orquestador aprovisionan de forma manual una
PVC privada para cada sesión del agente con un identificador determinista (por ejemplo,
pvc-agent-1). - Referencia: En el recurso de la zona de pruebas, usas el
persistentVolumeClaimcampo dentro delvolumesbloque para especificar el exactoclaimNamedel volumen existente. - Latencia: Cuando se crea la zona de pruebas, GKE debe adjuntar de forma dinámica el disco de Compute Engine a la VM del nodo, lo que genera una demora estándar de varios segundos.
- Persistencia: Cuando finaliza la sesión (se borra la zona de pruebas), GKE desconecta el disco, pero no destruye la PVC, lo que ayuda a garantizar que se conserve el estado más reciente para la próxima sesión.
Para configurar un lugar de trabajo con estado que conserve los datos entre sesiones, completa los pasos de las siguientes subsecciones.
Aprovisiona un lugar de trabajo persistente (PVC)
Crea una PersistentVolumeClaim (PVC) privada que use un identificador determinista, como pvc-agent-1.
Guarda el siguiente manifiesto como
pvc-agent-1.yaml:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-agent-1 # Derived directly from the deterministic assignment ID namespace: default spec: accessModes: - ReadWriteOnce storageClassName: dynamic-rwo # Selects disk type compatible with the node machine family resources: requests: storage: 10GiAplica el manifiesto
kubectl apply -f pvc-agent-1.yaml
Debido a que la clase de almacenamiento usa la vinculación de volumen dinámico, el disco aún no está conectado a ningún nodo. Permanece en estado Pending hasta que se programe un pod que lo solicite.
Implementa la zona de pruebas del agente
Implementa el recurso personalizado de la zona de pruebas, haciendo referencia a la PVC determinista.
Guarda el siguiente manifiesto como
sandbox-agent-1.yaml:apiVersion: agents.x-k8s.io/v1alpha1 kind: Sandbox metadata: name: sandbox-agent-1 # Traceable sandbox name namespace: default spec: replicas: 1 podTemplate: spec: runtimeClassName: gvisor # Required automountServiceAccountToken: false # Required securityContext: runAsNonRoot: true # Required runAsUser: 1000 fsGroup: 1000 # Grant group access to the volume nodeSelector: sandbox.gke.io/runtime: gvisor # Required tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" # Required containers: - name: agent image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0 ports: - containerPort: 8888 volumeMounts: - name: workspace-disk mountPath: /workspace # Mounts the private disk into the container resources: limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required volumes: - name: workspace-disk persistentVolumeClaim: claimName: pvc-agent-1 # Binds this specific Sandbox to Agent 1's PVC restartPolicy: OnFailureAplica el manifiesto
kubectl apply -f sandbox-agent-1.yaml
GKE verifica la capacidad del nodo y conecta el disco, lo que tarda unos segundos. El contenedor se inicializa dentro de un kernel de gVisor del espacio de usuario.
Escribe datos del agente
Simula un agente de IA activo que ejecuta modificaciones de archivos dentro de su lugar de trabajo escribiendo un archivo de texto en el disco activado.
# Set the active Pod name
POD_NAME=sandbox-agent-1
# Write a state file to the persistent directory
kubectl exec $POD_NAME -- sh -c "echo 'Workspace State Saved - Agent 1' > /workspace/modified_data.txt"
# Confirm the file exists on the disk
kubectl exec $POD_NAME -- cat /workspace/modified_data.txt
Finaliza la sesión del agente
Para simular la reducción o la finalización de la sesión cuando el agente está inactivo, borra el recurso de la zona de pruebas, pero conserva el almacenamiento subyacente.
kubectl delete sandbox sandbox-agent-1
GKE desactiva y desconecta el disco. La PVC pvc-agent-1 permanece y conserva los datos.
Reactiva la sesión del agente
Para reactivar la sesión, vuelve a implementar un recurso de zona de pruebas nuevo que haga referencia a la misma PVC.
kubectl apply -f sandbox-agent-1.yaml
El disco se vuelve a conectar (lo que genera la demora de conexión) y se inicia el contenedor.
Verifica la conservación de datos
Inspecciona el contenedor de la zona de pruebas recién creado para verificar que se conserven los datos de la sesión anterior.
# Set the active Pod name of the new session
NEW_POD_NAME=sandbox-agent-1
# Read the file from the newly booted sandbox
kubectl exec -it $NEW_POD_NAME -- cat /workspace/modified_data.txt
El resultado debería mostrar Workspace State Saved - Agent 1.
Limpia los recursos
Borra la zona de pruebas del agente y la reclamación de volumen persistente asociada:
kubectl delete sandbox sandbox-agent-1
kubectl delete pvc pvc-agent-1
Configura una restauración de un momento determinado y una transferencia de propiedad
Usa este patrón para clonar conjuntos de datos para ejecutar experimentos paralelos, depurar o trabajar de forma independiente. El lugar de trabajo de un agente se inicializa a partir de un conjunto de datos histórico (o estado compartido), lo que guarda las modificaciones posteriores en una capa escribible privada independiente sin modificar la plantilla base.
La implementación de referencia de esta sección usa la creación directa de la zona de pruebas y se aplica a los agentes que toleran la latencia de inicio de varios segundos. Este enfoque se basa en el orquestador para aprovisionar de forma dinámica PersistentVolumeClaims (PVCs) nuevas a partir de VolumeSnapshots históricas antes de iniciar una sesión de zona de pruebas nueva.
Crea la VolumeSnapshotClass
Crea una VolumeSnapshotClass que especifique el controlador CSI y la política de eliminación.
Para Hyperdisk, usa el controlador pd.csi.storage.gke.io.
Guarda el siguiente manifiesto como
1-snapshot-class.yaml:apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: standard-rwo-snapshot driver: pd.csi.storage.gke.io deletionPolicy: DeleteAplica el manifiesto
kubectl apply -f 1-snapshot-class.yaml
Aprovisiona el lugar de trabajo inicial
Crea un volumen en el que el agente realizará su trabajo inicial.
Guarda el siguiente manifiesto como
2-source-pvc.yaml:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: agent-source-pvc spec: accessModes: ["ReadWriteOnce"] storageClassName: dynamic-rwo resources: requests: storage: 10GiAplica el manifiesto
kubectl apply -f 2-source-pvc.yaml
Genera datos de estado
Implementa un pod de zona de pruebas para escribir datos en el volumen.
Guarda el siguiente manifiesto como
3-source-sandbox.yaml:apiVersion: agents.x-k8s.io/v1alpha1 kind: Sandbox metadata: name: agent-session-v1 namespace: default spec: replicas: 1 podTemplate: spec: runtimeClassName: gvisor automountServiceAccountToken: false # Required securityContext: runAsNonRoot: true # Required runAsUser: 1000 fsGroup: 1000 # Grant group access to the volume nodeSelector: sandbox.gke.io/runtime: gvisor # Required tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" # Required containers: - name: agent image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0 ports: - containerPort: 8888 volumeMounts: - name: workspace mountPath: /workspace resources: limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required volumes: - name: workspace persistentVolumeClaim: claimName: agent-source-pvc restartPolicy: OnFailureAplica el manifiesto
kubectl apply -f 3-source-sandbox.yamlEspera a que el pod esté en ejecución y, luego, escribe un archivo de estado:
POD_NAME=agent-session-v1 kubectl exec $POD_NAME -- sh -c "echo 'Point-in-Time Snapshot - v1' > /workspace/state.txt"
Archiva el estado histórico (VolumeSnapshot de CSI)
Activa un VolumeSnapshot de CSI para inmovilizar el estado actual. Cuando tomes una instantánea, sigue las prácticas recomendadas para las instantáneas de discos.
Guarda el siguiente manifiesto como
4-volume-snapshot.yaml:apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: agent-session-v1-snapshot spec: volumeSnapshotClassName: standard-rwo-snapshot source: persistentVolumeClaimName: agent-source-pvcAplica el manifiesto
kubectl apply -f 4-volume-snapshot.yaml
Restablece el volumen a partir de la instantánea
Implementa una PVC nueva con su dataSource que apunte a la VolumeSnapshot de CSI.
Guarda el siguiente manifiesto como
5-restored-pvc.yaml:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: agent-restored-pvc spec: accessModes: ["ReadWriteOnce"] storageClassName: dynamic-rwo dataSource: name: agent-session-v1-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io resources: requests: storage: 10GiAplica el manifiesto
kubectl apply -f 5-restored-pvc.yaml
Inicia la sesión de la zona de pruebas del agente restablecida
Aprovisiona un recurso de zona de pruebas nuevo que haga referencia a la PVC recién restablecida.
Guarda el siguiente manifiesto como
6-restored-sandbox.yaml:apiVersion: agents.x-k8s.io/v1alpha1 kind: Sandbox metadata: name: agent-session-v2-restored namespace: default spec: replicas: 1 podTemplate: spec: runtimeClassName: gvisor automountServiceAccountToken: false # Required securityContext: runAsNonRoot: true # Required runAsUser: 1000 fsGroup: 1000 # Grant group access to the volume nodeSelector: sandbox.gke.io/runtime: gvisor # Required tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" # Required containers: - name: agent image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0 ports: - containerPort: 8888 volumeMounts: - name: workspace mountPath: /workspace resources: limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required volumes: - name: workspace persistentVolumeClaim: claimName: agent-restored-pvc restartPolicy: OnFailureAplica el manifiesto
kubectl apply -f 6-restored-sandbox.yaml
Verifica la persistencia y el restablecimiento
Verifica que el agente pueda leer los datos históricos.
NEW_POD_NAME=agent-session-v2-restored
kubectl exec $NEW_POD_NAME -- cat /workspace/state.txt
Resultado esperado: Point-in-Time Snapshot - v1
Limpia los recursos
Borra las zonas de pruebas del agente, las PVCs y la VolumeSnapshot:
kubectl delete sandbox agent-session-v1
kubectl delete sandbox agent-session-v2-restored
kubectl delete pvc agent-source-pvc
kubectl delete pvc agent-restored-pvc
kubectl delete volumesnapshot agent-session-v1-snapshot
kubectl delete volumesnapshotclass standard-rwo-snapshot
Configura un lugar de trabajo efímero
Usa el patrón de lugar de trabajo efímero cuando un agente necesita un volumen de almacenamiento para almacenar archivos temporales mientras está activo. No es necesario conservar datos cuando se borra la zona de pruebas del agente.
Configura con inicio inferior a un segundo
Usa los grupos de nodos en espera de la zona de pruebas del agente para aprovisionar previamente volúmenes vacíos en segundo plano.
Define la SandboxTemplate
Define el almacenamiento efímero de respaldo dentro del bloque volumeClaimTemplate.
Guarda el siguiente manifiesto como
stateless-template.yaml:apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxTemplate metadata: name: stateless-sandbox-template namespace: default spec: podTemplate: spec: runtimeClassName: gvisor automountServiceAccountToken: false securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 1000 # Grant group access to the volume nodeSelector: sandbox.gke.io/runtime: gvisor tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" containers: - name: agent image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0 ports: - containerPort: 8888 volumeMounts: - name: ephemeral-disk mountPath: /workspace resources: limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required volumeClaimTemplates: - metadata: name: ephemeral-disk spec: accessModes: ["ReadWriteOnce"] storageClassName: dynamic-rwo # Selects disk type compatible with node machine family resources: requests: storage: 10Gi
Inicia el grupo de nodos en espera de la zona de pruebas
Guarda el siguiente manifiesto como
stateless-warmpool.yaml:apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxWarmPool metadata: name: stateless-warmpool namespace: default spec: replicas: 5 # Keep five standby Pods with pre-attached empty disks sandboxTemplateRef: name: stateless-sandbox-templateAplica ambos manifiestos:
kubectl apply -f stateless-template.yaml kubectl apply -f stateless-warmpool.yaml
Reclama la zona de pruebas
Define una SandboxClaim que se active cuando un usuario inicia una sesión.
Guarda el siguiente manifiesto como
stateless-sandbox-claim.yaml:apiVersion: extensions.agents.x-k8s.io/v1alpha1 kind: SandboxClaim metadata: name: agent-1-claim spec: sandboxTemplateRef: name: stateless-sandbox-templateAplica el manifiesto
kubectl apply -f stateless-sandbox-claim.yaml
Verifica la ejecución inferior a un segundo
Captura el nombre del pod de la zona de pruebas del agente y verifica que el directorio /workspace esté activado y listo para usarse de inmediato:
export POD_NAME=$(kubectl get sandboxclaim agent-1-claim -o jsonpath='{.status.sandbox.name}')
kubectl exec $POD_NAME -- ls -la /workspace
Finaliza la sesión del agente
Para finalizar la sesión del agente y liberar la zona de pruebas reclamada, borra el recurso SandboxClaim:
kubectl delete sandboxclaim agent-1-claim
Limpia los recursos
Borra el grupo de nodos en espera de la zona de pruebas y la plantilla de la zona de pruebas:
kubectl delete sandboxwarmpool stateless-warmpool
kubectl delete sandboxtemplate stateless-sandbox-template
Configura con inicio de varios segundos
Para implementar un lugar de trabajo efímero que tolere la latencia de varios segundos, usa la creación directa de la zona de pruebas del agente sin un grupo de nodos en espera.
Define una zona de pruebas del agente sin estado
Guarda el siguiente manifiesto como
sandbox-direct-stateless.yaml:apiVersion: agents.x-k8s.io/v1alpha1 kind: Sandbox metadata: name: sandbox-direct-stateless namespace: default spec: replicas: 1 podTemplate: spec: runtimeClassName: gvisor automountServiceAccountToken: false securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 1000 # Grant group access to the volume nodeSelector: sandbox.gke.io/runtime: gvisor tolerations: - key: "sandbox.gke.io/runtime" value: "gvisor" effect: "NoSchedule" containers: - name: agent image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0 ports: - containerPort: 8888 volumeMounts: - name: ephemeral-disk mountPath: /workspace resources: limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required restartPolicy: OnFailure volumeClaimTemplates: - metadata: name: ephemeral-disk spec: accessModes: ["ReadWriteOnce"] storageClassName: dynamic-rwo resources: requests: storage: 10Gi
Implementa la zona de pruebas del agente
Para aprovisionar el disco de forma dinámica y conectarlo al nodo programado, aplica el manifiesto:
kubectl apply -f sandbox-direct-stateless.yaml
Verifica la latencia de inicio y la ejecución
Supervisa el estado del pod para observar la demora de conexión antes de que el pod pase al estado Running:
kubectl get pods -w
Después de que el pod esté en ejecución, captura el nombre del pod y verifica que el directorio /workspace esté disponible:
POD_NAME=sandbox-direct-stateless
kubectl exec $POD_NAME -- ls -la /workspace
Finaliza la sesión del agente
Borra el recurso de la zona de pruebas para finalizar automáticamente el pod y destruir su almacenamiento efímero:
kubectl delete sandbox sandbox-direct-stateless
¿Qué sigue?
- Obtén más información sobre la zona de pruebas del agente de GKE.
- Obtén más información sobre el aislamiento de la ejecución de código de IA con la zona de pruebas del agente.
- Obtén información para guardar y restablecer entornos de la zona de pruebas del agente con instantáneas de pods.