GKE に Agent Sandbox をインストールする

このドキュメントでは、Google Kubernetes Engine(GKE)クラスタにオープンソースの Agent Sandbox コントローラをインストールして、専用の Kubernetes Pod でサンドボックス化されたワークロードを実行する方法について説明します。また、信頼できないコードを安全に実行するために、クラスタにサンドボックス環境を作成する方法についても説明します。

GKE の Agent Sandbox が信頼できない AI 生成コードを分離する方法の概要については、GKE の Agent Sandbox についてをご覧ください。

Pod ベースのアーキテクチャとアクターベースのアーキテクチャのどちらかを選択する

GKE に Agent Sandbox をインストールする前に、AI エージェント ワークロードに適した GKE アーキテクチャを確認します。

  • GKE 上の Agent Substrate(アクターベース): ほとんどのエージェント ワークロード、特に頻繁に一時停止と再開を行うステートフル エージェントには、このアーキテクチャを使用します。アクティブなエージェントは、エージェントごとに専用の Pod を保持するのではなく、ウォーム Pod のプールを共有するため、より少ないノードでより多くのエージェントを実行できます。GKE の Agent Substrate は、アイドル状態のワークロードを自動的に一時停止して再開し、1 秒未満でストレージからエージェントを復元します。一方、GKE の Agent Sandbox では、手動で Pod のスナップショットを作成する必要があります。また、非アクティブ状態を検出してエージェントの進行状況を保存するアプリケーション コードを構築する必要があります。GKE 上の Agent Substrate には、GKE Standard クラスタが必要です。詳細については、GKE の Agent Substrate についてをご覧ください。このオプションをインストールするには、GKE に Agent Substrate をインストールするをご覧ください。
  • GKE 上の Agent Sandbox(Pod ベース): このドキュメントでインストールするこのアーキテクチャは、各エージェントに GKE Autopilot クラスタまたは Standard クラスタ上の専用の Kubernetes Pod が必要な場合に使用します。継続的にアクティブなエージェントや、次のいずれかを必要とするワークロードには、このオプションを選択します。
    • 宣言型 Kubernetes API(Sandbox カスタム リソースや SandboxClaim カスタム リソースなど)
    • カスタム サイドカーと init コンテナを含む、完全な Kubernetes PodSpec スキーマ
    • GPU や TPU などのハードウェア アクセラレータへの直接アクセス
    • GKE Autopilot クラスタ

費用

GKE の Agent Sandbox は、追加料金なしで使用できるオープンソース ソフトウェアです。作成したリソース(Agent Sandbox コントローラが使用するコンピューティング リソースなど)には、GKE の料金が適用されます。

不要な料金が発生しないように、このドキュメントの完了後に GKE を無効にするか、プロジェクトを削除してください。

始める前に

  1. Google Cloud コンソールのプロジェクト セレクタページで、 Google Cloud プロジェクトを選択または作成します。

    プロジェクトの選択または作成に必要なロール

    • プロジェクトを選択する: プロジェクトを選択する際に、特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトを選択できます。
    • プロジェクトを作成する: プロジェクトを作成するには、resourcemanager.projects.create 権限を含むプロジェクト作成者のロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。

    プロジェクト セレクタに移動

  2. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。

  3. Google Kubernetes Engine API が有効になっていない場合は、有効にします。

    API を有効にするために必要なロール

    API を有効にするには、serviceusage.services.enable 権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を介してこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を介してこの権限を取得できます。ロールを付与する方法を確認する。

    API の有効化

  4. Google Cloud コンソールで Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

環境変数を定義する

このドキュメントで実行するコマンドを簡略化するために、Cloud Shell で環境変数を設定できます。Cloud Shell で、次のコマンドを実行して環境変数を定義します。

export CLUSTER_NAME="agent-sandbox-cluster"
export LOCATION="us-central1"
export AGENT_SANDBOX_VERSION="v1.0.6"
export NODE_POOL_NAME="agent-sandbox-pool"
export MACHINE_TYPE="e2-standard-2"

これらの環境変数の説明は次のとおりです。

  • CLUSTER_NAME: GKE クラスタの名前(例: agent-sandbox-cluster)。
  • LOCATION: GKE クラスタが作成される Google Cloud リージョンまたはゾーン。Autopilot クラスタを作成する場合は、これをリージョン(us-central1 など)に設定します。Autopilot クラスタは常にリージョン クラスタです。Standard クラスタを作成する場合は、これをゾーン(us-central1-a など)に設定します。費用を削減するため、このドキュメントでは、リージョン クラスタよりも使用するノードが少ないゾーンクラスタを作成します。
  • AGENT_SANDBOX_VERSION: インストールするオープンソースの Agent Sandbox コントローラのバージョン。このドキュメントでは、バージョン 1.0.6 を使用します。他のバージョンを確認するには、Agent Sandbox のリリースページをご覧ください。
  • NODE_POOL_NAME: サンドボックス化されたワークロードを実行するノードプールの名前(例: agent-sandbox-pool)。この変数は、GKE Standard クラスタを作成する場合にのみ必要です。
  • MACHINE_TYPE: クラスタのデフォルト ノードプールと gVisor ノードプール内のノードのマシンタイプ(例: e2-standard-2)。さまざまなマシンシリーズとさまざまなオプションの選択の詳細については、マシン ファミリーのリソースと比較ガイドをご覧ください。この変数は、GKE Standard クラスタを作成する場合にのみ必要です。

GKE クラスタを作成する

GKE の Agent Sandbox は、gVisor または microVMs を使用して、サンドボックス化されたワークロードを分離します。サンドボックス ランタイムを指定しない場合、サンドボックスはカーネル分離なしで実行されます。これは、信頼できないコードにはおすすめしません。このドキュメントでは gVisor を使用します。Autopilot クラスタでは、gVisor が自動的に有効になります。Standard クラスタでは、gVisor が有効になっているノードプールを作成します。代わりに microVM を使用するには、microVM サンドボックス タイプを有効にするをご覧ください。推奨されるセキュリティ ポリシーでは gVisor のみが許可されるため、microVM を使用するサンドボックスは拒否されます。

Autopilot

Autopilot クラスタを作成するには、LOCATION 環境変数がリージョン(us-central1 など)に設定されていることを確認してから、次のコマンドを実行します。

gcloud container clusters create-auto ${CLUSTER_NAME} \
    --location=${LOCATION}

Standard

Standard クラスタを作成するには、クラスタを作成してから、gVisor が有効になっているノードプールを追加します。費用を削減するため、このドキュメントでは、プールごとに 1 つのノードを持つゾーンクラスタを作成します。

  1. LOCATION 環境変数をゾーン(us-central1-a など)に設定します。

    export LOCATION="us-central1-a"
    
  2. クラスタを作成します。

    gcloud container clusters create ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --machine-type=${MACHINE_TYPE} \
        --num-nodes=1
    
  3. gVisor を有効にして、独立したノードプールを作成します。

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

    gVisor の代わりに microVM を使用するには、microVM サンドボックス タイプを有効にするの説明に沿ってノードプールを作成します。このドキュメントの残りの部分では、gVisor を使用します。

代わりに既存の Standard クラスタを使用する場合は、クラスタに gVisor が有効になっているノードプールが含まれていることを確認します。クラスタにそのようなノードプールがない場合は、上記の gcloud container node-pools create コマンドを実行して作成します。

kubectl コマンドライン ツールがクラスタに接続できるように、クラスタの認証情報を取得します。

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

Agent Sandbox をインストールする

Agent Sandbox をインストールするには、Agent Sandbox GitHub リポジトリからリリース マニフェストを適用します。sandbox-with-extensions.yaml マニフェストは、Agent Sandbox コントローラと、Sandbox リソース、SandboxTemplate、SandboxClaim、SandboxWarmPool 拡張リソースの CustomResourceDefinition をインストールします。

  1. リリース マニフェストを適用します。

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

    このマニフェストは、agent-sandbox-system Namespace を作成し、その Namespace にコントローラをデプロイします。

  2. コントローラの準備が整うまで待ちます。

    kubectl rollout status deployment/agent-sandbox-controller \
        --namespace=agent-sandbox-system \
        --timeout=120s
    

Helm を使用して Agent Sandbox をインストールすることもできます。手順については、Agent Sandbox Helm チャートの README をご覧ください。

インストールを確認する

  1. Agent Sandbox CustomResourceDefinition がインストールされていることを確認します。

    kubectl get crd \
        sandboxes.agents.x-k8s.io \
        sandboxtemplates.extensions.agents.x-k8s.io \
        sandboxclaims.extensions.agents.x-k8s.io \
        sandboxwarmpools.extensions.agents.x-k8s.io
    

    出力には、4 つの CustomResourceDefinition が表示されます。

  2. コントローラが実行されていることを確認します。

    kubectl get deployment agent-sandbox-controller \
        --namespace=agent-sandbox-system
    

    コントローラが実行されている場合、READY 列に 1/1 と表示されます。

推奨されるセキュリティ ポリシーを適用する

デフォルトでは、GKE の Agent Sandbox は、サンドボックスを実行する Pod の構成を制限しません。サンドボックスの分離設定を適用するには、Agent Sandbox GitHub リポジトリから推奨される secure-sandbox-policy ValidatingAdmissionPolicy を適用します。このポリシーは、GKE での Agent Sandbox のデプロイ要件を満たしていない Sandbox リソースを拒否します。

  1. ポリシーを適用します。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/${AGENT_SANDBOX_VERSION}/examples/policy/vap/secure-sandbox-policy.yaml
    
  2. ポリシー バインディングを適用します。このバインディングにより、kube-system などのシステム Namespace を除くすべての Namespace にポリシーが適用されます。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/${AGENT_SANDBOX_VERSION}/examples/policy/vap/secure-sandbox-binding.yaml
    

このポリシーは Sandbox リソースを検証します。SandboxWarmPool リソースまたは SandboxClaim リソースを作成すると、コントローラは SandboxTemplate リソースから Sandbox リソースを作成します。テンプレートが要件を満たしていない場合、ポリシーは Sandbox リソースを拒否し、コントローラ ログにエラーが表示されます。ログを表示するには、次のコマンドを実行します。

kubectl logs deployment/agent-sandbox-controller \
    --namespace=agent-sandbox-system

このポリシーはユーザーが所有し、ワークロードに合わせて変更できます。詳細については、サンドボックスのセキュリティ ポリシーをご覧ください。

GKE での Agent Sandbox のデプロイ要件

推奨されるセキュリティ ポリシーを適用する場合、Sandbox リソースや SandboxTemplate リソースなどのワークロード マニフェストに、特定のセキュリティ設定と構成設定を含める必要があります。Sandbox リソースがこれらの要件を満たしていない場合、アドミッション コントローラはリソースを拒否します。コンテナの要件は、初期コンテナやエフェメラル コンテナなど、Pod 内のすべてのコンテナに適用されます。

必要な構成

デプロイ マニフェストには、次の設定を含める必要があります。

  • runtimeClassName: gvisor: Pod が gVisor サンドボックスで実行されるようにします。このポリシーは、microVM を含む他のランタイムを使用するサンドボックスを拒否します。
  • automountServiceAccountToken: false: Pod がデフォルトのサービス アカウント トークンを自動的にマウントしないようにします。
  • securityContext.runAsNonRoot: true: コンテナが root ユーザーとして実行されないようにします。
  • securityContext.capabilities.drop: ["ALL"]: コンテナからすべての Linux 機能を削除します。
  • resources.limits: サービス拒否(DoS)攻撃の可能性を防ぐために、CPU とメモリの上限を指定する必要があります。
  • nodeSelector: sandbox.gke.io/runtime: gvisor をターゲットにする必要があります。
  • tolerations: sandbox.gke.io/runtime=gvisor:NoSchedule taint の toleration を含める必要があります。

禁止されている構成

デプロイ マニフェストに次のいずれも含めてはなりません。

  • hostNetwork: true、hostPID: true、または hostIPC: true。
  • コンテナ セキュリティ コンテキストの privileged: true。
  • コンテナ セキュリティ コンテキストの procMount: Unmasked。
  • HostPath ボリューム。
  • 追加された機能(capabilities.add)。
  • hostPort の設定。
  • カスタム sysctl。
  • サービス アカウント トークンまたは証明書の投影ボリューム。

サンドボックス ルーターをデプロイする(省略可)

サンドボックス ルーターは、Agent Sandbox Python クライアントなどのクライアントからのリクエストを、サンドボックスを実行する Pod に転送する HTTP プロキシです。GKE で Agent Sandbox を使用して AI コード実行を分離するで説明されているように、Python クライアントを使用する場合は、ルーターをデプロイします。

ルーターを agent-sandbox-system Namespace にデプロイします。デフォルトでは、GKE の Agent Sandbox が各 SandboxTemplate リソースに作成するネットワーク ポリシーは、この Namespace 内のルーター Pod からのサンドボックスへの受信トラフィックのみを許可します。

  1. ルーターのサービス アカウントと、ルーターがサンドボックス Pod を検索できるようにする RBAC 権限を作成します。

    kubectl apply \
        -f https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/${AGENT_SANDBOX_VERSION}/sandbox-router/deploy/serviceaccount.yaml \
        -f https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/${AGENT_SANDBOX_VERSION}/sandbox-router/deploy/rbac.yaml
    
  2. ルーターをデプロイします。次のコマンドは、ルーター イメージをコントローラと同じバージョンに設定します。

    curl -sSL https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/${AGENT_SANDBOX_VERSION}/sandbox-router/deploy/deployment.yaml \
        | sed "s|sandbox-router-go:latest|sandbox-router-go:${AGENT_SANDBOX_VERSION}|" \
        | kubectl apply -f -
    
  3. ルーターの Service を作成します。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/${AGENT_SANDBOX_VERSION}/sandbox-router/deploy/service.yaml
    
  4. ルーターの準備が整うまで待ちます。

    kubectl rollout status deployment/sandbox-router \
        --namespace=agent-sandbox-system \
        --timeout=120s
    

このルーター構成は開発とテスト用です。TLS、レプリカ数、ルーターのネットワーク ポリシーなどの本番環境の設定については、サンドボックス ルーターのデプロイの README をご覧ください。

サンドボックス環境をデプロイする

SandboxTemplate リソースを定義してサンドボックス環境をデプロイし、SandboxWarmPool リソースを使用して、事前にウォームアップされたインスタンスを準備しておくことをおすすめします。SandboxClaim リソースを使用して、このウォームプールからインスタンスをリクエストできます。または、Sandbox リソースを直接作成することもできますが、このアプローチではウォームプールはサポートされません。

SandboxTemplate、SandboxWarmPool、SandboxClaim、Sandbox は Kubernetes カスタム リソースです。

SandboxTemplate リソースは、再利用可能なブループリントとして機能します。SandboxWarmPool リソースは、指定された数の事前にウォームアップされたサンドボックスが常に実行され、要求される準備ができていることを保証します。このカスタム リソースを使用すると、起動レイテンシを最小限に抑えることができます。

SandboxTemplate リソースと SandboxWarmPool リソースを作成してサンドボックス環境をデプロイするには、次の手順を完了します。

  1. Cloud Shell で、次の内容を含むファイルを sandbox-template.yaml という名前で作成します。

    apiVersion: extensions.agents.x-k8s.io/v1beta1
    kind: SandboxTemplate
    metadata:
      name: python-runtime-template
      namespace: default
    spec:
      podTemplate:
        metadata:
          labels:
            sandbox-type: python-runtime
        spec:
          runtimeClassName: gvisor # Required
          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: runtime
            image: registry.k8s.io/agent-sandbox/python-runtime-sandbox:v0.1.0
            ports:
            - containerPort: 8888
            resources:
              requests:
                cpu: "250m"
                memory: "512Mi"
              limits:
                cpu: "500m"
                memory: "1Gi" # Required
            securityContext:
              capabilities:
                drop: ["ALL"] # Required
          restartPolicy: OnFailure
    
  2. SandboxTemplate マニフェストを適用します。

    kubectl apply -f sandbox-template.yaml
    
  3. 次の内容で sandbox-warmpool.yaml という名前のファイルを作成します。

    apiVersion: extensions.agents.x-k8s.io/v1beta1
    kind: SandboxWarmPool
    metadata:
      name: python-runtime-warmpool
      namespace: default
      labels:
        app: python-runtime-warmpool
    spec:
      replicas: 2
      sandboxTemplateRef:
        # This must match the name of the SandboxTemplate.
        name: python-runtime-template
    
  4. SandboxWarmPool マニフェストを適用します。

    kubectl apply -f sandbox-warmpool.yaml
    
  5. ウォームプールのサンドボックスの準備が整うまで待ちます。

    kubectl wait sandboxwarmpool python-runtime-warmpool \
        --for=jsonpath='{.status.readyReplicas}'=2 \
        --timeout=600s
    

    プールのサンドボックスの準備が整う前に SandboxClaim リソースを作成すると、コントローラはプールからサンドボックスを割り当てるのではなく、クレーム用に新しいサンドボックスを作成することがあります。Autopilot クラスタでは、GKE がノードを作成する必要があるため、サンドボックスの準備が完了するまでに数分かかることがあります。

SandboxClaim リソースを作成する

SandboxClaim リソース リクエストは、ウォームプールからサンドボックスをリクエストします。ウォームプールを作成したため、コントローラは新しいサンドボックスを作成するのではなく、プールから実行中のサンドボックスをクレームに割り当てます。

SandboxClaim リソースを作成してウォームプールからサンドボックスをリクエストするには、次の操作を行います。

  1. 次の内容で sandbox-claim.yaml という名前のファイルを作成します。

    apiVersion: extensions.agents.x-k8s.io/v1beta1
    kind: SandboxClaim
    metadata:
      name: sandbox-claim
      namespace: default
    spec:
      warmPoolRef:
        # This must match the name of the SandboxWarmPool.
        name: python-runtime-warmpool
    
  2. SandboxClaim マニフェストを適用します。

    kubectl apply -f sandbox-claim.yaml
    
  3. サンドボックス、クレーム、ウォームプールが準備できていることを確認します。

    kubectl get sandboxwarmpool,sandboxclaim,sandbox,pod
    

代替方法: Sandbox リソースを直接作成する

ウォームプールによる高速起動時間が不要な場合は、テンプレートを使用せずに Sandbox リソースを直接デプロイできます。

Sandbox リソースを直接作成してサンドボックス環境をデプロイする手順は次のとおりです。

  1. 次の内容で sandbox.yaml という名前のファイルを作成します。

    apiVersion: agents.x-k8s.io/v1beta1
    kind: Sandbox
    metadata:
      name: sandbox-example-2
    spec:
      podTemplate:
        metadata:
          labels:
            sandbox: sandbox-example
        spec:
          runtimeClassName: gvisor
          restartPolicy: OnFailure
          automountServiceAccountToken: false # Required
          securityContext:
            runAsNonRoot: true # Required
            runAsUser: 1000 # Required if image defaults to root (for example, busybox)
          nodeSelector:
            sandbox.gke.io/runtime: gvisor
          tolerations:
          - key: "sandbox.gke.io/runtime"
            value: "gvisor"
            effect: "NoSchedule" # Required
          containers:
          - name: my-container
            image: busybox
            command: ["/bin/sh", "-c"]
            args: ["sleep 3600000; echo 'Container finished successfully'; exit 0"]
            securityContext:
              capabilities:
                drop: ["ALL"] # Required
              allowPrivilegeEscalation: false
            resources:
              limits:
                cpu: "100m"
                memory: "128Mi" # Required
    
  2. Sandbox マニフェストを適用します。

    kubectl apply -f sandbox.yaml
    
  3. サンドボックスが実行されていることを確認します。

    kubectl get sandbox
    

Agent Sandbox をアップグレードする

Agent Sandbox をアップグレードするには、新しいバージョンのリリース マニフェストを適用します。

export AGENT_SANDBOX_VERSION="NEW_VERSION"
kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/${AGENT_SANDBOX_VERSION}/sandbox-with-extensions.yaml

NEW_VERSION は、インストールするバージョン(Agent Sandbox のリリース ページに記載されているバージョンなど)に置き換えます。

アップグレードする前に、新しいバージョンのリリースノートを確認してください。クラスタで 1.0.0 より前のバージョンの Agent Sandbox が実行されている場合は、アップグレードする前にリソースを v1beta1 API に移行する必要があります。これは、バージョン 1.0.0 で v1alpha1 API が削除されたためです。手順については、API 移行ガイドをご覧ください。

Sandbox Router をデプロイした場合、または推奨されるセキュリティ ポリシーを適用した場合は、新しいバージョンでこれらの手順を繰り返します。

Agent Sandbox をアンインストールする

  1. まだ使用中の Agent Sandbox リソースを確認します。

    kubectl get sandboxes,sandboxclaims,sandboxwarmpools,sandboxtemplates \
        --all-namespaces
    
  2. 推奨されるセキュリティ ポリシーを適用した場合は、ポリシー バインディングとポリシーを削除します。

    kubectl delete validatingadmissionpolicybinding secure-sandbox-binding
    kubectl delete validatingadmissionpolicy secure-sandbox-policy
    
  3. サンドボックス ルーターをデプロイした場合は、クラスタ全体の RBAC リソースを削除します。

    kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/agent-sandbox/${AGENT_SANDBOX_VERSION}/sandbox-router/deploy/rbac.yaml
    

    ルーターの他のリソースは agent-sandbox-system Namespace にあります。これは次のステップで削除されます。

  4. Agent Sandbox コントローラ、その Namespace、CustomResourceDefinition を削除するには、インストールしたバージョンのリリース マニフェストを削除します。

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

リソースのクリーンアップ

Google Cloud アカウントに課金されないようにするには、作成した GKE クラスタを削除します。

gcloud container clusters delete ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --quiet

Autopilot クラスタを作成した場合、ロケーションはリージョン(us-central1 など)です。Standard クラスタを作成した場合、ロケーションはゾーン(us-central1-a など)です。

次のステップ