Déploiement des agents ADK sur Google Kubernetes Engine (GKE)

1. Introduction

Présentation

Cet atelier comble le fossé essentiel entre le développement d'un système multi-agent puissant et son déploiement pour un cas d'utilisation concret. Bien que la création d'agents en local soit un bon point de départ, les applications de production nécessitent une plate-forme évolutive, fiable et sécurisée.

Dans cet atelier, vous allez prendre un système multi-agents créé avec le Google Agent Development Kit (ADK) et le déployer dans un environnement de production sur Google Kubernetes Engine (GKE).

Agent de l'équipe de conception de films

L'application exemple utilisée dans cet atelier est une "équipe de conception de films" composée de plusieurs agents collaboratifs : un chercheur, un scénariste et un rédacteur de fichiers. Ces agents travaillent ensemble pour aider un utilisateur à réfléchir et à élaborer un pitch de film sur une figure historique.

diagramme du flux d'agent

Pourquoi déployer sur GKE ?

Pour préparer votre agent aux exigences d'un environnement de production, vous avez besoin d'une plate-forme conçue pour l'évolutivité, la sécurité et la rentabilité. Google Kubernetes Engine (GKE) fournit cette base puissante et flexible pour exécuter votre application conteneurisée.

Cela présente plusieurs avantages pour votre charge de travail de production :

  • Scaling et performances automatiques : gérez le trafic imprévisible avec l'autoscaler horizontal de pods (HPA), qui ajoute ou supprime automatiquement des répliques d'agents en fonction de la charge. Pour les charges de travail d'IA plus exigeantes, vous pouvez associer des accélérateurs matériels tels que des GPU et des TPU.
  • Gestion économique des ressources : optimisez les coûts avec GKE Autopilot, qui gère automatiquement l'infrastructure sous-jacente pour que vous ne payiez que les ressources demandées par votre application.
  • Sécurité et observabilité intégrées : connectez-vous de manière sécurisée à d'autres services Google Cloud à l'aide de Workload Identity, ce qui vous évite d'avoir à gérer et stocker les clés de compte de service. Tous les journaux d'application sont automatiquement diffusés dans Cloud Logging pour une surveillance et un débogage centralisés.
  • Contrôle et portabilité : évitez la dépendance vis-à-vis d'un fournisseur grâce à Kubernetes Open Source. Votre application est portable et peut s'exécuter sur n'importe quel cluster Kubernetes, sur site ou dans d'autres clouds.

Points abordés

Dans cet atelier, vous allez apprendre à effectuer les tâches suivantes :

  • Provisionnez un cluster GKE Autopilot.
  • Conteneurisez une application avec un Dockerfile et transférez l'image vers Artifact Registry.
  • Connectez votre application de manière sécurisée aux API Google Cloud à l'aide de Workload Identity.
  • Écrivez et appliquez des fichiers manifestes Kubernetes pour un déploiement et un service.
  • Exposez une application sur Internet avec un LoadBalancer.
  • Configurez l'autoscaling avec un HorizontalPodAutoscaler (HPA).

2. Configuration du projet

Compte Google

Si vous ne possédez pas encore de compte Google personnel, vous devez en créer un.

Utilisez un compte personnel au lieu d'un compte professionnel ou scolaire.

Se connecter à la console Google Cloud

Connectez-vous à la console Google Cloud à l'aide d'un compte Google personnel.

Activer la facturation

Configurer un compte de facturation personnel

Si vous avez configuré la facturation à l'aide de crédits Google Cloud, vous pouvez ignorer cette étape.

Pour configurer un compte de facturation personnel, cliquez ici pour activer la facturation dans la console Cloud.

Remarques :

  • L'exécution de cet atelier devrait coûter moins de 1 USD en ressources Cloud.
  • Vous pouvez suivre les étapes à la fin de cet atelier pour supprimer les ressources et éviter ainsi que des frais supplémentaires ne vous soient facturés.
  • Les nouveaux utilisateurs peuvent bénéficier d'un essai sans frais pour un crédit de 300$.

Créer un projet (facultatif)

Si vous n'avez pas de projet que vous souhaitez utiliser pour cet atelier, créez-en un.

3. Ouvrir l'éditeur Cloud Shell

  1. Cliquez sur ce lien pour accéder directement à l'éditeur Cloud Shell.
  2. Si vous êtes invité à autoriser l'accès à un moment donné, cliquez sur Autoriser pour continuer.Cliquez pour autoriser Cloud Shell.
  3. Si le terminal ne s'affiche pas en bas de l'écran, ouvrez-le :
    • Cliquez sur Afficher.
    • Cliquez sur TerminalOuvrir un nouveau terminal dans l'éditeur Cloud Shell.
  4. Dans le terminal, définissez votre projet à l'aide de la commande suivante :
    gcloud config set project [PROJECT_ID]
    
    • Exemple :
      gcloud config set project lab-project-id-example
      
    • Si vous ne vous souvenez pas de l'ID de votre projet, vous pouvez lister tous vos ID de projet avec la commande suivante :
      gcloud projects list
      
      Définir l'ID du projet dans le terminal de l'éditeur Cloud Shell
  5. Le message suivant doit s'afficher :
    Updated property [core/project].
    

4. Activer les API

Pour utiliser GKE, Artifact Registry, Cloud Build et Vertex AI, vous devez activer leurs API respectives dans votre projet Google Cloud.

  • Dans le terminal, activez les API :
    gcloud services enable \
      container.googleapis.com \
      artifactregistry.googleapis.com \
      cloudbuild.googleapis.com \
      aiplatform.googleapis.com
    
    Une fois l'exécution terminée, un résultat semblable à celui-ci devrait s'afficher :
    Operation "operations/acf.p2-176675280136-b03ab5e4-3483-4ebf-9655-43dc3b345c63" finished successfully.
    

Présentation des API

  • L'API Google Kubernetes Engine (container.googleapis.com) vous permet de créer et de gérer le cluster GKE qui exécute votre agent. GKE fournit un environnement géré pour déployer, gérer et faire évoluer vos applications conteneurisées à l'aide de l'infrastructure Google.
  • L'API Artifact Registry (artifactregistry.googleapis.com) fournit un dépôt sécurisé et privé pour stocker l'image de conteneur de votre agent. Il s'agit de l'évolution de Container Registry, qui s'intègre parfaitement à GKE et Cloud Build.
  • L'API Cloud Build (cloudbuild.googleapis.com) est utilisée par la commande gcloud builds submit pour créer votre image de conteneur dans le cloud à partir de votre fichier Dockerfile. Il s'agit d'une plate-forme CI/CD sans serveur qui exécute vos compilations sur l'infrastructure Google Cloud.
  • L'API Vertex AI (aiplatform.googleapis.com) permet à votre agent déployé de communiquer avec les modèles Gemini pour effectuer ses tâches principales. Elle fournit l'API unifiée pour tous les services d'IA de Google Cloud.

5. Préparer votre environnement de développement

Créer la structure de répertoires

  1. Dans le terminal, créez le répertoire du projet et les sous-répertoires nécessaires :
    mkdir -p ~/adk_multiagent_system_gke/workflow_agents
    cd ~/adk_multiagent_system_gke
    
  2. Dans le terminal, exécutez la commande suivante pour ouvrir le répertoire dans l'explorateur de l'éditeur Cloud Shell.
    cloudshell open-workspace ~/adk_multiagent_systems
    
  3. Le panneau de l'explorateur à gauche s'actualise. Vous devriez maintenant voir les répertoires que vous avez créés.
    Capture d'écran de la structure de fichier actuelle
     À mesure que vous créerez des fichiers au cours des étapes suivantes, ils s'afficheront dans ce répertoire.

Créer des fichiers de démarrage

Vous allez maintenant créer les fichiers de démarrage nécessaires pour l'application.

  1. Créez callback_logging.py en exécutant la commande suivante dans le terminal. Ce fichier gère la journalisation pour l'observabilité.
    cat <<EOF > ~/adk_multiagent_systems/callback_logging.py
    """
    Provides helper functions for observability. Handles formatting and sending 
    agent queries, responses, and tool calls to Google Cloud Logging to aid 
    in monitoring and debugging.
    """
    import logging
    import google.cloud.logging
    
    from google.adk.agents.callback_context import CallbackContext
    from google.adk.models import LlmResponse, LlmRequest
    
    
    def log_query_to_model(callback_context: CallbackContext, llm_request: LlmRequest):
        cloud_logging_client = google.cloud.logging.Client()
        cloud_logging_client.setup_logging()
        if llm_request.contents and llm_request.contents[-1].role == 'user':
             if llm_request.contents[-1].parts and "text" in llm_request.contents[-1].parts:
                last_user_message = llm_request.contents[-1].parts[0].text
                logging.info(f"[query to {callback_context.agent_name}]: " + last_user_message)
    
    def log_model_response(callback_context: CallbackContext, llm_response: LlmResponse):
        cloud_logging_client = google.cloud.logging.Client()
        cloud_logging_client.setup_logging()
        if llm_response.content and llm_response.content.parts:
            for part in llm_response.content.parts:
                if part.text:
                    logging.info(f"[response from {callback_context.agent_name}]: " + part.text)
                elif part.function_call:
                    logging.info(f"[function call from {callback_context.agent_name}]: " + part.function_call.name)
    EOF
    
  2. Créez workflow_agents/__init__.py en exécutant la commande suivante dans le terminal. Cela marque le répertoire comme package Python.
    cat <<EOF > ~/adk_multiagent_systems/workflow_agents/__init__.py
    """
    Marks the directory as a Python package and exposes the agent module, 
    allowing the ADK to discover and register the agents defined within.
    """
    from . import agent
    EOF
    
  3. Créez workflow_agents/agent.py en exécutant la commande suivante dans le terminal. Ce fichier contient la logique de base de votre équipe multi-agents.
    cat <<EOF > ~/adk_multiagent_systems/workflow_agents/agent.py
    """
    Defines the core multi-agent workflow. Configures individual agents (Researcher, 
    Screenwriter, File Writer), assigns their specific tools, and orchestrates 
    their collaboration using the ADK's SequentialAgent pattern.
    """
    import os
    import logging
    import google.cloud.logging
    
    from callback_logging import log_query_to_model, log_model_response
    from dotenv import load_dotenv
    
    from google.adk import Agent
    from google.adk.agents import SequentialAgent, LoopAgent, ParallelAgent
    from google.adk.tools.tool_context import ToolContext
    from google.adk.tools.langchain_tool import LangchainTool  # import
    from google.genai import types
    
    from langchain_community.tools import WikipediaQueryRun
    from langchain_community.utilities import WikipediaAPIWrapper
    
    
    cloud_logging_client = google.cloud.logging.Client()
    cloud_logging_client.setup_logging()
    
    load_dotenv()
    
    model_name = os.getenv("MODEL")
    print(model_name)
    
    # Tools
    
    
    def append_to_state(
        tool_context: ToolContext, field: str, response: str
    ) -> dict[str, str]:
        """Append new output to an existing state key.
    
        Args:
            field (str): a field name to append to
            response (str): a string to append to the field
    
        Returns:
            dict[str, str]: {"status": "success"}
        """
        existing_state = tool_context.state.get(field, [])
        tool_context.state[field] = existing_state + [response]
        logging.info(f"[Added to {field}] {response}")
        return {"status": "success"}
    
    
    def write_file(
        tool_context: ToolContext,
        directory: str,
        filename: str,
        content: str
    ) -> dict[str, str]:
        target_path = os.path.join(directory, filename)
        os.makedirs(os.path.dirname(target_path), exist_ok=True)
        with open(target_path, "w") as f:
            f.write(content)
        return {"status": "success"}
    
    
    # Agents
    
    file_writer = Agent(
        name="file_writer",
        model=model_name,
        description="Creates marketing details and saves a pitch document.",
        instruction="""
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        INSTRUCTIONS:
        - Create a marketable, contemporary movie title suggestion for the movie described in the PLOT_OUTLINE. If a title has been suggested in PLOT_OUTLINE, you can use it, or replace it with a better one.
        - Use your 'write_file' tool to create a new txt file with the following arguments:
            - for a filename, use the movie title
            - Write to the 'movie_pitches' directory.
            - For the 'content' to write, extract the following from the PLOT_OUTLINE:
                - A logline
                - Synopsis or plot outline
        """,
        generate_content_config=types.GenerateContentConfig(
            temperature=0,
        ),
        tools=[write_file],
    )
    
    screenwriter = Agent(
        name="screenwriter",
        model=model_name,
        description="As a screenwriter, write a logline and plot outline for a biopic about a historical character.",
        instruction="""
        INSTRUCTIONS:
        Your goal is to write a logline and three-act plot outline for an inspiring movie about a historical character(s) described by the PROMPT: { PROMPT? }
    
        - If there is CRITICAL_FEEDBACK, use those thoughts to improve upon the outline.
        - If there is RESEARCH provided, feel free to use details from it, but you are not required to use it all.
        - If there is a PLOT_OUTLINE, improve upon it.
        - Use the 'append_to_state' tool to write your logline and three-act plot outline to the field 'PLOT_OUTLINE'.
        - Summarize what you focused on in this pass.
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        RESEARCH:
        { research? }
    
        CRITICAL_FEEDBACK:
        { CRITICAL_FEEDBACK? }
        """,
        generate_content_config=types.GenerateContentConfig(
            temperature=0,
        ),
        tools=[append_to_state],
    )
    
    researcher = Agent(
        name="researcher",
        model=model_name,
        description="Answer research questions using Wikipedia.",
        instruction="""
        PROMPT:
        { PROMPT? }
    
        PLOT_OUTLINE:
        { PLOT_OUTLINE? }
    
        CRITICAL_FEEDBACK:
        { CRITICAL_FEEDBACK? }
    
        INSTRUCTIONS:
        - If there is a CRITICAL_FEEDBACK, use your wikipedia tool to do research to solve those suggestions
        - If there is a PLOT_OUTLINE, use your wikipedia tool to do research to add more historical detail
        - If these are empty, use your Wikipedia tool to gather facts about the person in the PROMPT
        - Use the 'append_to_state' tool to add your research to the field 'research'.
        - Summarize what you have learned.
        Now, use your Wikipedia tool to do research.
        """,
        generate_content_config=types.GenerateContentConfig(
            temperature=0,
        ),
        tools=[
            LangchainTool(tool=WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())),
            append_to_state,
        ],
    )
    
    film_concept_team = SequentialAgent(
        name="film_concept_team",
        description="Write a film plot outline and save it as a text file.",
        sub_agents=[
            researcher,
            screenwriter,
            file_writer
        ],
    )
    
    root_agent = Agent(
        name="greeter",
        model=model_name,
        description="Guides the user in crafting a movie plot.",
        instruction="""
        - Let the user know you will help them write a pitch for a hit movie. Ask them for   
          a historical figure to create a movie about.
        - When they respond, use the 'append_to_state' tool to store the user's response
          in the 'PROMPT' state key and transfer to the 'film_concept_team' agent
        """,
        generate_content_config=types.GenerateContentConfig(
            temperature=0,
        ),
        tools=[append_to_state],
        sub_agents=[film_concept_team],
    )
    EOF
    

La structure de votre fichier devrait maintenant se présenter comme suit :
Capture d&#39;écran de la structure de fichier actuelle

Configurer l'environnement virtuel

  • Dans le terminal, créez et activez un environnement virtuel à l'aide de uv. Cela garantit que les dépendances de votre projet ne sont pas en conflit avec le système Python.
    uv venv
    source .venv/bin/activate
    

Installer les éléments requis

  1. Exécutez la commande suivante dans le terminal pour créer le fichier requirements.txt.
    cat <<EOF > ~/adk_multiagent_systems/requirements.txt
    # Lists all Python dependencies required to run the multi-agent system,
    # including the Google ADK, LangChain community tools, and web server libraries.
    langchain-community==0.3.20
    wikipedia==1.4.0
    google-adk==1.8.0
    fastapi==0.121.2
    uvicorn==0.38.0
    EOF
    
  2. Installez les packages requis dans votre environnement virtuel dans le terminal.
    uv pip install -r requirements.txt
    

Configurer des variables d'environnement

  1. Utilisez la commande suivante dans le terminal pour créer le fichier .env, en insérant automatiquement votre ID de projet et votre région.
    cat <<EOF > ~/adk_multiagent_systems/.env
    GOOGLE_CLOUD_PROJECT="$(gcloud config get-value project)"
    GOOGLE_CLOUD_PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')"
    GOOGLE_CLOUD_LOCATION="us-central1"
    GOOGLE_GENAI_USE_VERTEXAI=true
    MODEL="gemini-2.5-flash"
    EOF
    
  2. Dans le terminal, chargez les variables dans votre session d'interface système.
    source .env
    

Récapitulatif

Dans cette section, vous avez établi les bases locales de votre projet :

  • Création de la structure de répertoire et des fichiers de démarrage de l'agent nécessaires (agent.py, callback_logging.py, requirements.txt).
  • Isolez vos dépendances à l'aide d'un environnement virtuel (uv).
  • Vous avez configuré des variables d'environnement (.env) pour stocker des informations spécifiques au projet, comme votre ID de projet et votre région.

6. Explorer le fichier de l'agent

Vous avez configuré le code source de l'atelier, y compris un système multi-agents pré-écrit. Avant de déployer l'application, il est utile de comprendre comment les agents sont définis. La logique de l'agent principal réside dans workflow_agents/agent.py.

  1. Dans l'éditeur Cloud Shell, utilisez l'explorateur de fichiers sur la gauche pour accéder à adk_multiagent_system_gke/workflow_agents/ et ouvrir le fichier agent.py.
  2. Prenez quelques instants pour parcourir le fichier. Vous n'avez pas besoin de comprendre chaque ligne, mais notez la structure générale :
    • Agents individuels : le fichier définit trois objets Agent distincts : researcher, screenwriter et file_writer. Chaque agent reçoit un instruction spécifique (son invite) et une liste de tools qu'il est autorisé à utiliser (comme l'outil WikipediaQueryRun ou un outil write_file personnalisé).
    • Composition de l'agent : les agents individuels sont enchaînés dans un SequentialAgent appelé film_concept_team. Cela indique à l'ADK d'exécuter ces agents les uns après les autres, en transmettant l'état de l'un à l'autre.
    • L'agent racine : un root_agent (nommé "greeter") est défini pour gérer l'interaction initiale de l'utilisateur. Lorsque l'utilisateur fournit une requête, cet agent l'enregistre dans l'état de l'application, puis transfère le contrôle au workflow film_concept_team.

Comprendre cette structure permet de clarifier ce que vous allez déployer : non pas un seul agent, mais une équipe coordonnée d'agents spécialisés orchestrée par l'ADK.

7. Créer un cluster GKE Autopilot

Une fois votre environnement préparé, l'étape suivante consiste à provisionner l'infrastructure sur laquelle votre application d'agent s'exécutera. Vous allez créer un cluster GKE Autopilot, qui servira de base à votre déploiement. Nous utilisons le mode Autopilot, car il gère la complexité de la gestion des nœuds, du scaling et de la sécurité sous-jacents du cluster, ce qui vous permet de vous concentrer uniquement sur le déploiement de votre application.

  1. Dans le terminal, créez un cluster GKE Autopilot nommé adk-cluster.
    gcloud container clusters create-auto adk-cluster \
      --location=$GOOGLE_CLOUD_LOCATION \
      --project=$GOOGLE_CLOUD_PROJECT
    
    Cette commande provisionne un cluster Kubernetes entièrement géré. GKE Autopilot configure automatiquement les nœuds, le scaling et la sécurité, ce qui simplifie les opérations de cluster.
  2. Une fois le cluster créé, configurez kubectl pour vous y connecter en exécutant la commande suivante dans le terminal :
    gcloud container clusters get-credentials adk-cluster \
      --location=$GOOGLE_CLOUD_LOCATION \
      --project=$GOOGLE_CLOUD_PROJECT
    
    Cette commande connecte votre environnement local à votre nouveau cluster GKE. Il récupère automatiquement le point de terminaison et les identifiants d'authentification du cluster, puis met à jour un fichier de configuration local (~/.kube/config). À partir de ce moment, l'outil de ligne de commande kubectl sera authentifié et dirigé pour communiquer avec votre adk-cluster.

Récapitulatif

Dans cette section, vous avez provisionné l'infrastructure :

  • Création d'un cluster GKE Autopilot entièrement géré à l'aide de gcloud.
  • Vous avez configuré votre outil kubectl local pour l'authentification et la communication avec le nouveau cluster.

8. Conteneuriser et transférer l'application

Le code de votre agent n'existe actuellement que dans votre environnement Cloud Shell. Pour l'exécuter sur GKE, vous devez d'abord l'empaqueter dans une image de conteneur. Une image de conteneur est un fichier statique et portable qui regroupe le code de votre application avec toutes ses dépendances. Lorsque vous exécutez cette image, elle devient un conteneur actif.

Ce processus comprend trois étapes clés :

  • Créez un point d'entrée : définissez un fichier main.py pour transformer la logique de votre agent en serveur Web exécutable.
  • Définissez l'image de conteneur : créez un Dockerfile qui sert de plan pour créer votre image de conteneur.
  • Compiler et transférer : utilisez Cloud Build pour exécuter le Dockerfile, créer l'image de conteneur et la transférer vers Google Artifact Registry, un dépôt sécurisé pour vos images.

Préparer l'application pour le déploiement

Votre agent ADK a besoin d'un serveur Web pour recevoir les requêtes. Le fichier main.py servira de point d'entrée, en utilisant le framework FastAPI pour exposer les fonctionnalités de votre agent sur HTTP.

  1. Dans la racine du répertoire adk_multiagent_system_gke du terminal, créez un fichier nommé main.py.
    cat <<EOF > ~/adk_multiagent_systems/main.py
    """
    Serves as the application entry point. Initializes the FastAPI web server, 
    discovers the agents defined in the workflow directory, and exposes them 
    via HTTP endpoints for interaction.
    """
    
    import os
    
    import uvicorn
    from fastapi import FastAPI
    from google.adk.cli.fast_api import get_fast_api_app
    
    # Get the directory where main.py is located
    AGENT_DIR = os.path.dirname(os.path.abspath(__file__))
    
    # Configure the session service (e.g., SQLite for local storage)
    SESSION_SERVICE_URI = "sqlite:///./sessions.db"
    
    # Configure CORS to allow requests from various origins for this lab
    ALLOWED_ORIGINS = ["http://localhost", "http://localhost:8080", "*"]
    
    # Enable the ADK's built-in web interface
    SERVE_WEB_INTERFACE = True
    
    # Call the ADK function to discover agents and create the FastAPI app
    app: FastAPI = get_fast_api_app(
        agents_dir=AGENT_DIR,
        session_service_uri=SESSION_SERVICE_URI,
        allow_origins=ALLOWED_ORIGINS,
        web=SERVE_WEB_INTERFACE,
    )
    
    # You can add more FastAPI routes or configurations below if needed
    # Example:
    # @app.get("/hello")
    # async def read_root():
    #     return {"Hello": "World"}
    
    if __name__ == "__main__":
        # Get the port from the PORT environment variable provided by the container runtime
        # Run the Uvicorn server, listening on all available network interfaces (0.0.0.0)
        uvicorn.run(app, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
    EOF
    
    Ce fichier utilise la bibliothèque ADK pour découvrir les agents de votre projet et les encapsuler dans une application Web FastAPI. Le serveur uvicorn exécute cette application, en écoutant l'hôte 0.0.0.0 pour accepter les connexions depuis n'importe quelle adresse IP et sur le port spécifié par la variable d'environnement PORT, que nous définirons plus tard dans notre fichier manifeste Kubernetes.

     À ce stade, la structure de vos fichiers, telle qu'elle apparaît dans le panneau de l'explorateur de l'éditeur Cloud Shell, devrait ressembler à ceci : Capture d&#39;écran de la structure de fichier actuelle

Conteneuriser l'agent ADK avec Docker

Pour déployer notre application sur GKE, nous devons d'abord l'empaqueter dans une image de conteneur, qui regroupe le code de notre application avec toutes les bibliothèques et dépendances dont elle a besoin pour s'exécuter. Nous utiliserons Docker pour créer cette image de conteneur.

  1. Dans la racine du répertoire adk_multiagent_system_gke du terminal, créez un fichier nommé Dockerfile.
    cat <<'EOF' > ~/adk_multiagent_systems/Dockerfile
    # Defines the blueprint for the container image. Installs dependencies,
    # sets up a secure non-root user, and specifies the startup command to run the 
    # agent web server.
    
    # Use an official lightweight Python image as the base
    FROM python:3.13-slim
    
    # Set the working directory inside the container
    WORKDIR /app
    
    # Create a non-root user for security best practices
    RUN adduser --disabled-password --gecos "" myuser
    
    # Copy and install dependencies first to leverage Docker's layer caching
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Copy all application code into the container
    COPY . .
    
    # Create the directory where the agent will write files at runtime
    # The -p flag ensures the command doesn't fail if the directory already exists
    RUN mkdir -p movie_pitches
    
    # Change ownership of EVERYTHING in /app to the non-root user
    # Without this, the running agent would be denied permission to write files.
    RUN chown -R myuser:myuser /app
    
    # Switch the active user from root to the non-root user
    USER myuser
    
    # Add the user's local binary directory to the system's PATH
    ENV PATH="/home/myuser/.local/bin:$PATH"
    
    # Define the command to run when the container starts
    CMD ["sh", "-c", "uvicorn main:app --host 0.0.0.0 --port $PORT"]
    EOF
    
    À ce stade, la structure de vos fichiers dans le panneau de l'explorateur de l'éditeur Cloud Shell doit se présenter comme suit : Capture d&#39;écran de la structure de fichier actuelle

Créer et transférer l'image de conteneur vers Artifact Registry

Maintenant que vous disposez d'un Dockerfile, vous allez utiliser Cloud Build pour créer l'image et la transférer vers Artifact Registry, un registre privé et sécurisé intégré aux services Google Cloud. GKE extraira l'image de ce registre pour exécuter votre application.

  1. Dans le terminal, créez un dépôt Artifact Registry pour stocker votre image de conteneur.
    gcloud artifacts repositories create adk-repo \
      --repository-format=docker \
      --location=$GOOGLE_CLOUD_LOCATION \
      --description="ADK repository"
    
  2. Dans le terminal, utilisez gcloud builds submit pour créer votre image de conteneur et la transférer vers le dépôt.
    gcloud builds submit \
      --tag $GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/adk-repo/adk-agent:latest \
      --project=$GOOGLE_CLOUD_PROJECT \
      .
    
    Cette commande unique utilise Cloud Build, une plate-forme CI/CD sans serveur, pour exécuter les étapes de votre Dockerfile. Il crée l'image dans le cloud, lui attribue l'adresse de votre dépôt Artifact Registry et la transfère automatiquement.
  3. Dans le terminal, vérifiez que l'image est créée :
    gcloud artifacts docker images list \
      $GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/adk-repo \
      --project=$GOOGLE_CLOUD_PROJECT
    

Récapitulatif

Dans cette section, vous avez empaqueté votre code pour le déploiement :

  • Création d'un point d'entrée main.py pour encapsuler vos agents dans un serveur Web FastAPI.
  • Définissez un fichier Dockerfile pour regrouper votre code et vos dépendances dans une image portable.
  • Utilisé Cloud Build pour créer l'image et la transférer vers un dépôt Artifact Registry sécurisé.

9. Créer des fichiers manifestes Kubernetes

Maintenant que votre image de conteneur est créée et stockée dans Artifact Registry, vous devez indiquer à GKE comment l'exécuter. Cela implique deux activités principales :

  • Configurer les autorisations : vous allez créer une identité dédiée pour votre agent dans le cluster et lui accorder un accès sécurisé aux API Google Cloud dont il a besoin (en particulier Vertex AI).
  • Définir l'état de l'application : vous allez écrire un fichier manifeste Kubernetes, un document YAML qui définit de manière déclarative tout ce dont votre application a besoin pour s'exécuter, y compris l'image de conteneur, les variables d'environnement et la façon dont elle doit être exposée au réseau.

Configurer le compte de service Kubernetes pour Vertex AI

Votre agent a besoin d'une autorisation pour communiquer avec l'API Vertex AI afin d'accéder aux modèles Gemini. La méthode la plus sécurisée et recommandée pour accorder cette autorisation dans GKE est Workload Identity. Workload Identity vous permet d'associer une identité native Kubernetes (un compte de service Kubernetes) à une identité Google Cloud (un compte de service IAM), ce qui vous évite complètement d'avoir à télécharger, gérer et stocker des clés JSON statiques.

  1. Dans le terminal, créez le compte de service Kubernetes (adk-agent-sa). Cela crée une identité pour votre agent dans le cluster GKE que vos pods peuvent utiliser.
    kubectl create serviceaccount adk-agent-sa
    
  2. Dans le terminal, associez votre compte de service Kubernetes à Google Cloud IAM en créant une liaison de stratégie. Cette commande attribue le rôle aiplatform.user à votre adk-agent-sa, ce qui lui permet d'appeler l'API Vertex AI de manière sécurisée.
    gcloud projects add-iam-policy-binding projects/${GOOGLE_CLOUD_PROJECT} \
        --role=roles/aiplatform.user \
        --member=principal://iam.googleapis.com/projects/${GOOGLE_CLOUD_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GOOGLE_CLOUD_PROJECT}.svc.id.goog/subject/ns/default/sa/adk-agent-sa \
        --condition=None
    

Créer les fichiers manifestes Kubernetes

Kubernetes utilise des fichiers manifestes YAML pour définir l'état souhaité de votre application. Vous allez créer un fichier deployment.yaml contenant deux objets Kubernetes essentiels : un déploiement et un service.

  1. À partir du terminal, générez le fichier deployment.yaml.
    cat <<EOF > ~/adk_multiagent_systems/deployment.yaml
    # Defines the Kubernetes resources required to deploy the application to GKE. 
    # Includes the Deployment (to run the container pods) and the Service 
    # (to expose the application via a Load Balancer).
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: adk-agent
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: adk-agent
      template:
        metadata:
          labels:
            app: adk-agent
        spec:
          # Assign the Kubernetes Service Account for Workload Identity
          serviceAccountName: adk-agent-sa
          containers:
          - name: adk-agent
            imagePullPolicy: Always
            # The path to the container image in Artifact Registry
            image: ${GOOGLE_CLOUD_LOCATION}-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/adk-repo/adk-agent:latest
            # Define the resources for GKE Autopilot to provision
            resources:
              limits:
                memory: "1Gi"
                cpu: "1000m"
                ephemeral-storage: "512Mi"
              requests:
                memory: "1Gi"
                cpu: "1000m"
                ephemeral-storage: "512Mi"
            ports:
            - containerPort: 8080
            # Environment variables passed to the application
            env:
            - name: PORT
              value: "8080"
            - name: GOOGLE_CLOUD_PROJECT
              value: ${GOOGLE_CLOUD_PROJECT}
            - name: GOOGLE_CLOUD_LOCATION
              value: ${GOOGLE_CLOUD_LOCATION}
            - name: GOOGLE_GENAI_USE_VERTEXAI
              value: "true"
            - name: MODEL
              value: "gemini-2.5-flash"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: adk-agent
    spec:
      # Create a public-facing Network Load Balancer with an external IP
      type: LoadBalancer
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: adk-agent
    EOF
    
    À ce stade, la structure de vos fichiers, telle qu'elle apparaît dans le panneau de l'explorateur de l'éditeur Cloud Shell, devrait ressembler à ceci :Capture d&#39;écran de la structure de fichier actuelle

Récapitulatif

Dans cette section, vous avez défini la configuration de sécurité et de déploiement :

  • Vous avez créé un compte de service Kubernetes et l'avez associé à Google Cloud IAM à l'aide de Workload Identity, ce qui permet à vos pods d'accéder de manière sécurisée à Vertex AI sans avoir à gérer de clés.
  • Générez un fichier deployment.yaml qui définit le déploiement (comment exécuter les pods) et le service (comment les exposer via un équilibreur de charge).

10. Déployer l'application sur GKE

Maintenant que vous avez défini votre fichier manifeste et transféré votre image de conteneur vers Artifact Registry, vous êtes prêt à déployer votre application. Dans cette tâche, vous allez utiliser kubectl pour appliquer votre configuration au cluster GKE, puis surveiller l'état pour vous assurer que votre agent démarre correctement.

  1. Dans votre terminal, appliquez le fichier manifeste deployment.yaml à votre cluster.
    kubectl apply -f deployment.yaml
    
    La commande kubectl apply envoie votre fichier deployment.yaml au serveur d'API Kubernetes. Le serveur lit ensuite votre configuration et orchestre la création des objets Deployment et Service.
  2. Dans le terminal, vérifiez l'état de votre déploiement en temps réel. Attendez que les pods soient à l'état Running.
    kubectl get pods -l=app=adk-agent --watch
    
    Vous verrez le pod passer par plusieurs phases :
    • En attente : le pod a été accepté par le cluster, mais le conteneur n'a pas encore été créé.
    • Création du conteneur : GKE extrait votre image de conteneur d'Artifact Registry et démarre le conteneur.
    • Course à pied : félicitations ! Le conteneur est en cours d'exécution et votre application d'agent est en ligne.
  3. Une fois que l'état affiche Running, appuyez sur CTRL+C dans le terminal pour arrêter la commande watch et revenir à l'invite de commande.

Récapitulatif

Dans cette section, vous avez lancé la charge de travail :

  • Utilisez kubectl apply pour envoyer votre fichier manifeste au cluster.
  • Surveillance du cycle de vie du pod (en attente → création du conteneur → en cours d'exécution) pour s'assurer que l'application a bien démarré.

11. Interagir avec l'agent

Votre agent ADK est désormais en cours d'exécution sur GKE et est exposé à Internet via un équilibreur de charge public. Vous vous connecterez à l'interface Web de l'agent pour interagir avec lui et vérifier que l'ensemble du système fonctionne correctement.

Rechercher l'adresse IP externe de votre service

Pour accéder à l'agent, vous devez d'abord obtenir l'adresse IP publique que GKE a provisionnée pour votre service.

  1. Dans le terminal, exécutez la commande suivante pour obtenir les détails de votre service.
    kubectl get service adk-agent
    
  2. Recherchez la valeur dans la colonne EXTERNAL-IP. L'attribution de l'adresse IP peut prendre une ou deux minutes après le premier déploiement du service. Si l'état est pending, patientez une minute, puis exécutez à nouveau la commande. Le résultat devrait ressembler à ceci :
    NAME                TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
    adk-agent-service   LoadBalancer   10.120.12.234   34.123.45.67    80:31234/TCP   5m
    
    L'adresse indiquée sous EXTERNAL-IP (par exemple, 34.123.45.67) est le point d'entrée public de votre agent.

Tester l'agent déployé

Vous pouvez désormais utiliser l'adresse IP publique pour accéder à l'interface utilisateur Web intégrée de l'ADK directement depuis votre navigateur.

  1. Copiez l'adresse IP externe (EXTERNAL-IP) depuis le terminal.
  2. Ouvrez un nouvel onglet dans votre navigateur Web et saisissez http://[EXTERNAL-IP], en remplaçant [EXTERNAL-IP] par l'adresse IP que vous avez copiée.
  3. L'interface Web de l'ADK devrait maintenant s'afficher.
  4. Assurez-vous que workflow_agents est sélectionné dans le menu déroulant des agents.
  5. Activez l'option Distribution de jetons.
  6. Saisissez hello et appuyez sur Entrée pour démarrer une nouvelle conversation.
  7. Observez le résultat. L'agent doit répondre rapidement par un message de salutation : Je peux vous aider à rédiger un pitch pour un film à succès. Sur quelle figure historique aimerais-tu faire un film ?"
  8. Lorsque vous êtes invité à choisir un personnage historique, proposez-en un qui vous intéresse. Voici quelques idées :
    • the most successful female pirate in history
    • the woman who invented the first computer compiler
    • a legendary lawman of the American Wild West

Récapitulatif

Dans cette section, vous avez vérifié le déploiement :

  • Récupérez l'adresse IP externe allouée par l'équilibreur de charge.
  • Accédez à l'interface utilisateur Web de l'ADK via un navigateur pour vérifier que le système multi-agents est réactif et fonctionnel.

12. Configurer l'autoscaling

L'un des principaux défis de la production consiste à gérer le trafic utilisateur imprévisible. Le codage en dur d'un nombre fixe de répliques, comme vous l'avez fait dans la tâche précédente, signifie que vous payez trop cher pour les ressources inactives ou que vous risquez de mauvaises performances lors des pics de trafic. GKE résout ce problème grâce au scaling automatique.

Vous allez configurer un HorizontalPodAutoscaler (HPA), un contrôleur Kubernetes qui ajuste automatiquement le nombre de pods en cours d'exécution dans votre déploiement en fonction de l'utilisation du processeur en temps réel.

  1. Dans le terminal de l'éditeur Cloud Shell, créez un fichier hpa.yaml à la racine du répertoire adk_multiagent_system_gke.
    cloudshell edit ~/adk_multiagent_systems/hpa.yaml
    
  2. Ajoutez le contenu suivant au nouveau fichier hpa.yaml :
    # Configures the HorizontalPodAutoscaler (HPA) to automatically scale 
    # the number of running agent pods up or down based on CPU utilization 
    # to handle varying traffic loads.
    
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: adk-agent-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: adk-agent
      minReplicas: 1
      maxReplicas: 5
      targetCPUUtilizationPercentage: 50
    
    Cet objet HPA cible notre déploiement adk-agent. Il garantit qu'au moins un pod est toujours en cours d'exécution, définit un maximum de cinq pods et ajoute/supprime des répliques pour maintenir l'utilisation moyenne du processeur autour de 50 %.À ce stade, la structure de votre fichier, telle qu'elle apparaît dans le panneau de l'explorateur de l'éditeur Cloud Shell, devrait ressembler à ceci : Capture d&#39;écran de la structure de fichier actuelle
  3. Appliquez le HPA à votre cluster en collant ce code dans le terminal.
    kubectl apply -f hpa.yaml
    

Vérifier l'autoscaler

Le HPA est maintenant actif et surveille votre déploiement. Vous pouvez inspecter son état pour le voir en action.

  1. Exécutez la commande suivante dans le terminal pour obtenir l'état de votre HPA.
    kubectl get hpa adk-agent-hpa
    
    Le résultat devrait ressembler à ceci :
    NAME            REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    adk-agent-hpa   Deployment/adk-agent   0%/50%    1         5         1          30s
    
    Votre agent va maintenant évoluer automatiquement en fonction du trafic.

Récapitulatif

Dans cette section, vous avez optimisé le trafic de production :

  • Création d'un fichier manifeste hpa.yaml pour définir les règles de scaling.
  • Déployez l'autoscaler horizontal de pods (HPA) pour ajuster automatiquement le nombre de répliques de pods en fonction de l'utilisation du processeur.

13. Préparer la production

Remarque : Les sections suivantes sont fournies à titre d'information uniquement et ne contiennent pas d'étapes supplémentaires à suivre. Ils sont conçus pour fournir du contexte et des bonnes pratiques pour déployer votre application en production.

Optimiser les performances grâce à l'allocation des ressources

Dans GKE Autopilot, vous contrôlez la quantité de processeur et de mémoire provisionnée pour votre application en spécifiant les requests de ressources dans votre deployment.yaml.

Si vous constatez que votre agent est lent ou plante en raison d'un manque de mémoire, vous pouvez augmenter l'allocation de ressources en modifiant le bloc resources dans votre deployment.yaml et en réappliquant le fichier avec kubectl apply.

Par exemple, pour doubler la mémoire :

# In deployment.yaml
# ...
        resources:
          requests:
            memory: "2Gi"  # Increased from 1Gi
            cpu: "1000m"
# ...

Automatiser votre workflow avec la CI/CD

Dans cet atelier, vous avez exécuté des commandes manuellement. La pratique professionnelle consiste à créer un pipeline CI/CD (intégration et déploiement continus). En connectant un dépôt de code source (comme GitHub) à un déclencheur Cloud Build, vous pouvez automatiser l'ensemble du déploiement.

Avec un pipeline, chaque fois que vous transmettez une modification de code, Cloud Build peut automatiquement :

  1. Créez la nouvelle image de conteneur.
  2. Transférer l'image vers Artifact Registry
  3. Appliquez les fichiers manifestes Kubernetes mis à jour à votre cluster GKE.

Gérer les secrets de manière sécurisée

Dans cet atelier, vous avez stocké la configuration dans un fichier .env et l'avez transmise à votre application. Cette méthode est pratique pour le développement, mais n'est pas sécurisée pour les données sensibles telles que les clés API. Il est recommandé d'utiliser Secret Manager pour stocker les secrets de manière sécurisée.

GKE est intégré de manière native à Secret Manager, ce qui vous permet de monter des secrets directement dans vos pods en tant que variables d'environnement ou fichiers, sans qu'ils ne soient jamais enregistrés dans votre code source.

Voici la section Nettoyer les ressources que vous avez demandée, insérée juste avant la section Conclusion.

14. Effectuer un nettoyage des ressources

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez chaque ressource individuellement.

Supprimer le cluster GKE

Le cluster GKE est le principal facteur de coût dans cet atelier. Si vous la supprimez, les frais de calcul s'arrêteront.

  1. Dans le terminal, exécutez la commande suivante :
    gcloud container clusters delete adk-cluster \
      --location=$GOOGLE_CLOUD_LOCATION \
      --quiet
    

Supprimer le dépôt Artifact Registry

Les images de conteneur stockées dans Artifact Registry entraînent des frais de stockage.

  1. Dans le terminal, exécutez la commande suivante :
    gcloud artifacts repositories delete adk-repo \
      --location=$GOOGLE_CLOUD_LOCATION \
      --quiet
    

Supprimer le projet (facultatif)

Si vous avez créé un projet spécifiquement pour cet atelier et que vous ne prévoyez pas de l'utiliser à nouveau, le moyen le plus simple d'effectuer un nettoyage consiste à supprimer l'intégralité du projet.

  1. Dans le terminal, exécutez la commande suivante (remplacez [YOUR_PROJECT_ID] par l'ID de votre projet) :
    gcloud projects delete [YOUR_PROJECT_ID]
    

15. Conclusion

Félicitations ! Vous avez déployé une application ADK multi-agents sur un cluster GKE de niveau production. Il s'agit d'une réussite importante qui couvre le cycle de vie principal d'une application cloud native moderne. Vous disposez ainsi d'une base solide pour déployer vos propres systèmes agentiques complexes.

Récapitulatif

Dans cet atelier, vous avez appris à :

Ressources utiles