Harbor权威指南:容器镜像、Helm Chart等云原生制品的管理与实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 虚拟机和容器的融合

容器是将应用及其依赖封装在一起的应用环境,在同一台机器上运行的不同容器共享一个操作系统的内核,每个容器都通过用户态的进程进行隔离。容器的优点是消耗资源少,启动快,便于在不同的操作系统中迁移。虚拟机是对物理硬件的抽象,包含操作系统和若干应用及其依赖。Hypervisor允许一台机器运行多台虚拟机。虚拟机的优点是硬件层隔离,更加安全,工具更容易获得;缺点是比较厚重,启动慢。容器和虚拟机的对比如图1-6所示。

img

图1-6

在公有云和企业等场景中对隔离性和安全性有较高的要求,而容器技术共享操作系统内核,不能完全满足需求,因此业界出现了如Kata containers、gVisor、vSphere Integrated Containers、vSphere Pod等项目,主要采用轻量级虚拟机的方式实现容器运行时,目的是提供虚拟机的安全级别和容器的运行效率。本节主要介绍基于虚拟机的容器运行时vSphere Pod和Kata Containers。

1.3.1 vSphere Pod

Pod是Kubernetes中能够创建和管理的最小计算部署单元,一个Pod是由一组(一个或多个)共享存储、网络的容器及运行容器的规范构成。Pod共享的内容包括Linux的命名空间、控制组及其他能够隔离的内容。Pod中的容器共享一个IP地址和端口空间,可以通过localhost访问,也可以使用标准的进程间通信技术进行互通,如共享内存和System V信号量。不同Pod中的容器需要通过该Pod的IP地址互通。

vSphere Pod是VMware vSphere 7中的容器运行时,将Kubernetes的Pod跑在一个专属的轻量级虚拟机上,并维持Pod的属性。vSphere Pod的优点是使Pod具有虚拟机一样的安全隔离级别,而且能够继承虚拟机的热迁移、快照等功能。vSphere Pod的架构如图1-7所示。

img

图1-7

为了实现vSphere Pod,ESXi Hypervisor引入了Spherelet的组件。Spherelet是个用户态的程序,实现了与kubelet相似的功能,从而把ESXi节点转变成Kubernetes的worker节点。同时,ESXi增加了新的容器运行环境CRX。每个CRX实例都类似于一个虚拟机,与其他用户态的进程和ESXi的进程做了很好的隔离。CRX包含一个极简的Linux(Photon OS)内核,该内核只保留必要的设备驱动和功能程序,保证内核能够非常轻量且快速启动。经过性能优化后,CRX可以在100毫秒内启动。CRX还提供了Linux应用的二进制接口ABI(Application Binary Interface),可运行Pod里Linux的应用程序。CRX实例保持与Spherelet通信,以实现Kubernetes期望Pod达到的状态,如健康检查、挂载存储、设置网络、控制Pod里的容器状态等。

1.3.2 Kata Containers

Kata Containers是在2017年由Hyper的runV和Intel的Clear Containers项目合并而成的开源项目,通过轻量级的虚拟机实现安全容器,利用硬件虚拟化技术提供更好的应用隔离环境。Kata Containers的架构如图1-8所示。

img

图1-8

Kata Containers一般在Kubernetes环境下使用。kubelet通过CRI调用containerd或CRI-O,再调用Kata Containers执行运行时操作。按照1.2.3节中的分类,Kata Containers属于低层运行时,只负责运行符合OCI运行时规范的容器。而容器镜像操作由高层运行时(如containerd等)来完成,并把需要执行的运行时操作生成一个符合OCI规范的文件系统包,再交给Kata Containers执行,具体过程如下。

(1)每个Pod都会有一个Shim-v2进程对接containerd/CRI-O,以响应各种运行时操作,Shim-v2进程和对应Pod的生命周期相同。

(2)Shim-v2会启动一个虚拟机,为Pod提供隔离。在虚拟机中运行着一个精简过的Linux内核,去除了没有必要的设备(如键盘、鼠标等)。精简的目的与vSphere Pod类似,都是为了缩短Pod(虚拟机)的启动时间。目前支持的虚拟机技术有QEMU、Firecracker、ACRN和Cloud-Hypervisor。

(3)在虚拟机启动时,由高层运行时(containerd等)准备好的rootfs等文件系统会以热插拔的方式动态映射到虚拟机中。

(4)按照CRI的定义和OCI的规范,在同一个Pod里面可以运行多个相关容器,它们会在Pod所在的虚拟机里同时运行,并且共享命名空间。

(5)外部的存储卷可以用块设备或文件系统共享的方式加入虚拟机中,但从虚拟机里容器的角度来看,它们都是挂载好的文件系统。

(6)Pod的虚拟机可以使用各种CNI插件支持容器的网络,实现对外连接。

Kata Containers是个完整的容器运行时,采用了虚拟机技术来隔离,以容器接口提供服务,和vSphere Pod有异曲同工之妙。