更新日:2025年11月18日
12分で読めます
このガイドでは、GitLabのAIパワーDevSecOpsプラットフォームを使用して、ADKベースのAIエージェントをGoogle Kubernetes Engineに簡単かつ安全にデプロイする方法を説明します。

AIエージェントの構築はワクワクするものですが、安全に本番環境にデプロイする作業は複雑であってはなりません。このチュートリアルでは、GitLabのネイティブGoogle Cloudインテグレーションを使用することで、AIエージェントをGoogle Kubernetes Engine(GKE)に組み込み、スキャン機能込みのサービスアカウントキーなしで簡単にデプロイする方法を学びます。
GKEは、OIDC認証を通じてGitLab CI/CDパイプラインとシームレスに接続するエンタープライズグレードのオーケストレーションを提供します。開発チームは、クラウドインフラに対する完全な可視性、コンプライアンス、制御を維持しながらAIエージェントをデプロイできます。このガイドでは、GoogleのAgent Development Kit(ADK)を使用してアプリを構築し、GitLabでデプロイされるので、さらにシームレスな体験が期待できます。
このアプローチの3つの主要なメリット:
完全なインフラ制御 - データ、ルール、環境のすべてが自社管理となります。AIエージェントの実行場所と設定方法を完全に制御できます。
ネイティブGitLabインテグレーション - 複雑な回避策は不要です。GitLabとGoogle Cloudのネイティブインテグレーションにより、既存のパイプラインがそのまま使用できます。
本番環境レベルのスケーリング - AIワークロードの拡大に合わせて、GKEがスケーリングと内部オーケストレーションの負荷を自動的に処理します。
重要なのは、GitLabとGKEの組み合わせにより、デベロッパーエクスペリエンスを犠牲にすることなく、AIデプロイメントに必要なエンタープライズレベルの信頼性を提供するということです。
開始前に、次のAPIが有効化されていることを確認してください:
また、次が用意されていることも確認してください:
GitLabのインテグレーションページに移動して、Google Cloud認証(IAM)を設定します。
設定 > インテグレーションに移動し、Google Cloudインテグレーションを設定します。グループレベルインテグレーションを使用している場合、デフォルト設定がプロジェクトにすでに継承されていることに注意してください。つまり、グループレベルで一度設定すれば、すべてのプロジェクトがこの設定を継承し、機能するようになります。
最初から設定する場合は、次の情報を提供します:
設定が完了すると、GitLabはGoogle Cloud ConsoleでCloud Shellを介して実行するスクリプトを提供します。このスクリプトを実行することで、適切なアクセスを有効にするために必要なサービスプリンシパルを備えたワークロードアイデンティティフェデレーションプールが作成されます。
GitLabのインテグレーション設定画面で、アーティファクト管理を設定します。
アーティファクト管理をクリックします。
Googleアーティファクトレジストリを選択します。
次の情報を提供します:
GitLabは、Google Cloud Consoleで実行する別のスクリプトを提供します。
重要: 次の手順に進む前に、ワークロードアイデンティティフェデレーションプールに次のロールを追加します:
これらの権限により、後続の手順でGitLabがGKEにデプロイできるようになります。
ここが重要な部分です。デプロイ用のCI/CDパイプラインの作成です。
ビルド > パイプラインエディタに移動し、4つのステージを持つパイプラインを定義します:
完全な.gitlab-ci.ymlは次のとおりです:
default:
tags: [ saas-linux-2xlarge-amd64 ]
stages:
- build
- test
- upload
- deploy
variables:
GITLAB_IMAGE: $CI_REGISTRY_IMAGE/main:$CI_COMMIT_SHORT_SHA
AR_IMAGE: $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/main:$CI_COMMIT_SHORT_SHA
GCP_PROJECT_ID: "your-project-id"
GKE_CLUSTER: "your-cluster"
GKE_REGION: "us-central1"
KSA_NAME: "ai-agent-ksa"
build:
image: docker:24.0.5
stage: build
services:
- docker:24.0.5-dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build -t $GITLAB_IMAGE .
- docker push $GITLAB_IMAGE
include:
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
- template: Jobs/Container-Scanning.gitlab-ci.yml
- template: Jobs/Secret-Detection.gitlab-ci.yml
- component: gitlab.com/google-gitlab-components/artifact-registry/upload-artifact-registry@main
inputs:
stage: upload
source: $GITLAB_IMAGE
target: $AR_IMAGE
deploy:
stage: deploy
image: google/cloud-sdk:slim
identity: google_cloud
before_script:
- apt-get update && apt-get install -y kubectl google-cloud-sdk-gke-gcloud-auth-plugin
- gcloud container clusters get-credentials $GKE_CLUSTER --region $GKE_REGION --project $GCP_PROJECT_ID
script:
- |
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-agent
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: ai-agent
template:
metadata:
labels:
app: ai-agent
spec:
serviceAccountName: $KSA_NAME
containers:
- name: ai-agent
image: $AR_IMAGE
ports:
- containerPort: 8080
resources:
requests: {cpu: 500m, memory: 1Gi}
limits: {cpu: 2000m, memory: 4Gi}
livenessProbe:
httpGet: {path: /health, port: 8080}
initialDelaySeconds: 60
readinessProbe:
httpGet: {path: /health, port: 8080}
initialDelaySeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: ai-agent-service
namespace: default
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: ai-agent
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ai-agent-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ai-agent
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target: {type: Utilization, averageUtilization: 70}
EOF
kubectl rollout status deployment/ai-agent -n default --timeout=5m
EXTERNAL_IP=$(kubectl get service ai-agent-service -n default -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "Deployed at: http://$EXTERNAL_IP"
only:
- main
これが機能する理由、そしてGKEにこの追加設定が必要な理由は、Vertex AIと連携できるKubernetesサービスアカウントがクラスター内に必要だからです。このサービスアカウントには、Google CloudのAI機能にアクセスする権限が必要です。
この設定なしでは、アプリケーションはデプロイできますが、AIエージェントが機能しません。Vertex AIにアクセスできるKubernetesサービスアカウントを作成する必要があります。
この1回限りのセットアップを実行します:
#!/bin/bash
PROJECT_ID="your-project-id"
GSA_NAME="ai-agent-vertex"
GSA_EMAIL="${GSA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
KSA_NAME="ai-agent-ksa"
CLUSTER_NAME="your-cluster"
REGION="us-central1"
# GCPサービスアカウントを作成
gcloud iam service-accounts create $GSA_NAME \
--display-name="AI Agent Vertex AI" \
--project=$PROJECT_ID
# Vertex AI権限を付与
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:${GSA_EMAIL}" \
--role="roles/aiplatform.user"
# クラスター認証情報を取得
gcloud container clusters get-credentials $CLUSTER_NAME \
--region $REGION --project $PROJECT_ID
# Kubernetesサービスアカウントを作成
kubectl create serviceaccount $KSA_NAME -n default
# アカウントをリンク
kubectl annotate serviceaccount $KSA_NAME -n default \
iam.gke.io/gcp-service-account=${GSA_EMAIL}
gcloud iam service-accounts add-iam-policy-binding ${GSA_EMAIL} \
--role=roles/iam.workloadIdentityUser \
--member="serviceAccount:${PROJECT_ID}.svc.id.goog[default/${KSA_NAME}]" \
--project=$PROJECT_ID
完了したら、この変更をパイプラインにプッシュすると、準備完了です。
パイプラインがデプロイされたことを確認できます。CI/CD > パイプラインに移動すると、4つのステージが表示されます:
GitLabとGoogle Cloudの組み合わせにより、AIエージェントをGKEに簡単かつ安全にデプロイできます。複雑な手順を踏む必要がなかったことが、おわかりいただけたと思います。GitLabのネイティブGoogle Cloudインテグレーションのおかげで実現できたのです。
デモ動画をご覧ください:
このチュートリアルの完全なコード例を使用して、今すぐ始めてみてください。まだGitLabユーザーでない場合は、無料トライアルでDevSecOpsプラットフォームをお試しください。Google Cloudでホストされているスタートアップ企業には、GitLabをお試しいただける特典があります。