本文的所有分析是基于Kata
容器1.6.2版本。
在参加了2019年伦敦OpenInfra Days的Kata容器研讨会之后,我们对它们的启动时间印象比较深刻,与Kubernetes
集群中的普通runC
容器相比仅稍慢一些。我们自然而然的对它们的磁盘I/O绑定性能以及它们是否也符性能要求感到好奇。在本文中,我们将探讨这个主题,以了解在I/O绑定性能和安全性都是关键需求的环境中使用此技术的利弊。
什么是Kata容器?
Kata容器是轻量级vm,旨在与Docker
和Kubernetes
等容器编排软件无缝集成。设想的一个用例是运行不受信任的工作负载,利用不与主机共享操作系统内核所获得的额外隔离。然而,在最近一次对虚拟机和容器的调查中,使用宿主机内核导致额外安全性这一毫无疑问的假设受到了挑战。Kata
源于Intel Clear Containers
和Hyper runV
技术。gVisor
的目标是通过过滤和重定向系统调用到单独的用户空间内核来解决类似的问题。因此,gVisor
会受到运行时性能损失。关于gVisor
的进一步讨论超出了本博客的范围。
为Kata配置Kubernetes
Kata容器符合OCI
,这意味着支持外部运行时类的容器运行时接口(CRI
)可以使用Kata来运行工作负载。这些CRI的例子目前包括CRI-O
和containerd
,它们都默认使用runC
,但这可以替换为kata qemu
运行。从Kubernetes 1.14+
开始,RuntimeClass
特性标志已升级到beta
,因此默认启用。因此,设置相对简单。
目前Kata
支持qemu
和firecracker hypervisor
后端,但对后者的支持被认为是初步的,特别是缺乏主机到客户的文件共享。这让我们将kata qemu
作为当前的选项,其中virtio-9p
提供了基本的共享文件系统功能,这对分析至关重要(测试路径是安装在主机上的网络文件系统)。
没有这些先决条件,Kata启动将无声地失败(我们很难学到了这一点)。
这个示例要点展示了如何在Minikube
集群中将runC
替换为Kata
运行时。注意,在编写本文时,Kata
容器有额外的主机要求: