Kubernetes 如何選擇 container runtime

Kubelet 可通過配置項(xiàng) container-runtime,container-runtime-endpoint 和 image-service-endpoint 來選擇使用 docker,rkt(不推薦)或任何 CRI API 兼容的 container-runtime 。

Kubernetes 接口

Native

Docker

Docker 是迄今為止最常用的容器引擎,主要得益于其容器倉庫和社區(qū)。Docker 是 dockerd 、containerd、containerd-shim 和 runc 的組合,其中 runc 作為 container-runtime。 由于 kubernetes 移除對(duì)于 container-runtime 的直接和非 CRI 接口的支持,因此 Native 支持的方式的后續(xù)將會(huì)被移除。

Rktnetes

截至 kubernetes 1.10.0,直接集成 rkt(或 rktnetes)支持已被棄用。

CRI

容器運(yùn)行時(shí)接口(CRI)的出現(xiàn)是因?yàn)?CoreOS 想要為 kubernetes 添加 rkt 支持。Kubernetes 初期提供了對(duì)于 docker 的支持,但在后續(xù)添加 rkt 支持的補(bǔ)丁后,代碼變得丑陋?jiǎng)?wù)必,充斥著大量的 “if this do rkt else do docker”。為后續(xù)出現(xiàn)的 runtimes 添加支持將無法再繼續(xù)維護(hù),基于此,CRI 誕生了。

CRI 是一個(gè)基于 protobuf 定義的 api,包括兩個(gè) gRPC 服務(wù),ImageService 和 RuntimeService。 ImageService 提供 RPC 以從倉庫中提取鏡像,檢查和刪除鏡像。RuntimeService 包含用于管理 pod 和容器生命周期的 RPC,也提供與容器交互的調(diào)用(exec/attach/port-forward)。

cri-containerd

cri-containerd 是一種向 containerd 添加 CRI 支持的服務(wù),containerd是由 Docker 創(chuàng)建并捐贈(zèng)給 CNCF ,提供 runtime 管理和鏡像服務(wù)。后續(xù) containerd 與 Docker 分離,將 runtime 管理器與 docker 其余的工具分離,以利于不斷增長(zhǎng)的容器管理工具生態(tài)系統(tǒng)在 docker api上實(shí)現(xiàn)標(biāo)準(zhǔn)化。這有助于 docker 社區(qū)的擴(kuò)展并幫助在 docker 倉庫中提供豐富的容器鏡像。

cri-containerd 在kubernetes 1.9 中處于 beta 階段。


image.png

rktlet

rktlet 是一個(gè)使用 rkt 作為容器 runtime 的 Kubernetes 接口實(shí)現(xiàn)。
當(dāng) kubelet 請(qǐng)求創(chuàng)建一個(gè) pod 時(shí),rktlet 將啟動(dòng)一個(gè) systemd 服務(wù),該服務(wù)將通過運(yùn)行 rkt 二進(jìn)制文件創(chuàng)建一個(gè)新的 rkt 沙盒(sandbox)。 創(chuàng)建 沙盒(sandbox) 后,kubelet 可以請(qǐng)求為 pod 添加/刪除容器等。然后 rktlet 將使用相應(yīng)的 rkt app 命令(app add,app rm,app start 或 app stop)運(yùn)行 rkt 二進(jìn)制文件。 其余的 CRI 方法也通過執(zhí)行 rkt 二進(jìn)制文件來處理。

rktlet 在 kubernetes 1.9 中為 alpha 狀態(tài)。


rktlet 架構(gòu)圖

cri-o

cri-o 是一個(gè) CRI 實(shí)現(xiàn),為 kubernetes 提供 CRI 接口支撐。 cri-o 提供了一組最小化的工具和接口來下載、提取和管理鏡像、維護(hù)容器生命周期、并提供滿足 CRI 所需的監(jiān)控和日志記錄。 它可以使用任何實(shí)現(xiàn) OCI 運(yùn)行時(shí)規(guī)范的 runtime,默認(rèn)使用 runc。

cri-o 使用配置的 runtime(默認(rèn)情況下為runc)創(chuàng)建容器 sandbox(pod),然后再次使用 runtime 在該 pod 中創(chuàng)建容器。

從kubernetes 1.9開始,cri-o 被認(rèn)為是 stable 的。


cri-o 架構(gòu)圖

frakti

Frakti 允許 Kubernetes 通過 runV 直接在虛擬機(jī)管理程序中運(yùn)行 pod 和容器 。

OCI (Open Container Initiative) 兼容 Runtimes

Containers

bwrap-oci

bwrap-oci 是為容器工具 bubblewrap 提供 OCI 兼容的包裝器,bubblewrap 是一個(gè)無特權(quán)的容器工具。作者為:Per Giuseppe Scrivano,bwrap-oci 不滿足e2e Kubernetes測(cè)試所需的許多功能,例如:無法指定綁定裝載的選項(xiàng),也無法通過 cgroup 限制資源。

crun

crun是用 C 編寫的 OCI 運(yùn)行時(shí)規(guī)范實(shí)現(xiàn)。配合 cri-o,作者 Giuseppe Scrivano 用它來通過了完整的 e2e 套件測(cè)試。它比同類型功能中的任何其他工具更小更輕。

railcar

railcar 是 OCI runtime-spec 規(guī)范的 rust 語言實(shí)現(xiàn)。參考并實(shí)現(xiàn)了 runc 的部分功能。一般來說,railcar 與 runc 非常相似,但不支持某些 runc 命令。截至目前不受支持的命令列表為:checkpoint,events,exec,init,list,pause,restore,resume,spec。 railcar 始終運(yùn)行與容器進(jìn)程分開的 init 進(jìn)程。 railcar 在其研發(fā)過程號(hào)稱發(fā)現(xiàn)了 OCI 運(yùn)行時(shí)規(guī)范中的一些缺陷。通過使用 rust 語言重寫 rust,作者能夠消除在 go 語言實(shí)現(xiàn)過程中對(duì)于 c 語言中介層的的需要。

我嘗試向編寫缺陷那篇文章的作者詢問了有關(guān)缺陷的具體內(nèi)容,但是未得到回復(fù)。

rkt

rkt 是一個(gè)在 LInux 上運(yùn)行容器而編寫的 CLI 工具。它采用多層設(shè)計(jì),允許 runtime 可根據(jù)實(shí)現(xiàn)者的需求更改 。 默認(rèn)情況下,rkt 結(jié)合使用 systemdsystemd-nspawn 來創(chuàng)建容器。 systemd-nspawn 用于管理執(zhí)行 systemd 以管理 cgroup 的命名空間。容器應(yīng)用程序作為 systemd 單元運(yùn)行。通過使用不同與 “1階段” 鏡像,該工具可將運(yùn)行應(yīng)用程序的工具可以從 systemd 工具更改為其他任何工具。

rkt 包含與 runc 相同的功能,但是并不使用 OCI runtime-spec。相反,rkt 提供了一個(gè)命令行接口來提供類似的功能集。

runc

runc 是一個(gè)主要用 go 編寫的 CLI 工具(需要 c 語言的中介層 shim 來完成某些 go 不能完成的功能)。runc 是最受歡迎的 OCI runtime,被 containerd 和 cri-o 使用。

在大多數(shù)情況下,所有 runc 都會(huì)在生成進(jìn)程時(shí)配置 namespace 和 cgroup。 這實(shí)際上就是是一個(gè)容器,包括 namespace 和 cgroups。

runc 依賴并跟蹤 OCI runtime-spec,以保證 runc 和 OCI 規(guī)范主要版本保持同步。這意味著 runc 1.0.0 實(shí)現(xiàn)了 OCI 1.0 版本的規(guī)范。

runlxc

runlxc 是阿里巴巴即將開源的 OCI 兼容 runtime。 runlxc 目前尚未對(duì)外發(fā)布,與 pouch 配合使用。

Virtual Machines

Clear Containers

cc-runtime 兼容 OCI runtime,其通過啟動(dòng)一個(gè) Intel VT-x 安全 [Clear Containers](https://github.com / clearcontainers / agent) 管理程序,而不是標(biāo)準(zhǔn)的Linux 容器。

runv

runv 是基于 hypervisor 的 OCI runtime,使用 KVM,Xen 或 QEMU 來運(yùn)行 OCI 鏡像。它不會(huì)創(chuàng)建容器。

分析

技術(shù)

containerd

containerd 是 CRI 實(shí)現(xiàn)中最復(fù)雜的,提供鏡像和 runtime 服務(wù)所需的 3 個(gè)組件,采用 Go 編寫。

這些組件包含兩個(gè)獨(dú)立的項(xiàng)目 cri,提供了 19,000 行 Go 代碼和 containerd 提供 runtime 的守護(hù)進(jìn)程,運(yùn)行程序和中介層代碼一共 112,000 行。 containerd 默認(rèn)使用它自己的 runc 分支,但是可以配置任何 OCI runtime 規(guī)范兼容的實(shí)現(xiàn)。

Docker/containerd 對(duì) CRI 支持處于 beta 階段。

我無法在 Arch Linux 中編譯。由于時(shí)間有限,我沒有花很多時(shí)間在這上面。依據(jù) README.md 中的構(gòu)建指令無法成功完成 make install.deps 階段。

rkt

rkt 需要兩個(gè)組件,rkt 和 rktlet。 盡管如此,它并沒有遵循標(biāo)準(zhǔn),而是以自己的方式做事情,盡管它的 github 描述說:“它是可組合的,安全的,并且建立在標(biāo)準(zhǔn)之上”。 它也是用 Go 編寫的。

rkt 組件是 rkt,包含 71,000 行 Go 和 rktlet,包含 4,000 行。

rktlet 對(duì) CRI 支持是 alpha 版。

cri-o

坐在中間是 cri-o。cri-o 為容器編排工具 Kubernetes 定制而生。 憑借其聚焦的單一性,它很快就獲得了 “穩(wěn)定” 狀態(tài),僅用了 14,000 行 Go。 它與任何 OCI 運(yùn)行時(shí)規(guī)范實(shí)現(xiàn)接口,默認(rèn)為 runc。

cri-o 對(duì) CRI 支持是穩(wěn)定。

可用性

選擇 CRI 實(shí)現(xiàn)的一個(gè)明顯因素是可用性。 您應(yīng)該能夠運(yùn)行完整的 e2e 測(cè)試并能夠運(yùn)行任何 OCI 容器。 如果出現(xiàn)問題,應(yīng)該能夠快速診斷問題。

cri-o

cri-o 可以作為包裝安裝在大多數(shù)發(fā)行版中。 使用 cri-o 非常簡(jiǎn)單。 只需更改 kubelet 標(biāo)志即可使用默認(rèn)值以使用cri-o 套接字。可以應(yīng)用其他配置來添加其他功能,例如 repo 限制,selinux,apparmor seccomp,鏡像簽名等。調(diào)試問題很簡(jiǎn)單,因?yàn)橹挥袃蓚€(gè)部分,cri-o 守護(hù)程序和 conmon 控制臺(tái)監(jiān)視器。

使用 runc 與kubernetes 1.9 我很容易通過完整的 e2e 測(cè)試。

cri-containerd

由于無法編譯,我無法測(cè)試其可用性。

rktlet

rktlet 可以在大多數(shù)發(fā)行版中作為包安裝。使用 rkt 可能需要一點(diǎn)學(xué)習(xí)曲線。有許多有效的方法來配置它,并且學(xué)習(xí)哪一個(gè)適合的用例并不是非常簡(jiǎn)單。 rkt 使用 “階段”,并且很少有關(guān)于階段1 鏡像像用于什么目的的文檔。你可以創(chuàng)建自己的階段1 鏡像,但似乎有適當(dāng)?shù)奈臋n可能會(huì)提供這種需要。

它只有三個(gè)部分,診斷問題通常非常簡(jiǎn)單,因?yàn)樗c systemd 集成,將所有輸出留在日志中。

在嘗試使用 rktlet 作為我的 CRI 提供程序時(shí),某些容器不能夠正常工作。不幸的是,由于時(shí)間限制,所以我無法正確診斷。 我希望使用 rkt 就像更改 kubelet 標(biāo)志一樣簡(jiǎn)單。

社區(qū)

作為開源社區(qū)的成員,社區(qū)的健康也很重要。 一個(gè)好的社區(qū)應(yīng)該尋求積極參與,快速審查貢獻(xiàn)并有一個(gè)記錄良好的貢獻(xiàn)過程。 它應(yīng)該有一個(gè)積極和有效的用戶群,在其中提出問題并獲得答案。

cri-o

自 2016 年 9 月 10 日以來已有 1354 Pull Requests,其中 23 個(gè)是 Open 的,最早的是 2017 年 9 月 19 日創(chuàng)建的,最后一次 Commit 是在 9 天前。 共有 75 名貢獻(xiàn)者,其中 20 人在上個(gè)月活躍。 過去 30 天提交的 75% 來自Red Hat 員工。 在過去的 30 天里,已經(jīng)添加了 5,141 行代碼和 刪除了 694 行。 5,141 行代表了 37% 的代碼變化。 cri-o 有一個(gè)積極的貢獻(xiàn)者基礎(chǔ),其中大部分是紅帽員工,但有紅帽以外的員工。 拉取請(qǐng)求需要合并 4 天的平均值。 問題大致相同。有一個(gè) IRC 頻道,開發(fā)人員在北美工作時(shí)間內(nèi)回答用戶問題,響應(yīng)時(shí)間約為 4 分鐘。

cri-containerd/containerd

自 2017 年 4 月 14 日以來,已有 484 次針對(duì) containerd/cri 的 Pull Requests,其中 6 次 是 Open 的。最早的Open PR 創(chuàng)建于 2017 年 12 月 8 日,最后一次 Comment 時(shí)間是 2018 年 1 月 18 日。共有 31 位貢獻(xiàn)者,其中 8 位活躍于上個(gè)月。在過去的 30 天里,IBM,Docker,中興通訊,谷歌和英特爾最終貢獻(xiàn)了很多。在過去的 30天里,已經(jīng)添加了 2,123 行代碼和 刪除了 1,217 行。 2,123 行代表了 11% 的代碼變化。對(duì)于 containerd /cri,并沒有一個(gè)非常活躍的貢獻(xiàn)者基礎(chǔ),但是這代表了社區(qū)的一個(gè)更健康的體現(xiàn)。

自 2015 年 12月 7 日起,共向 containerd/containerd 提交了1,662 個(gè) Pull Requests,其中 13 個(gè)是 Open 狀態(tài)。 最早的 Open PR 創(chuàng)建于 2017 年 8 月 24 日,最后一次 Commit 于 2017 年 9 月 19 日。共有 120 名貢獻(xiàn)者,其中 12人在上個(gè)月活躍。 過去 30 天中有 46% 來自 Docker 員工,NTT 和 IBM 分別增加了31%。 在過去的 30 天里,已經(jīng)添加了 4,444 行代碼 和刪除了 1,724 行。 4,444 行代表 3% 的代碼變化。 對(duì)于 containerd,有一個(gè)非常活躍的貢獻(xiàn)者基礎(chǔ),但它仍然是多樣化的。

獲得對(duì)這兩者之一的支持需要注冊(cè)為 docker 社區(qū)成員。

rktlet/rkt

自 2014 年11月13 日起,共 2 ,406 次 Pull Requests,其中 49 份是開放的。 最舊的 Open PR 創(chuàng)建于 2015 年 8 月25 日,最后一次 Commente 記錄時(shí)間是 2016 年 8 月 9 日。我認(rèn)為 rkt 維護(hù)者可以做得更好。 接受的 PR 通常在一周內(nèi)進(jìn)行審核和合并。 共有 195 名貢獻(xiàn)者,上個(gè)月沒有任何活動(dòng)。 rkt 的活動(dòng)急劇下降。 我不確定這是不是一個(gè)活躍的項(xiàng)目。

在看了 rkt 的活躍狀況后,我選擇忽略了繼續(xù)查看 rktlet 社區(qū)的健康狀況。

總結(jié)

標(biāo)準(zhǔn)和其相關(guān)的 apis 定義提供了非常大的靈活性,并有助于防止鎖定在特定的累積技術(shù)債中。通過使用 OCI(Open Container Initiative) 容器和 rumtime 標(biāo)準(zhǔn)以及 Kubernetes 的 CRI(Container Runtime Interface )API,可以選擇演進(jìn)任何任何特定選項(xiàng)而不用更整個(gè)堆技術(shù)棧。

為此,應(yīng)該棄用 kubernetes 原生支持的 docker 機(jī)制,并且只應(yīng)使用 CRI。

基于 hypervisor 的解決方案,我并沒有在選擇繼續(xù)分析,因?yàn)樵诒疚恼戮帉懙臅r(shí)候,runlxc 尚未開源。

對(duì)于 CRI 接口,rktlet/rkt 沒有長(zhǎng)期的社區(qū)支持,而且經(jīng)過了很長(zhǎng)的時(shí)間才演變成 beta 狀態(tài);cri-containerd 并沒有提供一個(gè)良好的構(gòu)建過程,也沒有發(fā)行版的包裝,我無法測(cè)試。cri-containerd 仍然只是一個(gè) beta 版本,獲得支持有障礙。cri-o 相對(duì)穩(wěn)定,快速,輕松地構(gòu)建,而且更適合在生產(chǎn)環(huán)境穩(wěn)定運(yùn)行,并且具備非常好的社區(qū)支持。我的結(jié)論是,cri-o 是目前最好的選擇。

對(duì)于 runtime,雖然 railcar 和 crun在技術(shù)上可能更優(yōu)越,但我沒有時(shí)間測(cè)試它們。由于它們是可替代品,因此預(yù)先為此工具選擇最佳技術(shù)并不重要。我建議使用當(dāng)前默認(rèn)的 runc,直到可以徹底評(píng)估它們?yōu)橹埂?/p>

引用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,011評(píng)論 3 413
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,323評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,874評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,095評(píng)論 0 286
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,605評(píng)論 1 331
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,551評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,720評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,961評(píng)論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評(píng)論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,330評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,690評(píng)論 2 370