このガイドでは、Google Kubernetes Engine(GKE)を使用してコンテナ化されたエージェント AI/ML アプリケーションをデプロイして管理する方法について説明します。Google Agent Development Kit(ADK)と大規模言語モデル(LLM)プロバイダとしての Vertex AI を組み合わせることで、AI エージェントを効率的かつ大規模に運用できます。このガイドでは、Gemini 2.0 Flash を搭載した FastAPI ベースのエージェントを開発から GKE への本番環境デプロイまで行うエンドツーエンドのプロセスについて説明します。
このガイドは、エージェント AI/ML アプリケーションのサービングに Kubernetes コンテナ オーケストレーション機能を使用することに関心のある ML エンジニア、デベロッパー、クラウド アーキテクトを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
始める前に、次の内容を理解しておいてください。
背景
このガイドでは、複数の Google テクノロジーを組み合わせて、エージェント AI のスケーラブルなプラットフォームを作成します。GKE は、ADK を使用して構築されたエージェントのコンテナ オーケストレーションを提供します。LLM 推論に Vertex AI API を使用すると、推論は Google のマネージド インフラストラクチャによって処理されるため、GKE クラスタに専用の GPU ハードウェアは必要ありません。
Google Agent Development Kit(ADK)
Agent Development Kit(ADK)は、AI エージェントの開発とデプロイ用に設計された、柔軟性の高いモジュラー フレームワークです。ADK は Gemini と Google エコシステム向けに最適化されていますが、モデルに依存せず、デプロイに依存せず、他のフレームワークとの互換性を確保するように構築されています。
詳細については、ADK のドキュメントをご覧ください。
GKE マネージド Kubernetes サービス
GKE は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を行うためのマネージド Kubernetes サービスです。GKE は、LLM のコンピューティング需要を処理するために必要なインフラストラクチャ(スケーラブルなリソース、分散コンピューティング、効率的なネットワーキングなど)を提供します。
Kubernetes の主なコンセプトについて詳しくは、Kubernetes の学習を開始するをご覧ください。GKE の詳細と、GKE が Kubernetes のスケーリング、自動化、管理にどのように役立つかについては、GKE の概要をご覧ください。
Vertex AI
Vertex AI は Google Cloudの統合 ML プラットフォームであり、デベロッパーは AI/ML モデルを構築、デプロイ、スケーリングできます。GKE 上のエージェント型 AI アプリケーションの場合、Vertex AI は、Gemini 2.0 Flash などの LLM へのアクセス、トレーニングと推論用のマネージド インフラストラクチャ、効率的なライフサイクル管理のための MLOps 機能など、不可欠なツールとサービスを提供します。
Vertex AI API を介して LLM を使用する場合、モデル推論は Google のマネージド インフラストラクチャで行われるため、GKE クラスタで特定の GPU または TPU の割り当てが必要になることはありません。
エージェント AI アプリケーション用の Vertex AI の詳細については、Vertex AI のドキュメントをご覧ください。
Gemini 2.0 Flash
Gemini 2.0 Flash は、エージェント ワークロード向けに設計された次世代の機能と機能強化を提供します。これには、高速化、組み込みツールの使用、マルチモーダル生成、100 万トークンのコンテキスト ウィンドウが含まれます。Gemini 2.0 Flash は、以前の Flash モデルを改良したもので、同程度の速度で品質が向上しています。
Gemini 2.0 Flash の技術情報(パフォーマンス ベンチマーク、トレーニング データセットに関する情報、持続可能性への取り組み、想定される使用方法と制限事項、倫理と安全性へのアプローチなど)については、Gemini 2.0 Flash のモデルカードをご覧ください。
目標
このガイドでは、次の方法について説明します。
- Google Cloud 環境を設定します。
- エージェントのコンテナ イメージをビルドします。
- エージェントを GKE クラスタにデプロイします。
- デプロイしたエージェントをテストします。
費用
このガイドでは、課金対象である次の Google Cloudコンポーネントを使用します。
各サービスの料金を確認して、発生する可能性のある費用を把握します。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the required APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
Make sure that you have the following role or roles on the project: roles/container.admin, roles/iam.serviceAccountAdmin, roles/artifactregistry.admin, roles/cloudbuild.builds.editor, roles/resourcemanager.projectIamAdmin
Check for the roles
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
Grant the roles
-
In the Google Cloud console, go to the IAM page.
IAM に移動 - プロジェクトを選択します。
- [ アクセスを許可] をクリックします。
-
[新しいプリンシパル] フィールドに、ユーザー ID を入力します。 これは通常、Google アカウントのメールアドレスです。
- [ロールを選択] リストでロールを選択します。
- 追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。
- [保存] をクリックします。
- Google Cloud コンソールで Cloud Shell セッションを起動し、
[Cloud Shell をアクティブにする] をクリックします。このアクションにより、 Google Cloud コンソールの下部ペインでセッションが起動します。
デフォルトの環境変数を設定します。
gcloud config set project PROJECT_ID export GOOGLE_CLOUD_LOCATION=REGION export PROJECT_ID=PROJECT_ID export GOOGLE_CLOUD_PROJECT=$PROJECT_ID export WORKLOAD_POOL=$PROJECT_ID.svc.id.goog export PROJECT_NUMBER=$(gcloud projects describe --format json $PROJECT_ID | jq -r ".projectNumber")
次の値を置き換えます。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REGION: GKE クラスタ、Artifact Registry、その他のリージョン リソースをプロビジョニングする Google Cloud リージョン(
us-central1
など)。
Cloud Shell ターミナルから、チュートリアルのサンプルコード リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
チュートリアル ディレクトリに移動します。
cd kubernetes-engine-samples/ai-ml/adk-vertex
GKE クラスタを作成する: コンテナ化されたエージェント アプリケーションは、GKE Autopilot クラスタまたは GKE Standard クラスタにデプロイできます。フルマネージドの Kubernetes エクスペリエンスを実現するには、Autopilot クラスタを使用します。ワークロードに最適な GKE の運用モードを選択するには、GKE の運用モードを選択するをご覧ください。
Autopilot
Cloud Shell で、次のコマンドを実行します。
gcloud container clusters create-auto CLUSTER_NAME \ --location=$GOOGLE_CLOUD_LOCATION \ --project=$PROJECT_ID
CLUSTER_NAME は、GKE Autopilot クラスタの名前に置き換えます。
標準
Cloud Shell で、次のコマンドを実行します。
gcloud container clusters create CLUSTER_NAME \ --location=$GOOGLE_CLOUD_LOCATION \ --project=$PROJECT_ID \ --release-channel=stable \ --num-nodes=1 \ --machine-type=e2-medium \ --workload-pool=$PROJECT_ID.svc.id.goog
CLUSTER_NAME は、Standard クラスタの名前に置き換えます。
Docker コンテナ用の Artifact Registry リポジトリを作成する: エージェントの Docker コンテナ イメージを安全に保存して管理するための Artifact Registry リポジトリを作成します。このプライベート レジストリは、アプリケーションを GKE にデプロイする準備を整え、Cloud Build と統合するのに役立ちます。
gcloud artifacts repositories create adk-repo \ --repository-format=docker \ --location=$GOOGLE_CLOUD_LOCATION \ --project=$PROJECT_ID
リポジトリの URL を取得する: このコマンドを実行して、リポジトリのフルパスを確認します。このパス形式は、次のステップで Docker イメージにタグを付けるために使用します。
gcloud artifacts repositories describe adk-repo \ --location $GOOGLE_CLOUD_LOCATION \ --project=$PROJECT_ID
Compute Engine のデフォルト サービス アカウントに必要な IAM ロールを付与する: デフォルトでは、Compute Engine のデフォルト サービス アカウントには、Artifact Registry にイメージを push する権限や、Cloud Storage 内のオブジェクトやログを表示する権限がありません。これらのオペレーションに必要なロールを付与します。
ROLES_TO_ASSIGN=( "roles/artifactregistry.writer" "roles/storage.objectViewer" "roles/logging.viewer" ) for ROLE in "${ROLES_TO_ASSIGN[@]}"; do gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com" \ --role="${ROLE}" done
エージェント コンテナ イメージをビルドして push する: このコマンドを実行して Docker イメージをビルドし、Artifact Registry に push します。Dockerfile とアプリケーション コードが
/app
ディレクトリ内にあることを確認します。export IMAGE_URL="${GOOGLE_CLOUD_LOCATION}-docker.pkg.dev/${PROJECT_ID}/adk-repo/adk-agent:latest" gcloud builds submit \ --tag "$IMAGE_URL" \ --project="$PROJECT_ID" \ app
イメージが push されたことを確認します。
gcloud artifacts docker images list \ $GOOGLE_CLOUD_LOCATION-docker.pkg.dev/$PROJECT_ID/adk-repo/adk-agent \ --project=$PROJECT_ID
Terraform を初期化する:
terraform
ディレクトリに移動し、Terraform を初期化します。terraform init
実行プランを確認する: このコマンドは、Terraform が行うインフラストラクチャの変更を示します。
terraform plan -var-file=default_env.tfvars
構成を適用する: Terraform プランを実行して、 Google Cloud プロジェクトにリソースを作成します。メッセージが表示されたら、
yes
で確定します。terraform apply -var-file=default_env.tfvars
これらのコマンドを実行すると、Terraform は GKE クラスタと Artifact Registry リポジトリをプロビジョニングし、Workload Identity Federation for GKE を含む必要な IAM ロールとサービス アカウントを構成します。
Vertex AI アクセス用のサービス アカウントを作成します。
gcloud iam service-accounts create vertex-sa \ --project=$PROJECT_ID
サービス アカウントに
aiplatform.user
ロールを付与します。これにより、サービス アカウントは Vertex AI とやり取りできます。gcloud projects add-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:vertex-sa@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/aiplatform.user"
クラスタに KSA を作成します。このコマンドを実行する前に、クラスタと通信するように
kubectl
を構成するの手順に沿って操作してください。kubectl create serviceaccount vertex-sa
KSA にアノテーションを付けて、サービス アカウントにリンクします。
kubectl annotate serviceaccount vertex-sa \ iam.gke.io/gcp-service-account=vertex-sa@$PROJECT_ID.iam.gserviceaccount.com
サービス アカウントに、KSA の Workload Identity Federation for GKE ユーザーとして機能する権限を付与します。
gcloud iam service-accounts add-iam-policy-binding vertex-sa@$PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:$PROJECT_ID.svc.id.goog[default/vertex-sa]"
- エージェント アプリケーションの構造を理解する:
/app
ディレクトリには、エージェント アプリケーションのコアファイルが含まれています。main.py
: エージェントの API を公開する FastAPI アプリケーションのエントリ ポイント。agent.py
: ADK エージェントのロジックが含まれており、Vertex AI の使用方法とリクエストの処理方法を定義します。__init__.py
: Python パッケージを初期化します。requirements.txt
: エージェントのすべての Python 依存関係を一覧表示します。Dockerfile
: アプリケーションを Docker イメージにパッケージ化する方法を定義します。
エージェントのデプロイ マニフェストを作成する:
tutorials-and-examples/adk/vertex
ディレクトリに、次のマニフェストをagent-deployment.yaml
という名前のファイルとして作成します。apiVersion: apps/v1 kind: Deployment metadata: name: adk-agent-deployment labels: app: adk-agent spec: replicas: 1 selector: matchLabels: app: adk-agent template: metadata: labels: app: adk-agent spec: serviceAccountName: vertex-sa containers: - name: adk-agent image: IMAGE_URL ports: - containerPort: 8000 env: - name: GOOGLE_CLOUD_PROJECT_ID value: PROJECT_ID - name: GOOGLE_CLOUD_LOCATION value: REGION - name: GOOGLE_GENAI_USE_VERTEXAI value: "1" - name: PORT value: "8000" resources: requests: memory: "512Mi" cpu: "500m" limits: memory: "1Gi" cpu: "1"
次の値を置き換えます。
- IMAGE_URL: Artifact Registry に push した Docker イメージの完全な URL(例:
us-central1-docker.pkg.dev/${PROJECT_ID}/adk-repo/adk-agent:latest
)。この値は、前のセクションのgcloud artifacts docker images list
コマンドの出力から取得できます。または、sed -i "s|image: IMAGE_URL|image: $IMAGE_URL|" agent-deployment.yaml
などのコマンドを実行します。 - PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- REGION: GKE クラスタがプロビジョニングされる Google Cloud リージョン。
- IMAGE_URL: Artifact Registry に push した Docker イメージの完全な URL(例:
Deployment マニフェストを適用します。
kubectl apply -f agent-deployment.yaml
このコマンドは、GKE クラスタにエージェント アプリケーションの Deployment と関連する Pod を作成します。
エージェントを公開する: これらのメソッドを使用して、アクセス用にエージェントを公開できます。
- クラスタの外部からエージェントにアクセスするには、Kubernetes Service を作成します。ウェブ API の場合、
LoadBalancer
タイプのサービスが一般的です。 ローカル開発とテストでは、
kubectl port-forward
コマンドを使用してエージェントに直接アクセスします。
LoadBalancer
次のマニフェストを
agent-service.yaml
という名前のファイルとして作成します。apiVersion: v1 kind: Service metadata: name: adk-agent-service spec: selector: app: adk-agent type: LoadBalancer # Creates an external IP address for access ports: - protocol: TCP port: 80 targetPort: 8000 # Matches the containerPort exposed in the Deployment
次のようにマニフェストを適用します。
kubectl apply -f agent-service.yaml
外部 IP アドレスのプロビジョニングには数分かかることがあります。
IP アドレスがプロビジョニングされていることを確認します。
kubectl get service adk-agent-service
出力で
EXTERNAL-IP
の値を探します。値が使用可能になったら、この IP アドレスを使用して、デプロイされたエージェントとやり取りします。
port-forward
主に
port-forward
を使用する場合は、LoadBalancer
ではなくClusterIP
Service タイプを使用することを検討してください。ClusterIP
Service は内部で、使用するリソースが少なくなります。POD_NAME=$(kubectl get pods -l app=adk-agent -o jsonpath='{.items[0].metadata.name}') kubectl port-forward $POD_NAME 8000:8000
このコマンドはターミナルをブロックしますが、マシン上の
localhost:8000
から GKE クラスタ内で実行されているエージェントにトラフィックを転送します。- クラスタの外部からエージェントにアクセスするには、Kubernetes Service を作成します。ウェブ API の場合、
エージェントのエンドポイントを特定する: 前のセクションでエージェントを公開する方法に応じて、アクセス可能なエンドポイントを特定します。
LoadBalancer
外部 IP アドレスを取得します。
kubectl get service adk-agent-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
使いやすいように、外部 IP アドレスを環境変数に保存します。
export AGENT_IP=$(kubectl get service adk-agent-service -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
エージェントのベース URL は
http://${AGENT_IP}
です。
port-forward
kubectl port-forward
コマンドが別のターミナルで実行されていることを確認します。エージェントのベース URL はhttp://localhost:8000
です。エージェントの API をテストする: エージェントの
/run
エンドポイントに curl リクエストを送信して、エージェントの API をテストします。エージェントは、メッセージ フィールドを含む JSON ペイロードを想定しています。AGENT_BASE_URL は、http://${AGENT_IP}
(LoadBalancer の場合)またはhttp://localhost:8000
(ポート転送の場合)に置き換えます。新しいセッションを作成します。これにより、エージェントは新しい会話の準備をします。
# The user ID and session ID are arbitrary. # The appName must match the agent's Python package directory name (in this case, "capital-agent"). curl -X POST AGENT_BASE_URL/apps/capital-agent/users/user-123/sessions/session-123
次のコマンドを使用すると、利用可能なアプリを一覧表示できます。
curl -X GET AGENT_BASE_URL/list-apps
前の手順のセッションの詳細を使用して、エージェントにクエリを送信します。
curl -X POST AGENT_BASE_URL/run \ -H "Content-Type: application/json" \ -d '{ "appName": "capital-agent", "userId": "user-123", "sessionId": "session-123", "newMessage": { "role": "user", "parts": [{ "text": "Hello, agent! What can you do for me?" }] } }'
エージェントから JSON レスポンスが返されます。これは、リクエストが正常に処理され、Vertex AI を介して Gemini モデルとやり取りしたことを示します。レスポンスには、メッセージに基づいてエージェントが生成した返信が含まれます。
エージェントのウェブ UI にアクセスする(該当する場合): エージェントにウェブベースのユーザー インターフェースが含まれている場合は、ウェブブラウザで AGENT_BASE_URL に移動してアクセスします。通常、ADK には、操作とデバッグ用の基本的なウェブ UI が含まれています。たとえば、LoadBalancer を介してエージェントを公開し、その
EXTERNAL-IP
が34.123.45.67
の場合は、ブラウザでhttp://34.123.45.67
に移動します。Cloud Shell ターミナルで、
tutorials-and-examples/adk/vertex/
ディレクトリに移動します。cd tutorials-and-examples/adk/vertex/
このコマンドを実行して、Terraform 構成ファイルで定義されているすべてのリソースを削除します。
cd terraform terraform destroy
- Horizontal Pod Autoscaler(HPA)を構成して、エージェントのリソースをオンデマンドで自動的に調整する方法について説明します。
- Google Cloudで実行されているウェブ アプリケーション用に Identity-Aware Proxy(IAP)を構成し、エージェントの UI へのアクセスに対する一元的な認可を提供する方法について説明します。
- Cloud Logging と Cloud Monitoring を使用して、GKE クラスタ内のエージェントのパフォーマンスと健全性に関する分析情報を取得する方法を学習します。
- GKE AI Labs で、GKE を使用してエージェント AI イニシアチブを加速するのに役立つ試験運用版のサンプルを確認する。
環境を準備する
このチュートリアルでは、Cloud Shell を使用して Google Cloudでホストされているリソースを管理します。Cloud Shell には、
kubectl
、terraform
、Google Cloud CLI
など、このチュートリアルに必要なソフトウェアがプリインストールされています。Cloud Shell を使用して環境を設定するには、次の操作を行います。
サンプル プロジェクトのクローンを作成する
Google Cloud リソースを作成して構成する
エージェントを GKE にデプロイするには、必要なGoogle Cloud リソースをプロビジョニングします。エージェントをデプロイするには、コマンドラインを直接実行する gcloud CLI または Infrastructure as Code の Terraform を使用します。
gcloud
このセクションでは、Vertex AI とのシームレスな統合のために GKE クラスタ、Artifact Registry、Workload Identity Federation for GKE を設定する gcloud CLI コマンドについて説明します。環境を準備するの説明に従って、環境変数が設定されていることを確認します。
Terraform
このセクションでは、Terraform を使用して Google Cloudリソースをプロビジョニングする方法について説明します。クローンしたサンプル リポジトリには、必要な Terraform 構成ファイルが含まれています。
Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。
クラスタと通信を行うように
kubectl
を構成します。クラスタと通信するように
kubectl
を構成していない場合は、次のコマンドを実行します。gcloud container clusters get-credentials CLUSTER_NAME \ --location=${GOOGLE_CLOUD_LOCATION}
CLUSTER_NAME は、GKE クラスタの名前に置き換えます。
Workload Identity Federation for GKE のアクセスを構成する
Terraform を使用している場合は、この手順をスキップできます。このプロセスでは、Kubernetes サービス アカウント(KSA)を IAM サービス アカウントにリンクして、エージェントに Google Cloud サービスへのアクセス権を安全に付与します。
エージェント アプリケーションをデプロイして構成する
Google Cloud リソースを設定したら、エージェント アプリケーションをデプロイ用に準備し、GKE でランタイムを構成します。これには、エージェントのコードの定義、コンテナ化するための Dockerfile の作成、クラスタにデプロイするための Kubernetes マニフェストの作成が含まれます。
デプロイしたエージェントをテストする
エージェント アプリケーションがデプロイされ、公開されたので、その機能をテストします。
このセクションでは、エージェントのエンドポイントを特定してエージェントの API をテストする方法について説明します。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
デプロイされたリソースを削除する
このガイドで作成したリソースについて Google Cloud アカウントに課金されないようにするには、次のコマンドを実行します。
gcloud
gcloud container clusters delete CLUSTER_NAME \ --location=${GOOGLE_CLOUD_LOCATION} \ --project=$PROJECT_ID gcloud projects remove-iam-policy-binding $PROJECT_ID \ --member "serviceAccount:vertex-sa@$PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/aiplatform.user" gcloud iam service-accounts delete vertex-sa@$PROJECT_ID.iam.gserviceaccount.com gcloud artifacts repositories delete adk-repo \ --location=$GOOGLE_CLOUD_LOCATION \ --project=$PROJECT_ID
CLUSTER_NAME は、GKE クラスタの名前に置き換えます。
Terraform
次のステップ
-