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

news/2024/10/3 17:43:23
本文讲的是本文讲的是,, 【编者的话】本文来自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管理程序使用的硬件特性一样从主机内核层面进行隔离。

今年五月份,英特尔宣布了这项用于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 启动容器,这会动态构造一个单位文件并启动它。检查这个单元的状态会让我们弄清楚在引擎下到底发生了什么。
$ sudo systemd-run --uid=0 \
./rkt run \
--private-net --port=client:2379 \
--volume data-dir,kind=host,source=/tmp/etcd \
coreos.com/etcd,version=v2.2.0-alpha.0 \
-- --advertise-client-urls="http://127.0.0.1:2379" \  
--listen-client-urls="http://0.0.0.0:2379"
Running as unit run-1377.service.$ systemctl status run-1377.service
● run-1377.service
CGroup: /system.slice/run-1377.service├─1378 stage1/rootfs/usr/bin/systemd-nspawn├─1425 /usr/lib/systemd/systemd└─system.slice├─etcd.service│ └─1430 /etcd└─systemd-journald.service└─1426 /usr/lib/systemd/systemd-journald

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

接着,我们通过添加 --stage1-image 标签在新的基于KVM的stage1下启动这个容器:
$ sudo systemd-run -t --uid=0 \
./rkt run --stage1-image=sha512-c5b3b60ed4493fd77222afcb860543b9 \
--private-net --port=client:2379 \
--volume data-dir,kind=host,source=/tmp/etcd2 \
coreos.com/etcd,version=v2.2.0-alpha.0 \
-- --advertise-client-urls="http://127.0.0.1:2379" \
--listen-client-urls="http://0.0.0.0:2379"
...$ systemctl status run-1505.service
● run-1505.service
CGroup: /system.slice/run-1505.service└─1506 ./stage1/rootfs/lkvm

请注意,该进程层级到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:
$ machinectl list
MACHINE                                  CLASS     SERVICE
rkt-bccc16ea-3e63-4a1f-80aa-4358777ce473 container nspawn
rkt-c3a7fabc-9eb8-4e06-be1d-21d57cdaf682 container nspawn2 machines listed.

我们可以看到etcd的pod列出的第二台机器已经被systemd发现。现在我们使用jornal直接查看pod的日志:
$ sudo journalctl -M rkt-c3a7fabc-9eb8-4e06-be1d-21d57cdaf682
etcd[4]: 2015-08-18 07:04:24.362297 N | etcdserver: set the initial cluster version to 2.2.0

用户命名空间支持

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

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

为了打开用户命名空间,需要添加两个标签到我们最开始的例子: --private-users --no-overlay 。第一个是打开用户命名空间功能,第二个是关闭rkt的overlayfs子系统,因为现阶段它与用户命名空间不兼容。
$ ./rkt run --no-overlay --private-users \
--private-net --port=client:2379 \
--volume data-dir,kind=host,source=/tmp/etcd \
coreos.com/etcd,version=v2.2.0-alpha.0 \
-- --advertise-client-urls="http://127.0.0.1:2379" \--listen-client-urls="http://0.0.0.0:2379"`

我们通过使用 curl 来验证etcd的功能行并且检查etcd数据目录的权限来确认这个功能正常,注意,从主机的角度看etcd成员目录被一个id很高的用户拥有:
$ curl 172.16.28.19:2379/version
{"etcdserver":"2.2.0-alpha.0","etcdcluster":"2.2.0"}`$ ls -la /tmp/etcd
total 0
drwxrwxrwx  3 core       core        60 Aug 18 07:31 .
drwxrwxrwt 10 root       root       200 Aug 18 07:31 ..
drwx------  4 1037893632 1037893632  80 Aug 18 07:31 member`

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

开放平台项目进展

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

向rkt贡献

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

原文连接:Using Virtual Machines to Improve Container Security with rkt v0.8.0(翻译:朱高校)

原文发布时间为:2015-08-24
本文作者:unodba 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Rkt 0.8发布,引入Intel的虚拟化技术

https://dhexx.cn/news/show-4468418.html

相关文章

分析定义若干 java_深入分析Java ClassLoader的原理(转)

一、什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能…

AsyncTimeServer实例

2019独角兽企业重金招聘Python工程师标准>>> 基于操作系统内核的服务器版本,与内核交互较多所以基本都是嵌套回调执行 package aio;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.chann…

leetcode Contains Duplicate II

Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] nums[j] and the difference between i and j is at most k. 这道题自己最后没有做出来,看的是【陆草纯】的解法。 如果…

泛化仿函数用法及参数绑定的问题

《C设计新思维》一书里的泛化仿函数从Command模式讲起。Command模式主要用来降低系统中命令的调用者和执行者间的依存性。设计模式的书里面一般都采用多态的机制,调用者持有Command对象的基类接口,在此处我们称为Command接口,Command接口不知…

How many '1's are there题解

Description: Description: 第一行输入数字n&#xff08;n<50)&#xff0c;表示有n组测试用例&#xff0c;第2到第n1行每行输入数m&#xff08;m为整数&#xff09;&#xff0c;统计并输出m用二进制表示时&#xff0c;1的个数。 例如&#xff1a;m9时&#xff0c;二进制表示…

oracle索引先导列,Oracle复合B*tree索引branch block内是否包含非先导列

Oracle复合B*tree索引branch block内是否包含非先导列键值&#xff1f;&#xff0c;branchblock 好久不碰数据库底层细节的东西&#xff0c;前几天&#xff0c;一个小家伙跑来找我&#xff0c;非要说复合b*tree index branch block中只包含先导列键值信息&#xff0c;并不包含非…

数据库面试题之COUNT(*),COUNT(字段),CONUT(DISTINCT 字段)的区别

COUNT(*).明确的返回数据表中的数据个数,是最准确的 COUNT(列),返回数据表中的数据个数,不统计值为null的字段 COUNT(DISTINCT 字段) 返回数据表中不重复的的数据个数,不统计值为null的字段

JAVA堆外内存

JVM可以使用的内存分外2种&#xff1a;堆内存和堆外内存. 堆内存完全由JVM负责分配和释放&#xff0c;如果程序没有缺陷代码导致内存泄露&#xff0c;那么就不会遇到java.lang.OutOfMemoryError这个错误。 使用堆外内存&#xff0c;就是为了能直接分配和释放内存&#xff0c;提…

.gitignore不生效

在git中如果想忽略掉某个文件&#xff0c;不让这个文件提交到版本库中&#xff0c;可以使用修改根目录中 .gitignore 文件的方法&#xff08;如无&#xff0c;则需自己手工建立此文件&#xff09;。这个文件每一行保存了一个匹配的规则例如&#xff1a; # 此为注释– 将被 Git …

肖磊c语言答案,初级查分时间提前?这批考生被幸运砸中!

21年初级会计考试已进行第5天&#xff0c;考完的考生一定很想对一下答案&#xff0c;更想知道何时能查成绩。对于5月22日-23日考试的考生来说&#xff1a;考试将要考什么&#xff1f;考试难不难&#xff1f;自己往哪个方向复习&#xff1f;都是大家想只知道的&#xff0c;今天奥…