Ce document explique comment déployer un environnement de développement et utiliser le client Python Agent Sandbox sur un cluster Google Kubernetes Engine (GKE).
Pour obtenir une présentation de la façon dont la fonctionnalité Agent Sandbox isole le code non approuvé généré par l'IA, consultez À propos de GKE Agent Sandbox.
Coûts
Les utilisateurs de GKE peuvent bénéficier sans frais de l'environnement de bac à sable de l'agent. Les tarifs de GKE s'appliquent aux ressources que vous créez.
Avant de commencer
-
Dans la console Google Cloud , sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud .
Rôles requis pour sélectionner ou créer un projet
- Sélectionnez 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 devez disposer du rôle Créateur de projet (
roles/resourcemanager.projectCreator), qui contient l'autorisationresourcemanager.projects.create. Découvrez comment attribuer des rôles.
-
Vérifiez que la facturation est activée pour votre projet Google Cloud .
Activez les API Artifact Registry et Kubernetes Engine.
Rôles requis pour activer les API
Pour activer les API, vous avez besoin du rôle IAM Administrateur Service Usage (
roles/serviceusage.serviceUsageAdmin), qui contient l'autorisationserviceusage.services.enable. Découvrez comment attribuer des rôles.-
Dans la console Google Cloud , activez Cloud Shell.
- Vérifiez que vous disposez des autorisations requises pour suivre les instructions de ce guide.
- Vous devez disposer d'un cluster GKE avec la fonctionnalité Agent Sandbox activée. Si vous n'en avez pas, suivez les instructions de la section Activer Agent Sandbox sur GKE pour créer un cluster ou en mettre à jour un existant.
Rôles requis
Pour obtenir les autorisations nécessaires pour créer et gérer des bacs à sable, demandez à votre administrateur de vous accorder le rôle IAM Administrateur Kubernetes Engine (roles/container.admin) sur votre projet.
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.
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 LOCATION="us-central1"
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 Google Cloud actuel. La définition de cette variable permet de s'assurer que toutes les ressources, comme votre cluster GKE, sont créées dans le bon projet.CLUSTER_NAME: nom de votre cluster GKE, par exempleagent-sandbox-cluster.LOCATION: région ou zone Google Cloud dans laquelle se trouve votre cluster GKE. Définissez cette valeur sur la région (par exemple,us-central1) si vous utilisez un cluster Autopilot, ou sur la zone (par exemple,us-central1-a) si vous utilisez un cluster Standard.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 exemplee2-standard-2. Pour en savoir plus sur les différentes séries de machines et sur le choix entre les différentes options, consultez le Guide des ressources de familles de machines et guide comparatif.
Déployer un environnement bac à sable
Cette section vous explique comment créer le blueprint du 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 votre bac à sable et interagir avec lui 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 de manière programmatique.
Le client utilise un routeur Sandbox 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 qu'elle 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 sandbox cohérents et préconfigurés. La ressource SandboxWarmPool permet de s'assurer 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 liée au lancement d'un bac à sable standard :
Dans Cloud Shell, créez un fichier nommé
sandbox-template-and-pool.yamlet contenant ce qui suit :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 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: 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" limits: cpu: "500m" memory: "1Gi" # Required securityContext: capabilities: drop: ["ALL"] # Required 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-templateAppliquez les fichiers manifestes
SandboxTemplateetSandboxWarmPool:kubectl apply -f sandbox-template-and-pool.yaml
Déployer le routeur de bac à sable
Le client Python que vous utiliserez pour créer des environnements en bac à sable et interagir avec eux utilise un composant appelé routeur de bac à sable pour communiquer avec les bacs à sable.
Pour cet exemple, vous allez utiliser le mode développeur du client pour les tests. 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 Sandbox Router exécuté 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 Sandbox :
Dans Cloud Shell, créez un fichier nommé
sandbox-router.yamlavec 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: 1 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:latest-main 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: "100m" memory: "512Mi" limits: cpu: "1000m" memory: "1Gi" securityContext: runAsUser: 1000 runAsGroup: 1000Appliquez le fichier manifeste pour déployer le routeur sur votre cluster :
kubectl apply -f sandbox-router.yamlVérifiez que le déploiement du routeur Sandbox s'exécute correctement :
kubectl get deployment sandbox-router-deploymentAttendez que le déploiement affiche 2/2 ou 1/1 dans la colonne
READY.
Installer le client Python
Maintenant que les composants du cluster, comme le routeur Sandbox, 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 de manière programmatique. Vous l'utiliserez dans la section suivante pour tester l'environnement :
Créez et activez un environnement virtuel Python :
python3 -m venv .venv source .venv/bin/activateInstallez le package client :
pip install k8s-agent-sandbox
Tester le bac à sable
Maintenant que tous les composants de configuration sont en place, vous pouvez créer un bac à sable et interagir avec lui à l'aide du client Python Agentic Sandbox.
Dans votre répertoire
agent-sandbox, créez un script Python nommétest_sandbox.pyavec le contenu suivant :from k8s_agent_sandbox import SandboxClient from k8s_agent_sandbox.models import SandboxLocalTunnelConnectionConfig # Automatically tunnels to svc/sandbox-router-svc client = SandboxClient( connection_config=SandboxLocalTunnelConnectionConfig() ) sandbox = client.create_sandbox(template="python-runtime-template", namespace="default") try: print(sandbox.commands.run("echo 'Hello from Local!'").stdout) except Exception as e: print(f"An error occurred: {e}")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 de 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é. La méthode sandbox.run() vous permet d'exécuter n'importe quelle commande shell. Le bac à sable de l'agent 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 approuvé. Cela permet à un agent d'IA ou à tout workflow automatisé d'exécuter des tâches de manière sécurisée et fiable.
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 que le bac à sable soit prêt, puis utilise la méthode sandbox.run() pour exécuter les commandes du shell bash dans le conteneur sécurisé. Le client capture et imprime ensuite le stdout de cette commande. La sandbox est automatiquement supprimée après l'exécution du programme.
Lorsqu'une ressource SandboxClaim est créée, un pod disponible est attribué à partir du pool de préchauffage à l'objet bac à sable, et la revendication est marquée comme prête. Le SandboxWarmPool se réapprovisionne ensuite automatiquement pour maintenir le nombre d'instances répliquées configuré.
Pour vérifier si un bac à sable spécifique est revendiqué ou disponible, vérifiez ownerReferences dans les métadonnées du pod de bac à sable. Si la valeur du champ kind est Sandbox, le pod est utilisé. Si la valeur du champ kind est SandboxWarmPool, le pod est inactif et en attente d'être revendiqué.
Exécuter des bacs à sable en production
Dans ce document, vous interagissez avec les bacs à sable en dehors du cluster à l'aide de Cloud Shell. Le client Python utilise vos identifiants utilisateur pour s'authentifier auprès du cluster et gérer les ressources du bac à sable. Il utilise la commande kubectl port-forward pour établir une connexion avec les bacs à sable. Ces étapes conviennent bien aux scénarios de développement.
Dans un scénario de production, une application de contrôleur (comme un orchestrateur d'IA) est chargée de créer et de gérer les ressources du bac à sable. Pour utiliser le bac à sable de l'agent en production, tenez compte des points suivants :
Authentification : votre application de contrôleur doit s'authentifier auprès du serveur d'API du cluster pour exécuter des bacs à sable. La façon dont vous configurez l'authentification dépend de l'emplacement d'exécution de l'application de contrôleur, comme suit :
- Si l'application de contrôleur s'exécute en tant que pod dans le même cluster, utilisez Kubernetes RBAC ou Workload Identity Federation for GKE avec des règles IAM pour accorder au compte de service Kubernetes du pod les autorisations nécessaires pour surveiller les bacs à sable ou découvrir les points de terminaison réseau.
- Si l'application de contrôleur s'exécute en dehors du cluster, utilisez la fédération d'identité de charge de travail ou des comptes de service IAM pour attribuer une identité à l'application que vous pouvez référencer dans les règles d'autorisation.
Routage : les requêtes du client Python dans votre application de contrôleur doivent atteindre le routeur Sandbox de votre cluster. En production, utilisez l'une des méthodes suivantes pour établir une connexion réseau :
- Si l'application de contrôleur s'exécute dans le même cluster, utilisez la fonction
SandboxDirectConnectionConfigpour cibler l'URL et le port utilisés par le service Sandbox Router. - Si l'application de contrôleur s'exécute en dehors du cluster, utilisez l'API GKE Gateway pour créer un équilibreur de charge interne ou externe. Dans votre code client, utilisez la fonction
SandboxGatewayConnectionConfigpour faire référence à votre passerelle.
Pour en savoir plus sur ces méthodes de routage, consultez les exemples d'utilisation sur GitHub et les étapes de déploiement de la passerelle pour le routeur.
- Si l'application de contrôleur s'exécute dans le même cluster, utilisez la fonction
Accès au bac à sable aux ressources Google Cloud : si votre code de bac à sable doit envoyer des requêtes aux API Google Cloud , telles que Cloud Storage, utilisez une stratégie IAM avec Workload Identity Federation for GKE afin d'accorder au compte de service Kubernetes utilisé par le pod de bac à sable les autorisations requises pour cet accès.
Effectuer un nettoyage des ressources
Pour éviter que des frais ne soient facturés sur votre compte Google Cloud , supprimez le cluster GKE que vous avez créé :
gcloud container clusters delete $CLUSTER_NAME --location=$LOCATION --quiet
Étapes suivantes
- Découvrez comment enregistrer et restaurer des environnements de bac à sable d'agent avec des instantanés de pod.
- Pour en savoir plus sur le projet Open Source Agent Sandbox, consultez GitHub.
- Pour comprendre la technologie sous-jacente qui assure l'isolation de sécurité de vos charges de travail, consultez GKE Sandbox.
- Pour en savoir plus sur l'amélioration de la sécurité de vos clusters et de vos charges de travail, consultez la présentation de la sécurité dans GKE.