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
マウントされたボリュームを確認する
クレームが Pod にバインドされていることを確認します。
kubectl get sandboxclaim agent-session-1
申し立てに関連付けられている Pod を見つけます。
kubectl get pods -l extensions.agents.x-k8s.io/claimed-by=agent-session-1
ボリュームが要求されたコンテナ内にマウントされていることを確認します。
kubectl logs POD_NAME -c agent-container
POD_NAMEは、前の手順で返された Pod の名前に置き換えます。ログは、マウントされた Filestore ボリュームに
/workspace/session-init.txtが作成されたことを確認します。
次のステップ
- 遅延バインディングを使用した Agent Sandbox をご覧ください。
- セルフマネージド GKE ワークロードをデプロイします。
- ボリューム プールの作成と管理の方法を学習する。