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
为了最大限度地缩短沙盒启动延迟时间,请定义一个名为 sandbox-warmpool.yaml 的 SandboxWarmPool 清单,该清单可维护预热的 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.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
查找与您的版权主张关联的播客:
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 工作负载。
- 了解如何创建和管理卷池。