目录

一、gVisor介绍

二、gVisor架构

三、gVisor使用前置条件

四、Docker中使用gVisor

五、containerd中使用gVisor

六、Kubernetes结合gVisor使用

一、gVisor介绍

        gVisor是Google开源的一种容器沙箱技术,其设计初衷是在提供较高安全性的同时,尽量减少对性能的影响。通过创建一个用户空间内核,gVisor拦截并处理容器内应用程序的系统调用,从而实现对容器内进程与宿主机内核间交互的隔离。这种设计有效防止了恶意程序利用内核漏洞对宿主机造成影响。gVisor兼容OCI标准,可以无缝集成到Docker和Kubernetes(K8s)中,使其部署和使用变得更为便捷。

项目地址:gVisor GitHub

优点:增强了容器的安全性,有效隔离了容器与宿主机内核的直接交互。

缺点:由于增加了一层抽象,会带来额外的性能开销,尤其是在系统调用频繁的场景下更为明显

二、gVisor架构

gVisor的架构主要由以下三个组件构成:

Runsc(Runtime Sandbox):一种运行时引擎,负责创建和销毁容器,是gVisor与容器生命周期管理交互的接口。Sentry:核心组件,负责处理容器内的系统调用。Sentry运行在用户空间,模拟Linux内核的行为,处理来自容器内部的系统调用请求。Gofer:负责文件系统的操作代理。所有的IO请求都会通过Gofer转发到宿主机上,从而实现文件系统操作的隔离和控制。

用户可通过Docker或containerd等容器引擎创建基于runsc的容器。容器进程的系统调用会被Sentry拦截处理,需要宿主机文件系统支持的操作会通过Gofer代理转发。

三、gVisor使用前置条件

内核要求:Linux 4.14.77+

Docker版本要求:Docker version 17.09.0及以上

系统架构要求: x86_64 和 ARM64 

四、Docker中使用gVisor

1、安装runsc 下载最新版本runsc二进制文件,放到 PATH 环境变量目录下,如 /usr/local/bin

参考文档:Installation - gVisor

set -e

ARCH=$(uname -m)

URL=https://storage.googleapis.com/gvisor/releases/release/latest/${ARCH}

wget ${URL}/runsc ${URL}/runsc.sha512 \

${URL}/containerd-shim-runsc-v1 ${URL}/containerd-shim-runsc-v1.sha512

sha512sum -c runsc.sha512 \

-c containerd-shim-runsc-v1.sha512

rm -f *.sha512

chmod a+rx runsc containerd-shim-runsc-v1

mv runsc containerd-shim-runsc-v1 /usr/local/bin

方法一:

2、配置Docker daemon 编辑dockerd配置文件(如/etc/docker/daemon.json),新增以下配置:

{

"runtimes": {

"runsc": {

"path": "/usr/local/bin/runsc"

}

}

}

方法二:

2、执行install命令

/usr/local/bin/runsc install

 3、重启dockerd使配置生效

systemctl restart docker

4、运行容器时指定 --runtime=runsc 参数,切换到gVisor runsc运行时

docker run --runtime=runsc --rm hello-world

验证

使用gvisor创建的容器,内核版本已经变为4.4

未使用gvisor创建的容器,内核版本已经变为3.10,与宿主机内核版本一致

五、containerd中使用gVisor

containerd通过插件形式支持runsc,需先安装配置runsc插件。

1、安装gVisor containerd shim 下载containerd-shim-runsc-v1并放到/usr/local/bin/目录。

2、生成containerd配置

containerd config default > /etc/containerd/config.toml

3、在 config.toml 的 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] 段添加:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runsc]

runtime_type = "io.containerd.runsc.v1"

4、重启containerd

sudo systemctl restart containerd

在 Pod 或容器运行时,将 runtimeClassName 指定为 runsc 即可。

六、Kubernetes结合gVisor使用

1、安装gvisor,可参考前面 在Docker中使用gVisor 的步骤

2、创建 RuntimeClass,指定gvisor作为runtime handler。         runtimeclass.yaml

apiVersion: node.k8s.io/v1

kind: RuntimeClass

metadata:

name: gvisor #RuntimeClass名称

handler: runsc #对应CRI配置名称

3、创建使用gvisor运行时的Pod 在container spec中指定 runtimeClassName: gvisor         pod.yaml

apiVersion: v1

kind: Pod

metadata:

name: mypod

spec:

runtimeClassName: gvisor

containers:

- name: hello

image: busybox

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。