云原生钻石课程 | 第1课:容器运行时技术深度剖析

本文深入探讨了容器技术的关键组成部分——容器引擎和运行时的工作原理,涵盖了CRI接口的不同实现方式,OCI规范及其典型实现(如runc),以及当前业界主流的容器运行时技术架构,包括runc、katacontainers和gVisor的特点与应用场景。

点击上方“程序猿技术大咖”,关注并选择“设为星标”

回复“加群”获取入群讨论资格!

本篇文章来自《华为云云原生王者之路训练营》钻石系列课程第1课,由华为云容器技术架构师冯老师主讲,深入介绍了容器技术的神秘面纱,揭开其背后的技术原理,给大家还原一个清晰的容器运行时技术全貌。

1

容器引擎和运行时机制原理剖析

容器引擎和运行时原理1:CRI接口

527d64f534676f0bbdc3f9c9b87baa8f.png

CRI接口: kubelet调用容器运行时的grpc接口

dockershim:kubernetes对接docker api的CRI接口适配器,kubernetes 1.21版本已经将其标注为废弃接口。

CRI-containerd: 通过containerd中的CRI插件实现了CRI接口,让containerd可直接对接containerd启动容器,无需调用docker api。当前使用最广泛的CRI接口接口实现。

CRI-O:专注于在kubernetes运行容器的轻量级CRI接口实现(不关注开发态)。

2a9f22b5fca13b4b1938869873f8929d.png

CRI接口

CRI接口主要包括RuntimeService和ImageService,RuntimeService主要负责容器运行时的一些接口, 包括负责容器的生命周期管理,包括容器创建,启动、停止、日志和性能采集等接口;ImageService负责容器镜像的管理,包括显示镜像、拉取镜像、删除镜像等接口。

容器引擎和运行时原理2:OCI runtime spec

721a3020da9cb8e035183e9962356eae.png

OCI组织: Linux基金会于2015年6月成立OCI(Open Container Initiative)组织,旨在围绕容器格式和运行时制定一个开放的工业化标准。目前主要有两个标准文档:容器运行时标准 (runtime spec)和 容器镜像标准(image spec)

Runtime spec:容器运行时标准,定义了容器状态和配置文件格式,容器生命周期管理命令格式和参数等。

runc: docker捐献给OCI社区的一个runtime spec的参考实现,docker容器也是基于runc创建的。

Kata-runtime:一种基于虚拟化的安全隔离的OCI runtime spec的实现。

gVisor: 一种基于系统调用拦截技术的轻量级安全容器实现。

395c3fd92c365b0134892bf09cbdffda.png

OCI文件格式

config.json:定义容器运行所需要的所有信息,包括rootfs、mounts、进程、cgroups、namespaces、caps等。

c051eedcd85cb1452a16227fe2b3648f.png

容器生命周期管理命令

命令:容器生命周期管理命令、包括创建、启动、停止、删除等。

容器引擎和运行时原理3:runtime v2

目的:让运行时更方便维护容器状态和生命周期,减少安全容器实现中,节点的进程数和资源调用。

3333964d47447993b832ca410b13deb8.png

shimv2: 新的容器运行时接口,基于ttrpc通信。

bd98a207e83e9fdd062ff0b3d31c6444.png

容器生命周期管理命令

容器引擎和运行时原理4:RuntimeClass

RuntimeClass: kubernetes中的对象类型,定义了在集群中的某种运行时,并且可以通过overhead和nodeSelector定制某种运行时的资源和调度行为。

e1e9ee287a3f28b85f72c8a2d00daa3a.png

RuntimeClass定义

Runtime Plugin: containerd中的runtime插件配置,定义了runtime名称、二进制路径、传递的annotation、特权容器模式等等。

runtimeClassName:pod的中的字段,通过该字段决定用那种运行时启动容器。

2

业界主流容器运行时技术架构剖析

业界主流容器运行时1:runc

Runc其实是最初Docker容器的实现,实际上它的容器就是一个进程,利用了Linux内核的特性对进程进行了许多限制,让进程看起来似乎运行在独立的环境中,主要有以下3种特性来对进程进行限制:

  • Namespace: 资源和信息的可见性隔离,通过namespace隔离,容器中的应用只能看到分配到该容器的资源、其他主机上的信息在容器中不可见。常用的namespace有PID(进程号)、MNT(挂载点)、NET(网络)、UTS(主机名)和IPC(跨进程通信)等

  • Cgroups:资源使用量的隔离,通过cgroup、限制了容器使用的资源量,通过不同的子系统,限制不同的资源。包括CPU、内存、io带宽、大页、fd数等等

  • Capability: 权限限制, 通过对进程的capability定义,限制容器中的进程调用某些系统调用,以达到容器进程无法逃逸到主机的目的, 比如容器中的进程是不具有以下capability的:SYS_ADMIN/MKNOD/SYS_RESOURCE/SYS_MODULES …

58ab899a7011d5595340edb6509208d8.png

Runc在主机或容器运行时如下图:

3a76fea95325e3d4cbf27ea2624eae68.png

业界主流容器运行时2:kata containers

kata containers是基于虚拟化来做的容器隔离,虚拟化隔离是指每个K8s pod都运行在一个独立的虚拟机中,提供虚拟化接口对接不同的虚拟化实现,包括qemu、cloud hypervisor、firecracker等等 。为了达到和容器近似的使用体验,需要对各组件进行裁剪,达到轻量化和启动加速的目的,对于hypervisor,去除通用虚拟化的各种不必要的设备、总线等。对于guest kernel,也裁剪了大量不需要的驱动和文件系统模块。而运行在虚拟机中的1号进程(一般为kata-agent),资源占用可小于1MB。

e9491dd81cfe1f6f7c1c375b5a3d774d.png

主机资源访问:通过virtio、vfio等方式访问主机资源,如virtio-blk(块设备)、virtio-fs(文件)、virtio-net(网络)、vfio(物理设备)、vhost-user(用户态网络或存储)

如下为kata containers运行时主机或容器的情况:

45d2dc0ca08eb43559e1ecb7ac87a16a.png

业界主流容器运行时3:gVisor

gVisor是通过拦截进程的系统调用来实现比runc更强的隔离,比kata更轻量。其拦截系统调用的方式有两种,ptrace和kvm。

3c2ecb44a4fe62486d2d572e06a99c17.png

优点:额外内存消耗小,容器启动速度快

缺点:系统调用慢,导致IO、网络等性能差,由于是模拟内核,有POSIX兼容性问题

如下为gVisor运行时主机或容器的效果:

2e5627269fdfef8bc852d2c44b46ac50.png

3

华为云容器运行时技术架构剖析

华为云中的容器运行时:Enhanced Kata Containers

77cd87727c2163cf144094d623615563.png

轻量化:hypervisor采用华为云自研的qemu-microvm, guest kernel采用裁剪EulerOS内核、主机shimv2采用rust语言重写。

丰富的硬件支持: GPU、nvlink、Ascend、IB、SDI

华为云基础设施融合:evs(块设备)、obs(对象存储)、sfs(文件存储)、vpc(华为云VPC网络)

产品形态:CCI(全托管的云容器实例)、CCE turbo(CCE增强版)

华为云中启动容器后的情况:

531d05bc7edbf09405f58f2883fae67d.png

4

容器运行时技术的发展方向

容器运行时技术的发展方向:更轻量、更安全

  • 通过rust改写,减少host进程,进一步轻量化hypervisor等方式实现更加轻量级的安全容器

  • 结合机密计算技术,实现更加安全的容器技术


感谢您的阅读,也欢迎您发表关于这篇文章的任何建议,关注我,技术不迷茫!

dd95f01373d6c9f510658bb63ab542d2.gif

6c575dc17cb44296aa1e6c80d343807c.gif

喜欢就点个"在看"呗,留言、转发朋友圈

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值