将 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 运行时设置、非 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

为了最大限度地缩短沙盒启动延迟时间,请定义一个名为 sandbox-warmpool.yamlSandboxWarmPool 清单,该清单可维护预热的 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

当代理会话开始时,提交一个名为 sandbox-claim.yamlSandboxClaim 清单来声明预热的沙盒:

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. 查找与您的版权主张关联的播客:

    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

后续步骤