GKE Agent Sandbox で Filestore エージェント ボリュームを使用する

Google Kubernetes Engine(GKE)Agent Sandbox は、gVisor を使用して、信頼できないモデル生成コードにカーネルレベルの分離を提供します。GKE Agent Sandbox と Filestore エージェント ボリュームを組み合わせることで、永続的な高密度ファイル ストレージに支えられた安全な分離環境を実現できます。

このガイドでは、gVisor 対応のノードプールを構成し、Filestore ボリューム請求テンプレートを使用して SandboxTemplate を定義し、SandboxWarmPool でサンドボックスを事前準備し、SandboxClaim でサンドボックスを請求する方法について説明します。

始める前に

Filestore エージェント ボリューム用に GKE 環境を設定するで、クラスタと CSI ドライバの設定を完了します。

gVisor 対応のノードプールを作成する

gVisor サンドボックス分離で構成された専用ノードプールを作成します。

gcloud container node-pools create gvisor-pool \
    --cluster=CLUSTER_NAME \
    --location=REGION \
    --project=PROJECT_ID \
    --image-type=cos_containerd \
    --sandbox=type=gvisor \
    --num-nodes=2 \
    --machine-type=n2-standard-16 \
    --enable-autoscaling \
    --min-nodes=1 \
    --max-nodes=10 \
    --scopes=cloud-platform

次のように置き換えます。

  • CLUSTER_NAME: GKE クラスタの名前。
  • REGION: クラスタが存在するリージョン。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。

SandboxTemplate を作成する

warmpool-filestore-template.yaml という名前の SandboxTemplate マニフェストを定義します。このテンプレートは、gVisor ランタイム設定、非 root セキュリティ コンテキスト、volume-pool-sc StorageClass をターゲットとする volumeClaimTemplates ブロックを構成します。

apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxTemplate
metadata:
  name: warmpool-filestore-template
  namespace: default
spec:
  podTemplate:
    spec:
      runtimeClassName: gvisor
      automountServiceAccountToken: false
      securityContext:
        runAsNonRoot: true
        runAsUser: 1000
        fsGroup: 1000
      nodeSelector:
        sandbox.gke.io/runtime: gvisor
      tolerations:
        - key: "sandbox.gke.io/runtime"
          value: "gvisor"
          effect: "NoSchedule"
      containers:
        - name: agent-container
          image: busybox
          command: ["/bin/sh", "-c"]
          args:
            - |
              echo "Sandbox started with Filestore volume mounted!"
              ls -la /workspace
              date > /workspace/session-init.txt
              cat /workspace/session-init.txt
              sleep 3600
          securityContext:
            capabilities:
              drop: ["ALL"]
            allowPrivilegeEscalation: false
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"
          volumeMounts:
            - name: agent-workspace
              mountPath: /workspace
  volumeClaimTemplates:
    - metadata:
        name: agent-workspace
      spec:
        accessModes: ["ReadWriteMany"]
        storageClassName: "volume-pool-sc"
        resources:
          requests:
            storage: "1Gi"

次のようにマニフェストを適用します。

kubectl apply -f warmpool-filestore-template.yaml

SandboxWarmPool を作成する

サンドボックスの起動レイテンシを最小限に抑えるには、事前にウォームアップされた Pod インスタンスを維持する sandbox-warmpool.yaml という名前の SandboxWarmPool マニフェストを定義します。

apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxWarmPool
metadata:
  name: filestore-warmpool
  namespace: default
spec:
  replicas: 3
  sandboxTemplateRef:
    name: warmpool-filestore-template

次のようにマニフェストを適用します。

kubectl apply -f sandbox-warmpool.yaml

ウォームプールの Pod の準備ができていることを確認します。

kubectl get sandboxwarmpool filestore-warmpool -n default

サンドボックス Pod を要求する

エージェント セッションが開始されたら、sandbox-claim.yaml という名前の SandboxClaim マニフェストを送信して、事前準備されたサンドボックスをリクエストします。

apiVersion: extensions.agents.x-k8s.io/v1alpha1
kind: SandboxClaim
metadata:
  name: agent-session-1
  namespace: default
spec:
  sandboxTemplateRef:
    name: warmpool-filestore-template

次のようにマニフェストを適用します。

kubectl apply -f sandbox-claim.yaml

マウントされたボリュームを確認する

  1. クレームが Pod にバインドされていることを確認します。

    kubectl get sandboxclaim agent-session-1
    
  2. 申し立てに関連付けられている Pod を見つけます。

    kubectl get pods -l extensions.agents.x-k8s.io/claimed-by=agent-session-1
    
  3. ボリュームが要求されたコンテナ内にマウントされていることを確認します。

    kubectl logs POD_NAME -c agent-container
    

    POD_NAME は、前の手順で返された Pod の名前に置き換えます。

    ログは、マウントされた Filestore ボリュームに /workspace/session-init.txt が作成されたことを確認します。

次のステップ