在eks上使用gVisor运行时部署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。可以提供灵活的资源占用同时降低虚拟化的固定成本,但是也存在应用程序兼容性降低和每系统调用开销的问题。

img

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

gVisor architecture diagram

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 = 3runtime_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成功启动了

image-20260127002811694

检查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

进程信息如下

image-20260127003204390

参考sig规范创建sandbox

agent-sandbox 能够轻松管理隔离的、有状态的、单例工作负载。CRD如下

  • Sandbox CRD 是 agent-sandbox 的核心,用于管理具有稳定身份和持久存储的单个有状态 Pod
  • extensions 模块提供额外的 CRDs 和控制器,它们基于核心 Sandbox API 构建,以提供更高级的功能。
    • SandboxTemplate :用于创建 Sandboxes模板更容易管理大量类似的 Sandboxes
    • SandboxClaim : 允许用户从模板创建 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如下

image-20260127004933602

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

posted @ 2026-01-27 00:51  zhaojie10  阅读(31)  评论(0)    收藏  举报