將 Filestore 代理程式磁碟區與 GKE Agent Sandbox 搭配使用

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.yamlSandboxTemplate 資訊清單。 範本會設定 gVisor 執行階段設定、非根安全性環境,以及以 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

如要盡可能縮短沙箱啟動延遲時間,請定義名為 SandboxWarmPool 的資訊清單 sandbox-warmpool.yaml,以維持預先暖機的 Pod 執行個體:

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

代理程式工作階段開始時,請提交名為 SandboxClaim 的資訊清單,以聲明預先暖機的沙箱:sandbox-claim.yaml

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 名稱。

    記錄檔會確認 /workspace/session-init.txt 是在已掛接的 Filestore 磁碟區中建立。

後續步驟