GKE で Agent Sandbox を有効にする

このドキュメントでは、Google Kubernetes Engine(GKE)クラスタでエージェント サンドボックス機能を有効にする方法について説明します。また、信頼できないコードを安全に実行するためのサンドボックス環境をクラスタに作成する方法についても説明します。

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

費用

Agent Sandbox は、GKE で追加料金なしで利用できます。作成したリソースには GKE の料金が適用されます。

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

始める前に

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

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

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

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

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

  3. Artifact Registry API と Google Kubernetes Engine API を有効にします。

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

    API を有効にするには、serviceusage.services.enable 権限を含む Service Usage 管理者 IAM ロール(roles/serviceusage.serviceUsageAdmin)が必要です。詳しくは、ロールを付与する方法をご覧ください。

    API を有効にする

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

    Cloud Shell をアクティブにする

  5. クラスタで GKE バージョン 1.35.2-gke.1269000 以降が実行されていることを確認します。

環境変数を定義する

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

export PROJECT_ID=$(gcloud config get project)
export CLUSTER_NAME="agent-sandbox-cluster"
export LOCATION="us-central1"
export CLUSTER_VERSION="1.35.2-gke.1269000"
export NODE_POOL_NAME="agent-sandbox-pool"
export MACHINE_TYPE="e2-standard-2"

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

  • PROJECT_ID: 現在の Google Cloud プロジェクトの ID。この変数を定義すると、GKE クラスタなどのすべてのリソースが正しいプロジェクトに作成されます。
  • CLUSTER_NAME: GKE クラスタの名前(例: agent-sandbox-cluster)。
  • LOCATION: GKE クラスタが作成される Google Cloud リージョンまたはゾーン。Autopilot クラスタを作成する場合はリージョン(us-central1 など)、Standard クラスタを作成する場合はゾーン(us-central1-a など)に設定します。
  • CLUSTER_VERSION: クラスタが実行する GKE のバージョン。エージェント サンドボックス機能には、バージョン 1.35.2-gke.1269000 以降が必要です。
  • NODE_POOL_NAME: サンドボックス化されたワークロードを実行するノードプールの名前(例: agent-sandbox-pool)。この変数は、GKE Standard クラスタを作成する場合にのみ必要です。
  • MACHINE_TYPE: ノードプール内のノードのマシンタイプ(e2-standard-2 など)。さまざまなマシンシリーズとさまざまなオプションの選択の詳細については、マシン ファミリーのリソースと比較ガイドをご覧ください。この変数は、GKE Standard クラスタを作成する場合にのみ必要です。

Agent Sandbox を有効にする

エージェント サンドボックス機能は、新しいクラスタを作成するとき、または既存のクラスタを更新するときに有効にできます。

新しい GKE クラスタを作成するときにエージェント サンドボックスを有効にする

フルマネージドの Kubernetes エクスペリエンスを実現するには、Autopilot クラスタを使用することをおすすめします。ワークロードに最適な GKE の運用モードを選択するには、GKE の運用モードを選択するをご覧ください。

Autopilot

エージェント サンドボックスを有効にして新しい GKE Autopilot クラスタを作成するには、--enable-agent-sandbox フラグを含めます。

gcloud beta container clusters create-auto ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --cluster-version=${CLUSTER_VERSION} \
    --enable-agent-sandbox

Autopilot クラスタの場合は、LOCATION 環境変数がリージョン(us-central1 など)に設定されていることを確認します。

標準

エージェント Sandbox を有効にして新しい GKE Standard クラスタを作成するには、クラスタを作成し、gVisor を有効にしてノードプールを追加してから、エージェント Sandbox 機能を有効にする必要があります。費用を抑えるには、プールごとに 1 つのノードを持つゾーンクラスタを作成することをおすすめします。

  1. クラスタを作成します。

    gcloud beta container clusters create ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --num-nodes=1 \
        --cluster-version=${CLUSTER_VERSION}
    

    この Standard クラスタでは、LOCATION 環境変数がゾーン(us-central1-a など)に設定されていることを確認します。

  2. 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
    

    LOCATION は、クラスタの作成時に使用したゾーンと同じである必要があります。

  3. クラスタを更新して Agent Sandbox 機能を有効にします。

    gcloud beta container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-agent-sandbox
    

既存の GKE クラスタを更新するときに Agent Sandbox を有効にする

既存のクラスタでエージェント サンドボックスを有効にするには、クラスタでバージョン 1.35.2-gke.1269000 以降を実行している必要があります。

LOCATION 環境変数が、既存のクラスタが配置されているリージョンまたはゾーンに設定されていることを確認します。

  1. GKE Standard クラスタを使用している場合、Agent Sandbox は gVisor に依存します。Standard クラスタに gVisor 対応のノードプールがない場合は、まずノードプールを作成する必要があります。

    gcloud container node-pools create ${NODE_POOL_NAME} \
        --cluster=${CLUSTER_NAME} \
        --machine-type=${MACHINE_TYPE} \
        --location=${LOCATION} \
        --image-type=cos_containerd \
        --sandbox=type=gvisor
    
  2. クラスタを更新して Agent Sandbox 機能を有効にします。

    gcloud beta container clusters update ${CLUSTER_NAME} \
        --location=${LOCATION} \
        --enable-agent-sandbox
    

構成を確認する

Agent Sandbox 機能が有効になっているかどうかを確認するには、クラスタの説明を調べます。

gcloud beta container clusters describe ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --format="value(addonsConfig.agentSandboxConfig.enabled)"

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

機能が正常に有効になると、コマンドは True を返します。

Agent Sandbox のデプロイ要件

SandboxSandboxTemplate などのワークロードを正常にデプロイするには、YAML マニフェストに特定のセキュリティ設定と構成設定を含める必要があります。GKE は、検証用アドミッション ポリシー(VAP)を使用してこれらの要件を適用します。これらの要件が満たされていない場合、アドミッション コントローラはデプロイを拒否します。

必要な構成

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

  • runtimeClassName: gvisor: Pod が gVisor Sandbox で実行されるようにします。
  • 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: truehostPID: true、または hostIPC: true
  • コンテナ セキュリティ コンテキストの privileged: true
  • HostPath 巻。
  • 機能を追加しました(capabilities.add)。
  • hostPort の設定。
  • カスタム sysctl。
  • サービス アカウント トークンまたは証明書の予測ボリューム。

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

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

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

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

SandboxTemplate と SandboxWarmPool を作成してサンドボックス環境をデプロイする手順は次のとおりです。

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

    apiVersion: extensions.agents.x-k8s.io/v1alpha1
    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/v1alpha1
    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
    

SandboxClaim を作成する

SandboxClaim は、テンプレートからサンドボックスをリクエストします。ウォームプールを作成したため、作成されたサンドボックスは新しい Pod を起動するのではなく、プールから実行中の Pod を採用します。

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

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

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

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

    kubectl get sandboxwarmpool,sandboxclaim,sandbox,pod
    

代替方法: Sandbox を直接作成する

ウォームプールで提供される高速な起動時間が必要ない場合は、テンプレートを使用せずにサンドボックスを直接デプロイできます。

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

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

    apiVersion: agents.x-k8s.io/v1alpha1
    kind: Sandbox
    metadata:
      name: sandbox-example-2
    spec:
      replicas: 1
      podTemplate:
        metadata:
          labels:
            sandbox: sandbox-example
        spec:
          runtimeClassName: gvisor
          restartPolicy: Always
          automountServiceAccountToken: false # Required
          securityContext:
            runAsNonRoot: true # Required
            runAsUser: 1000 # Required if image defaults to root (e.g. 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 を無効にする

エージェント サンドボックス機能を無効にするには、--no-enable-agent-sandbox フラグを指定して gcloud beta container clusters update コマンドを使用します。

gcloud beta container clusters update ${CLUSTER_NAME} \
    --location=${LOCATION} \
    --no-enable-agent-sandbox

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

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

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

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

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

次のステップ