在eks上使用gVisor运行时部署agent-sandbox
参考资料
- 专用沙盒环境的必要性与实践方案
- Enhancing Kubernetes workload isolation and security using Kata Containers
- Kubernetes Agent Sandbox AI Security
- google Isolate AI code execution with Agent Sandbox
- https://github.com/kubernetes-sigs/agent-sandbox.git
- https://www.infoq.cn/article/2018/05/gvisor-container-sandbox
- https://gvisor.dev/docs/
- OpenKruise Agents 开源! 云原生的 Agent Sandbox 基础设施加速落地
gVisor如何解决容器隔离问题
Machine-level virtualization、Rule-based execution和gVisor 的比较
- Machine-level virtualization,例如KVM通过虚拟机监控程序(VMM)将虚拟化硬件暴露给guest kernel,在独立的虚拟机中运行容器可以提供很好的隔离、兼容性和性能。但对于容器来说通常需要额外的proxies和agent,并且可能需要更大的资源占用和更慢的启动时间。
- Rule-based execution,例如seccomp、SELinux 和 AppArmor,允许为应用程序或容器指定细粒度的安全策略。这些方案通常依赖于主机内核中实现的钩子来执行规则。但是为以往未知的应用程序可靠地定义策略可能极其困难
- gVisor 拦截应用程序的系统调用,并充当guest kernel,无需通过虚拟化硬件进行翻译。可以视作强化班强化版的 seccomp。可以提供灵活的资源占用同时降低虚拟化的固定成本,但是也存在应用程序兼容性降低和每系统调用开销的问题。

gVisor 是一个作为普通非特权进程运行的内核,支持大多数的 Linux 系统调用。就像在 VM 中一样,在 gVisor 沙箱中运行的应用程序有自己的内核和虚拟设备。

gVisor 沙盒被分成了两个独立的进程,这些进程共同构成一个可以运行一个或多个容器的环境
- Sentry ,应用内核,拦截和响应用户程序发起的系统调用的内核(不会将系统调用传递给主机内核)。实现了应用所需的所有内核功能,包括:系统调用、信号传递、内存管理和页面错误逻辑、线程模型等。
- Gofer,为容器提供文件系统访问。Sentry 无法直接打开文件;超出沙盒范围(不包括内部的
/proc文件、管道等)的文件系统操作会被发送到下面描述的 Gofer。
由于 gVisor 运行在普通的内核用户空间(User Space),它只依赖于宿主机的两个标准内核特性:
- ptrace:使用SYSEMU功能执行用户代码,不需要执行主机系统调用
- KVM:可以利用 KVM 来提升性能,使 Sentry 充当客户 OS 和虚拟机监视器(VMM)
gVisor 运行时通过runsc集成了 Docker 和 Kubernetes,runsc 运行时可以和runc 互换。runsc 运行的filesystem bundles由一个包含容器配置的 config.json 文件和容器的根文件系统组成。
EKS环境中配置gVisor运行时
在节点上安装runsc和containerd-shim-runsc-v1
ARCH=$(uname -m)
URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH}
wget ${URL}/runsc ${URL}/containerd-shim-runsc-v1
chmod a+rx runsc containerd-shim-runsc-v1
sudo mv runsc containerd-shim-runsc-v1 /usr/local/bin
在节点上配置containerd增加如下内容,由于使用containerd 2.x需要按照如下version=3的版本修改
- 确保下载的
containerd-shim-runsc-v1文件位于/usr/local/bin或/usr/bin。因为version = 3的runtime_type会自动根据这个名称去$PATH中寻找对应的 shim
# 在/etc/containerd/config.toml末尾添加
[plugins."io.containerd.cri.v1.runtime".containerd.runtimes.runsc]
runtime_type = "io.containerd.runsc.v1"
重启containerd
sudo systemctl restart containerd
测试运行时配置
sudo ctr run -n k8s.io run --runtime io.containerd.runsc.v1 -t --rm 037047667284.dkr.ecr.cn-north-1.amazonaws.com.cn/hello-world:latest hello-wrold
在eks中安装runtime
cat <<EOF | kubectl apply -f -
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: gvisor
handler: runsc
EOF
创建pod
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-gvisor
spec:
replicas: 1
selector:
matchLabels:
app: nginx-gvisor
template:
metadata:
labels:
app: nginx-gvisor
spec:
runtimeClassName: gvisor
containers:
- name: nginx
image: 037047667284.dkr.ecr.cn-north-1.amazonaws.com.cn/nginx:latest
ports:
- containerPort: 80
EOF
配置完毕后pod成功启动了

检查pod的启动系统日志如下
$ kubectl exec nginx-gvisor-77498f96c7-4w5j5 -- dmesg
[ 0.000000] Starting gVisor...
[ 0.282447] Accelerating teletypewriter to 9600 baud...
[ 0.629297] Creating cloned children...
[ 0.789447] Mounting deweydecimalfs...
[ 1.161624] Reticulating splines...
[ 1.518537] Reading process obituaries...
[ 1.647822] Conjuring /dev/null black hole...
[ 1.937711] Granting licence to kill(2)...
[ 2.130351] Adversarially training Redcode AI...
[ 2.333896] Searching for socket adapter...
[ 2.749263] Preparing for the zombie uprising...
[ 2.978820] Ready!
gvisor模拟的gusest kernel信息
$ kubectl exec nginx-gvisor-77498f96c7-4w5j5 -- cat /proc/version
Linux version 4.4.0 #1 SMP Sun Jan 10 15:06:54 PST 2016
进程信息如下

参考sig规范创建sandbox
agent-sandbox 能够轻松管理隔离的、有状态的、单例工作负载。CRD如下
SandboxCRD 是 agent-sandbox 的核心,用于管理具有稳定身份和持久存储的单个有状态 Podextensions模块提供额外的 CRDs 和控制器,它们基于核心SandboxAPI 构建,以提供更高级的功能。SandboxTemplate:用于创建 Sandboxes模板更容易管理大量类似的 SandboxesSandboxClaim: 允许用户从模板创建 Sandbox抽象了底层 Sandbox 配置的细节SandboxWarmPool: 管理预先预热好的 Sandbox Pod 池减少冷启动时间
# To install only the core components:
kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/v0.1.0/manifest.yaml
# To install the extensions components:
kubectl apply -f https://github.com/kubernetes-sigs/agent-sandbox/releases/download/v0.1.0/extensions.yaml
创建sandbox
apiVersion: agents.x-k8s.io/v1alpha1
kind: Sandbox
metadata:
name: my-sandbox
spec:
podTemplate:
spec:
runtimeClassName: gvisor
containers:
- name: aiosandbox
image: enterprise-public-cn-beijing.cr.volces.com/vefaas-public/all-in-one-sandbox:latest
创建一个mcp服务
apiVersion: agents.x-k8s.io/v1alpha1
kind: Sandbox
metadata:
name: my-mcp
spec:
podTemplate:
spec:
runtimeClassName: gvisor
containers:
- name: my-mcp
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/node:20-alpine3.20
command: ["npx"]
args: ["-y", "@modelcontextprotocol/server-everything", "streamableHttp"]
ports:
- containerPort: 3001
启动成功listtools如下

此外,社区OpenKruise Agents 项目还为沙盒管理提供了更高级 API,能够高效地进行资源分配、用户管理和流量路由。并且保持了与 Sig Agent-Sandbox 的兼容性,可以关注一下。

浙公网安备 33010602011771号