Isoler l'exécution du code d'IA avec Agent Sandbox

Ce document fournit des instructions pour installer et exécuter le contrôleur Agent Sandbox sur un cluster Google Kubernetes Engine (GKE). Il explique également comment déployer un environnement en bac à sable sur le cluster dans lequel vous pouvez tester des commandes shell non fiables.

Le contrôleur Agent Sandbox fournit un framework pour créer et gérer des environnements d'exécution éphémères. Cette approche vous permet de définir un modèle pour l'environnement de votre application, puis de créer des instances à la demande.

Agent Sandbox fournit un environnement sécurisé et isolé pour exécuter du code non fiable, tel que du code généré par de grands modèles de langage (LLM). L'exécution de ce type de code directement dans un cluster présente des risques de sécurité, car le code non fiable peut potentiellement accéder à d'autres applications ou au nœud de cluster sous-jacent lui-même, ou interférer avec eux.

Agent Sandbox atténue ces risques en fournissant une isolation forte des processus, du stockage et du réseau pour le code qu'il exécute. Cette isolation est obtenue à l'aide de gVisor, une technologie qui crée une barrière sécurisée entre l'application et le système d'exploitation du nœud de cluster. D'autres technologies de bac à sable, par exemple les conteneurs Kata, peuvent être utilisées à la place. Toutefois, l'exemple de ce document n'utilise que gVisor.

Ce document fournit des instructions pour exécuter Agent Sandbox sur un cluster GKE Autopilot ou Standard.

Agent Sandbox est un projet Open Source. Pour en savoir plus sur la contribution au projet ou pour obtenir des informations techniques plus détaillées, consultez le projet Open Source Agent Sandbox.

Coûts

Les étapes décrites dans ce document entraînent des frais sur votre Google Cloud compte. Les coûts commencent lorsque vous créez un cluster GKE. Ces coûts incluent les frais par cluster pour GKE, comme indiqué sur la page Tarifs, et les frais d'exécution des VM Compute Engine.

Pour éviter des frais inutiles, assurez-vous de désactiver GKE ou de supprimer le projet une fois que vous avez terminé de suivre ce document.

Avant de commencer

  1. Dans la Google Cloud console, sur la page de sélection du projet, sélectionnez ou créez un Google Cloud projet.

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionner un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous avez besoin du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.

    Accéder au sélecteur de projet

  2. Vérifiez que la facturation est activée pour votre Google Cloud projet.

  3. Activez les API Artifact Registry et Google Kubernetes Engine.

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin du rôle IAM Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin), qui contient l'autorisation serviceusage.services.enable. Découvrez comment attribuer des rôles.

    Activer les API

  4. Dans la Google Cloud console, activez Cloud Shell.

    Activer Cloud Shell

Définir des variables d'environnement

Pour simplifier les commandes que vous exécutez dans ce document, vous pouvez définir des variables d'environnement dans Cloud Shell. Dans Cloud Shell, définissez les variables d'environnement utiles suivantes en exécutant les commandes suivantes :

export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME="agent-sandbox-cluster"
export GKE_LOCATION="us-central1"
export AGENT_SANDBOX_VERSION="v0.1.0"
export NODE_POOL_NAME="agent-sandbox-node-pool"
export MACHINE_TYPE="e2-standard-2"

Voici une explication de ces variables d'environnement :

  • PROJECT_ID : ID de votre projet actuel. Google Cloud La définition de cette variable permet de s'assurer que toutes les ressources, comme votre cluster GKE, sont créées dans le projet approprié.
  • CLUSTER_NAME: nom de votre cluster GKE, par exemple agent-sandbox-cluster.
  • GKE_LOCATION : région dans laquelle votre cluster GKE et votre dépôt Artifact Registry seront créés, par exemple us-central1. Google Cloud Nous vous recommandons de les colocaliser, car cela réduit la latence d'extraction des images.
  • AGENT_SANDBOX_VERSION: version du contrôleur Agent Sandbox à déployer sur votre cluster.
  • NODE_POOL_NAME: nom du pool de nœuds qui exécutera les charges de travail en bac à sable, par exemple agent-sandbox-node-pool.
  • MACHINE_TYPE: type de machine des nœuds de votre pool de nœuds, par exemple e2-standard-2. Pour en savoir plus sur les différentes séries de machines et sur le choix entre différentes options, consultez le Guide des ressources de familles de machines et guide comparatif.

Déployer Agent Sandbox

Maintenant que votre Google Cloud projet et votre environnement Cloud Shell sont configurés, vous êtes prêt à provisionner l'infrastructure nécessaire et à déployer Agent Sandbox.

Créer un cluster GKE

Vous allez maintenant créer un cluster GKE avec gVisor activé. Ce cluster fournit l'environnement Kubernetes dans lequel vous allez déployer et exécuter le contrôleur Agent Sandbox et l'exemple d'application en bac à sable. gVisor fournit la technologie de bac à sable pour exécuter du code non fiable en toute sécurité.

Vous pouvez créer un cluster Autopilot ou Standard. Autopilot active gVisor automatiquement, tandis que les clusters Standard vous obligent à créer manuellement un pool de nœuds compatible avec gVisor :

Autopilot

Pour créer un cluster Autopilot à l'aide de gcloud CLI, exécutez la commande suivante :

gcloud container clusters create-auto ${CLUSTER_NAME} \
    --location=${GKE_LOCATION} \
    --project=${PROJECT_ID}

Standard

Pour créer un cluster Standard à l'aide de gcloud CLI, procédez comme suit :

  1. Créez le cluster :

    gcloud container clusters create ${CLUSTER_NAME} \
        --location=${GKE_LOCATION}
    
  2. Créez un pool de nœuds distinct avec gVisor activé :

    gcloud container node-pools create ${NODE_POOL_NAME} \
      --cluster=${CLUSTER_NAME} \
      --location=${GKE_LOCATION} \
      --machine-type=${MACHINE_TYPE} \
      --image-type=cos_containerd \
      --sandbox type=gvisor
    

Récupérez les identifiants du cluster afin que l'CLI kubectl puisse se connecter au cluster. Cette commande met à jour votre fichier de configuration Kubernetes, qui est stocké par défaut dans le répertoire ~/.kube/config. Ce fichier de configuration contient les identifiants dont kubectl a besoin pour interagir avec votre cluster GKE :

gcloud container clusters get-credentials ${CLUSTER_NAME} \
    --location=${GKE_LOCATION}

Déployer le contrôleur Agent Sandbox sur votre cluster

Vous pouvez déployer le contrôleur Agent Sandbox et ses composants requis en appliquant les fichiers manifestes de la version officielle à votre cluster. Ces fichiers manifestes sont des fichiers de configuration qui demandent à Kubernetes de télécharger tous les composants nécessaires au déploiement et à l'exécution du contrôleur Agent Sandbox sur votre cluster.

Exécutez les commandes suivantes pour déployer le contrôleur Agent Sandbox sur votre cluster GKE :

kubectl apply \
-f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/manifest.yaml \
-f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/extensions.yaml

Vérifier le contrôleur Agent Sandbox

Après avoir appliqué les fichiers manifestes, vérifiez que le pod du contrôleur Agent Sandbox s'exécute correctement dans l'espace de noms agent-sandbox-system :

kubectl get pods -n agent-sandbox-system

Attendez que le pod affiche "Running" dans la colonne STATUS et "1/1" dans la colonne READY. Lorsque le pod s'exécute correctement, la sortie ressemble à ceci :

NAME                         READY   STATUS    RESTARTS   AGE
agent-sandbox-controller-0   1/1     Running   0          44d

Maintenant que le contrôleur Agent Sandbox est en cours d'exécution, il peut créer et gérer automatiquement des environnements en bac à sable pour toutes les ressources Sandbox que vous créez dans votre cluster.

Déployer un environnement en bac à sable

Maintenant que le contrôleur Agent Sandbox est en cours d'exécution dans votre cluster GKE, vous devez déployer les composants de l'exemple d'environnement en bac à sable. Cette section vous explique comment créer le plan de bac à sable (SandboxTemplate), déployer le routeur réseau nécessaire et installer le client Python que vous utiliserez pour interagir avec le bac à sable.

La méthode recommandée pour créer et interagir avec votre bac à sable consiste à utiliser le client Python Agentic Sandbox. Ce client fournit une interface qui simplifie l'ensemble du cycle de vie d'un bac à sable, de la création au nettoyage. Il s'agit d'une bibliothèque Python que vous pouvez utiliser pour créer, utiliser et supprimer des bacs à sable par programmation.

Le client utilise un routeur de bac à sable comme point d'entrée central pour tout le trafic. Dans l'exemple décrit dans ce document, le client crée un tunnel vers ce routeur à l'aide de la commande kubectl port-forward, de sorte que vous n'avez pas besoin d'exposer d'adresses IP publiques. Sachez que l'utilisation de kubectl port-forward n'est pas une solution sécurisée et que son utilisation doit être limitée aux environnements de développement.

Créer un SandboxTemplate et un SandboxWarmPool

Vous allez maintenant définir la configuration de votre bac à sable en créant une ressource SandboxTemplate et une ressource SandboxWarmPool. SandboxTemplate sert de plan réutilisable que le contrôleur Agent Sandbox utilise pour créer des environnements en bac à sable cohérents et préconfigurés. La ressource SandboxWarmPool garantit qu'un nombre spécifié de pods pré-chauffés sont toujours en cours d'exécution et prêts à être revendiqués. Un bac à sable pré-chauffé est un pod en cours d'exécution qui est déjà initialisé. Cette pré-initialisation permet de créer de nouveaux bacs à sable en moins d'une seconde et évite la latence de démarrage du lancement d'un bac à sable normal :

  1. Dans Cloud Shell, créez un fichier nommé sandbox-template-and-pool.yaml avec le contenu suivant :

    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxTemplate
    metadata:
      name: python-runtime-template
      namespace: default
    spec:
      podTemplate:
        metadata:
          labels:
            sandbox: python-sandbox-example
        spec:
          runtimeClassName: gvisor
          containers:
          - name: python-runtime
            image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0
            ports:
            - containerPort: 8888
            readinessProbe:
              httpGet:
                path: "/"
                port: 8888
              initialDelaySeconds: 0
              periodSeconds: 1
            resources:
              requests:
                cpu: "250m"
                memory: "512Mi"
                ephemeral-storage: "512Mi"
          restartPolicy: "OnFailure"
    ---
    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    kind: SandboxWarmPool
    metadata:
      name: python-sandbox-warmpool
      namespace: default
    spec:
      replicas: 2
      sandboxTemplateRef:
        name: python-runtime-template
    
  2. Appliquez le fichier manifeste SandboxTemplate et SandboxWarmPool :

    kubectl apply -f sandbox-template-and-pool.yaml
    

Déployer le routeur de bac à sable

Le client Python que vous utiliserez pour créer et interagir avec des environnements en bac à sable utilise un composant appelé routeur de bac à sable pour communiquer avec les bacs à sable.

Pour cet exemple, vous utilisez le mode développeur du client à des fins de test. Ce mode est destiné au développement local et utilise la commande kubectl port-forward pour établir un tunnel direct entre votre machine locale et le service de routeur de bac à sable en cours d'exécution dans le cluster. Cette approche de tunneling évite d'avoir besoin d'une adresse IP publique ou d'une configuration d'entrée complexe, et simplifie l'interaction avec les bacs à sable depuis votre environnement local.

Pour déployer le routeur de bac à sable, procédez comme suit :

  1. Dans Cloud Shell, créez un fichier nommé sandbox-router.yaml avec le contenu suivant :

    # A ClusterIP Service to provide a stable endpoint for the router pods.
    apiVersion: v1
    kind: Service
    metadata:
      name: sandbox-router-svc
      namespace: default
    spec:
      type: ClusterIP
      selector:
        app: sandbox-router
      ports:
      - name: http
        protocol: TCP
        port: 8080 # The port the service will listen on
        targetPort: 8080 # The port the router container listens on (from the sandbox_router/Dockerfile)
    ---
    # The Deployment to manage and run the router pods.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sandbox-router-deployment
      namespace: default
    spec:
      replicas: 2 # Run at least two replicas for high availability
      selector:
        matchLabels:
          app: sandbox-router
      template:
        metadata:
          labels:
            app: sandbox-router
        spec:
          # Ensure pods are spread across different zones for HA
          topologySpreadConstraints:
            - maxSkew: 1
              topologyKey: topology.kubernetes.io/zone
              whenUnsatisfiable: ScheduleAnyway
              labelSelector:
                matchLabels:
                  app: sandbox-router
          containers:
          - name: router
            image: us-central1-docker.pkg.dev/k8s-staging-images/agent-sandbox/sandbox-router:v20251124-v0.1.0-10-ge26ddb2
            ports:
            - containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
              initialDelaySeconds: 5
              periodSeconds: 5
            livenessProbe:
              httpGet:
                path: /healthz
                port: 8080
              initialDelaySeconds: 10
              periodSeconds: 10
            resources:
              requests:
                cpu: "250m"
                memory: "512Mi"
              limits:
                cpu: "1000m"
                memory: "1Gi"
          securityContext:
            runAsUser: 1000
            runAsGroup: 1000
    
  2. Appliquez le fichier manifeste pour déployer le routeur sur votre cluster :

    kubectl apply -f sandbox-router.yaml
    

Installer le client Python

Maintenant que les composants du cluster, tels que le routeur de bac à sable, sont déployés, la dernière étape préparatoire consiste à installer le client Python Agentic Sandbox sur votre machine locale. Rappelons que ce client est une bibliothèque Python qui vous permet de créer, d'utiliser et de supprimer des bacs à sable par programmation. Vous l'utiliserez dans la section suivante pour tester l'environnement :

  1. Créez et activez un environnement virtuel Python :

    python3 -m venv .venv
    source .venv/bin/activate
    
  2. Installez le package client :

    pip install k8s_agent_sandbox
    

Tester le bac à sable

Une fois tous les composants de configuration en place, vous pouvez créer un bac à sable et interagir avec lui à l'aide du client Python Agentic Sandbox.

  1. Dans votre répertoire agent-sandbox, créez un script Python nommé test_sandbox.py avec le contenu suivant :

    from agentic_sandbox import SandboxClient
    
    # Automatically tunnels to svc/sandbox-router-svc
    with SandboxClient(
        template_name="python-runtime-template",
        namespace="default"
    ) as sandbox:
        print(sandbox.run("echo 'Hello from the sandboxed environment!'").stdout
    )
    
  2. Depuis votre terminal (avec l'environnement virtuel toujours actif), exécutez le script de test :

    python3 test_sandbox.py
    

Le message "Hello from the sandboxed environment!" (Bonjour depuis l'environnement en bac à sable !) doit s'afficher. Il s'agit de la sortie du bac à sable.

Félicitations ! Vous avez exécuté une commande shell dans un bac à sable sécurisé. À l'aide de la méthode sandbox.run(), vous pouvez exécuter n'importe quelle commande shell. Agent Sandbox exécute la commande dans une barrière sécurisée qui protège les nœuds de votre cluster et les autres charges de travail du code non fiable. Cela fournit un moyen sûr et fiable pour un agent d'IA ou tout workflow automatisé d'exécuter des tâches.

Lorsque vous exécutez le script, SandboxClient gère toutes les étapes pour vous. Il crée la ressource SandboxClaim pour démarrer le bac à sable, attend qu'il soit prêt, puis utilise la méthode sandbox.run() pour exécuter des commandes shell bash dans le conteneur sécurisé. Le client capture et imprime ensuite le stdout de cette commande. Le bac à sable est automatiquement supprimé après l'exécution du programme.

Lorsqu'une ressource SandboxClaim est créée, un pod disponible est attribué de le pool chaud à l'objet Sandbox, et la revendication est marquée comme prête. Le SandboxWarmPool se remplit ensuite automatiquement pour maintenir le nombre de répliques configuré.

Pour vérifier si un bac à sable spécifique est revendiqué ou disponible, vérifiez les ownerReferences dans les métadonnées du pod de bac à sable. Si la valeur du champ kind est Sandbox, le pod est en cours d'utilisation. Si la valeur du champ kind est SandboxWarmPool, le pod est inactif et en attente d'être revendiqué.

Effectuer un nettoyage des ressources

Pour éviter que des frais ne soient facturés sur votre Google Cloud compte, vous devez supprimer le cluster GKE que vous avez créé :

gcloud container clusters delete $CLUSTER_NAME --location=$GKE_LOCATION --quiet

Étape suivante