从零开始入门 K8s | Kata Containers 创始人带你入门安全容器技术

发布时间:2024-02-20 点击:147
云计算
作者 | 王旭 蚂蚁金服资深技术专家
本文整理自《cncf x alibaba 云原生技术公开课》第 28 讲,
点击直达课程页面。
关注“阿里巴巴云原生”公众号,回复关键词
“入门”,即可下载从零入门 k8s 系列文章 ppt。
一、缘起:安全容器的命名
phil karlton 有一句名言:“计算机科学界只有两个真正的难题——缓存失效和命名。”
对我们容器圈而言,我相信「命名」绝对配得上这句话。这毫无疑问是一件让老开发者沉默、让新人落泪的事情。仅就系统软件而言,我们当今比较通行地称为
「linux 容器技术」这个概念,它曾经用过的名字还有 jail, zone, virtual server, sandbox 等。同样,在早期虚拟化的技术栈里也把一类虚拟机叫做容器,毕竟这个词本身就指代那些用来包容、封装和隔离的器物。它实在太过常见了,以至于以严谨著称的 wikipedia,它的词条叫做「os-level virtualization」(系统级虚拟化) ,从而回避了「什么是容器」这个问题。
在 2013 年,docker 问世之后,容器这个概念伴随着不可变基础设施、云原生这一系列概念在随后的几年间以摧枯拉朽之势颠覆了基于“软件包 配置”这种细粒度组合的应用部署,用简单的声明式策略和不可变的容器就清爽地定义了软件栈。应用怎么部署,在这儿似乎有点离题了,我在这里想要强调的是:
“云原生语境下的容器,实质是「应用容器」——是以标准格式封装的,运行于标准操作系统环境(常常是 linux abi)上的应用打包——或运行这一应用打包的程序/技术。”
这个定义是我下的,但它并不是我的个人意志,是基于 oci 规范这一共识写出来的。这个规范规定了容器之中应用被放到什么样的环境下、如何运行,比如说容器的根文件系统上哪个可执行文件会被执行,是用什么用户执行,需要什么样的 cpu,有什么样的内存资源、外置存储,还有什么样的共享需求等等。
所以说,标准格式的封装、标准的操作系统环境在一起以应用为中心就构成了应用容器的打包。
以这个共识为基础,就可以来说说安全容器了。当年,我和我的联合创始人赵鹏使用「虚拟化容器」这个名字来命名我们的技术的,不过为了博人眼球,我们用了「secure as vm, fast as container」这样的 slogan,于是,被容器安全性问题戳中心坎的人们立刻用「secure container」或者说「安全容器」来称呼这种东西了,一发而不可收。虽然在我们的内心里,这个技术是一层额外的隔离,它只是安全中的一环,但是呢,用户还是愿意用安全容器这个名字来称呼它。我们给安全容器下的定义就是:
安全容器是一种运行时技术,为容器应用提供一个完整的操作系统执行环境(常常是 linux abi),但将应用的执行与宿主机操作系统隔离开,避免应用直接访问主机资源,从而可以在容器主机之间或容器之间提供额外的保护。
这就是我们的安全容器。
二、间接层:安全容器的精髓
说安全容器的时候,就要提到「间接层」这个词。它出自于 linus torvalds 在 2015 年的 linuxcon 上提出的:
“安全问题的唯一正解在于允许那些(导致安全问题的)bug 发生,但通过额外的隔离层来阻挡住它们。”
为了安全,为什么要引入隔离层呢?其实 linux 本身这样的规模是非常大的,无法从理论上来验证程序是没有 bug 的,于是,一旦合适的 bug 被利用,安全性风险就变成安全性问题了。安全性的框架和修补并不能确保安全,所以我们需要进行一些额外的隔离来减少漏洞以及因为这些漏洞造成的被彻底攻破的风险。
这就是安全容器的由来。
三、kata containers:云原生化的虚拟化
2017 年 12 月,我们在 kubecon 上对外发布了 kata containers 的安全容器项目,这个项目有两个前身:由我们之前开始的 runv 以及 intel 的 clear container 项目。这两个项目都是 2015 年 5 月开始开展的,实际上是早于 linus 在 kubecon 2015 说的那番话的。
它们的思路都很简单:
操作系统本身的容器机制没法解决安全性问题,需要一个隔离层;
虚拟机本身,vm,它是一个现成的隔离层,比如说像阿里云、aws,它们都使用了虚拟化技术,所以对于全世界来说,大家已经普遍地相信,对于用户来说,只要能做到「secure of vm」,那这个安全性就可以满足公有云的需求了;
虚拟机中如果有个内核,就可以支持我们刚才所提到的 oci 的定义,也就是说提供了 linux abi 的运行环境,在这个运行环境中跑一个 linux 应用不太难实现。
现在的问题是虚机不太够快,阻碍了它在容器环境中的应用,如果能拥有「speed of container」的话,那我们就可能可以有一个用虚拟机来做隔离的安全容器技术了。这个也就是 kata containers 本身的一个思路,就是用虚拟机来做 kubernetes 的 podsandbox。在 kata 里面被拿来做 vm 的先后有 qemu, firecracker, acrn, cloud-hypervisor 等。
下图就是 kata containers 怎么去和 kubernetes 集成的,这里的例子用的是 containerd,当然 cri-o 也是一样的。
目前,kata containers 通常是在 kubernetes 中使用。首先 kubelet 通过 cri 接口找到 containerd 或者 cri-o,这个时候比如镜像这样的操作一般也是由 containerd 或者 cri-o 来执行的。根据请求,它会把 runtime 部分的需求变成一个 oci spec,并交给 oci runtime 执行。比如说上图上半部分中的 kata-runtime,或者说下半部分精简过后的 containerd-shim-kata-v2。具体的过程是这样的:
当 containerd 拿到一个请求的时候,它会首先创建一个 shim-v2。这个 shim-v2 就是一个 podsandbox 的代表,也就是那个vmm 的代表;
每一个 pod 都会有一个 shim-v2 来为 containerd/cri-o 来执行各种各样的操作。shim-v2 会为这个 pod 启动一个虚拟机,在里面运行着一个 linux kernel,也就是图里面的 guest kernel。如果这个里面用的是 qemu 的话,我们会通过一些配置和一些补丁,让它变得小一些。同时这个里面也没有额外的 guest 操作系统,不会跑一个完整的像 centos, ubuntu 这样的操作系统;
后我们会把这个容器的 spec 以及这个容器本身打包的存储,包括 rootfs 和文件系统,交给这个 podsandbox。这个 podsandbox 会在虚机中由 kata-agent 把容器启动起来;
依照 cri 语义和 oci 规范,在一个 pod 里面是可以启动多个相关联的容器的。它们会被放到同一个虚拟机里面,并且可以根据需求共享某些 namespace;
除了这些之外,其它的一些外置的存储和卷也可以通过热插拔的方式来插到这个 podsandbox 里面来;
对于网络来说,目前使用 tcfilter 就可以无缝地接入几乎所有的 kubernetes 的 cni 插件。而且我们还提供了一个 enlightened 的模式,这样的话会有一个特制的 cni 插件来提高容器的网络能力。
可以看到,在我们的 podsandbox 里面,实际上只有一个 guest kernel 跑着一些容器本身的打包和容器应用,并不包含一个完整的操作系统。就是说,这个过程,它用起来并不像是传统的虚拟机,对于容器来说,它只有容器的引擎,并且通过少用不必要的内存、共享能共享的内存来进一步地降低内存的开销。
与传统的虚拟机比起来,开销更小、启动更轻快,对于大部分的场景来说,它可以做到「secure as vm」、「fast as container」。同时,在安全性技术以外,相比传统的虚机,它有更多的弹性,更少了机器的那种物理操作的手感,比如说这里面说过的包括动态资源的插拔以及使用 virtio-fs 这样的技术等。它是一个专门为我们这种场景、为像 kata 这样的场景来做的一个把 host 的基本文件系统的内容(比如说容器的 rootfs )共享给虚拟机的这样一个技术。
通过其中一些之前为非易失存储、非易失内存来做的 dax 的技术,能够在不同的 podsandbox 之间,也就是不同的 pod 之间、不同的容器之间,共享一些可以共享的只读的内存部分。这样可以在不同的 podsandbox 之间去节省很多的内存。同时所有的 pod 的管理都是通过 kubernetes 从外部进行的容器管理,并且从外部来获取 metrics 和 debug 信息,并没有登陆虚拟机这样一种手感。所以它看起来是一种非常容器化的操作,虽然从底层来看,它还是一个虚拟机,但是实际上它是一个面向云原生的虚拟化。
四、gvisor:进程级虚拟化
gvisor,我们又把它叫做进程级的虚拟化,它是和 kata 不一样的另外一种方式。
在 20

ipv6扩展头可以任意吗
企业建站时的分析工作必不可少
腾讯云服务器可以挂几个机器人
爆款1核2g云服务器
新手注册网址该如何做?有什么要关心的问题?
php获取日期星期几的方法
购买了虚拟主机还要云服务器吗吗安全吗
我现在都不知道这是啥意思了我的审批文件是对的啊这个域名在证书