Rkt0.8釋出,引入Intel的虛擬化技術

軒墨發表於2017-09-25
本文講的是本文講的是,,【編者的話】本文來自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 nspawn

2 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的虛擬化技術


相關文章