• 1
  • 2
  • 3
  • 4
  • 5
阿里云主机ECS 首 页  »  帮助中心  »  云服务器  »  阿里云主机ECS
阿里云Rkt 0.8发布,引入Intel的虚拟化技术
发布日期:2016-3-22 20:3:27

  阿里云Rkt 0.8发布,引入Intel的虚拟化技术

  这篇文章来自CoreOS官方博客,就在rkt发布了0.8.0版本,rkt 0.8.0引入了很多新功能特性,其中包括初步支持用户命名空间和使用硬件虚拟化增强容器隔离,同时还改进了主机日志集成,容器套接字激活,改进的镜像缓存和提升速度。本文重点介绍新引入的硬件嵌入式虚拟化技术,最后简单介绍了一下开放容器平台的进展和如何向rkt贡献。

  今天,我们将发布rkt v0.8.0。Rkt是一个专为生产环境而设计的应用容器运行时环境,更加高效和安全。

  Rkt v0.8.0将会给我们带来了很多安全上的更新,这其中包括初步支持用户命名空间和使用硬件虚拟化来增强容器的隔离性。另外也引入了一系列的功能改进,比如说主机日志集成、容器套接字激活、改进的镜像缓存和速度提升。

  Intel虚拟化技术对于rkt stage1的贡献

  受益于模块化设计,Rkt支持接入不同的执行引擎和容器化系统。这是通过阶段体系架构(staged architecture)来实现的,其中第二阶段("stage1")负责创建和启动容器。当我们启动rkt之后,默认情况下它将启动一个单独的阶段stage 1,用来调用Linux cgoups和namespaces(这个组合通常称为“Linux containers”)。

  在英特尔工程师的帮助下,我们增加了一个新的利用虚拟化技术的rkt stage1运行时。这就意味着在rkt下运行的应用,使用这个新的stage1可以像Linux的KVM管理程序使用的硬件特性一样从主机内核层面进行隔离。

  在2015年五月份,英特尔宣布了这项用于rkt之上的概念验证,作为Intel® Clear Containers利用硬件嵌入式虚拟化技术的特性来更好的保护容器运行时和隔离应用的成果之一。我们非常激动的看到rkt正在渐渐成型,因为它恰好验证了我们做的一些早期设计原型,就比如运行时阶段和资料库的理念。下面是Intel's Open Source Technology Center的Arjan van de Ven说过的话:

  "多亏rkt的基于阶段的体系结构,Intel®Clear Containers team才能够迅速的整合我们的工作,把进一步增强安全性的英特尔®虚拟化技术(Intel® VT-x)带到容器生态中。我们非常高兴能继续与rkt社区共同工作,来实现我们在传递容器应用部署好处的同时使用硬件嵌入技术增强容器安全性的愿景。"

  自从五月份发布原型以来,我们一直在与英特尔的团队共同协作,来确保当使用虚拟化时诸如每个pod一个IP地址和卷组这些特性还是以原来的方式运行。今天rkt的发布见证了这一功能完全融合,使得后端的lkvm是一流的stage1体验。那么,就让我们来试试吧!

  在下面这个示例中,我们首先使用默认的cgroups/namespace-based stage1运行一个pod。然后我们使用systemd-run启动容器,这会动态构造一个单位文件并且启动它。检查这个单元的状态会让我们弄清楚在引擎下到底发生了什么。

  

  请大家注意,我们可以看到pod内的整个过程层次结构,这包括systemd实例和etcd进程。

  接着,我们通过添加--stage1-image标签在新的基于KVM的stage1下启动这个容器:

  

  请大家注意,这个进程层级到lkvm就结束了。这是因为整个pod现在是在KVM进程内执行,包括systemd进程和etcd进程:对主机系统而言,它就像一个虚拟机进程。

  然后通过在调用容器时添加一个标签,我们就利用了公有云用来隔离租户的KVM技术来隔离我们的应用容器,给主机上又加了一个安全层。

  在这里感谢来自英特尔的Piotr Skamruk、Paweł Pałucki、Dimitri John Ledkov、Arjan van de Ven的支持和付出。关于这个功能的更多细节请参考lkvm stage1 guide。

  无缝集成主机级别日志

  在systemd主机上,日志是默认的日志聚合系统。随着v0.8.0版本的发布,rkt现在能自动的与主机日志集成了,如果检测到会提供一个systemd原生日志管理体验。如果需要体验rkt产品的日志,你仅仅需要添加一个机器区分符如-M rkt-$UUID到主机的journalctl命令就可以了。

  举个简单例子来说明,我们来体验一下之前启动的etcd容器的日志。首先我们使用machinectl列出rkt已经注册到systemd的pods:

  

  然后我们可以看到etcd的pod列出的第二台机器已经被systemd发现。现在我们使用jornal直接查看pod的日志:

  

  用户命名空间支持

  这次的版本包括对用户命名空间初步支持来改善容器隔离。通过使用用户命名空间,应用程序在容器内可以以root用户运行但是在容器外会被映射到非root用户。

  我们通过从系统的root用户隔离容器增加了额外安全层。这个功能预览版本还是实验性的并且使用拥有特权的用户命名空间,但是rkt的未来版本会在这个版本的基础上继续改进并提供更多规则控制。

  为了打开用户命名空间,这里我们需要添加两个标签到我们最开始的例子:--private-users和--no-overlay。第一个是用了打开用户命名空间功能,第二个是关闭rkt的overlayfs子系统,因为现阶段它与用户命名空间不兼容。

  

  然后我们通过使用curl来验证etcd的功能行并且检查etcd数据目录的权限来确认这个功能正常,注意,从主机的角度看etcd成员目录被一个id很高的用户拥有:

  

  增加用户命名空间支持是对我们让rkt成为最安全的容器运行时目标迈出的重要一步,在接下来的版本我们将会继续努力改进这一功能。你可以查看roadmap in this issue。

  开放平台项目进展

  在rktv0.8.0版本我们进一步巩固在安全强化方面的成果,并且向1.0稳定版本和生产版本推进。我们还致力于确保容器生态系统继续朝着大家发布容器到“构建一次,签名一次,到处运行。”路线前进。如今rkt是应用程序容器规范(appc)的实现,在未来我们还是希望rkt成为开放容器平台(OCI)规范的实现。不管怎么样,OCI还在起步阶段还有很多工作需要做。如果需要查看OCI和AppC协调工作进展,用户还可以在OCI dev邮件列表阅读更多内容。

  向rkt贡献

  rkt的一个目标就是使得rkt成为最安全的容器运行时,并且在我们向1.0版本演变中有还有许多令人兴奋的工作要做。