重磅 ! Kubernetes 決定棄用 Docker!
作者 | Kohei Ota? ?譯者 | 核子可樂
什么?Kubernetes 決定棄用 Docker?
這是真的。Kubernetes 現(xiàn)已棄用 Docker。
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md
目前,kubelet 中的 Docker 支持功能現(xiàn)已棄用,并將在之后的版本中被刪除。Kubelet 之前使用的是一個名為 dockershim 的模塊,用以實現(xiàn)對 Docker 的 CRI 支持。但 Kubernetes 社區(qū)發(fā)現(xiàn)了與之相關的維護問題,因此建議大家考慮使用包含 CRI 完整實現(xiàn)(兼容 v1alpha1 或 v1)的可用容器運行時。
簡而言之,Docker 并不支持 CRI(容器運行時接口)這一 Kubernetes 運行時 API,而 Kubernetes 用戶一直以來所使用的其實是名為“dockershim”的橋接服務。Dockershim 能夠轉換 Docker API 與 CRI,但在后續(xù)版本當中,Kubernetes 將不再提供這項橋接服務。
當然,Docker 本身也是一款非常強大的工具,可用于創(chuàng)建開發(fā)環(huán)境。但為了了解造成當前狀況的原因,我們需要全面分析 Docker 在現(xiàn)有 Kubernetes 架構中的作用。
Kubernetes 是一款基礎設施工具,可對多種不同計算資源(例如虛擬 / 物理機)進行分組,使其呈現(xiàn)為統(tǒng)一的巨量計算資源,從而供應用程序使用或與其他人共享。在這樣的架構中,Docker(或者容器運行時)僅用于通過 Kubernetes 控制平面進行調度,從而在實際主機內運行應用程序。

通過以上架構圖,可以看到每個 Kubernetes 節(jié)點都與控制平面彼此通信。各個節(jié)點上的 kubelet 獲取元數(shù)據(jù),并執(zhí)行 CRI 以在該節(jié)點上創(chuàng)建 / 刪除容器。
1、但 Docker 為什么會被棄用?
如前所述,Kubernetes 只能與 CRI 通信,因此要與 Docker 通信,就必須使用橋接服務。這就是棄用 Docker 的第一點原因。
要解釋下一個原因,我們必須稍微聊聊 Docker 架構。首先參考以下示意圖。

沒錯,Kubernetes 實際上需要保持在紅框之內。Docker 網絡與存儲卷都被排除在外。
而這些用不到的功能本身就可能帶來安全隱患。事實上,您擁有的功能越少,攻擊面也就越小。
因此,我們需要考慮使用替代方案,即 CRI 運行時。
2、CRI 運行時
CRI 運行時的實現(xiàn)方案主要有兩種。
containerd
如果大家只是想從 Docker 遷移出來,那么 containerd 就是最好的選擇。因為它實際上就是在 Docker 之內起效,可以完成所有“運行時”工作,如上圖所示。更重要的是,它提供的 CRI 其實 100% 就是由 Docker 所提供。
containerd 還屬于全開源軟件,因此您可以在 GitHub 上查看說明文檔甚至參與項目貢獻。
https://github.com/containerd/containerd/
CRI-O
CRI-O 是主要由 Red Hat 員工開發(fā)的 CRI 運行時。它的最大區(qū)別在于并不依賴于 Docker,而且目前已經在 Red Hat OpenShift 中得到使用。
有趣的是,RHEL 7 同樣不官方支持 Docker。相反,其只為容器環(huán)境提供 Podman、Buildah 以及 CRI-O。
https://github.com/cri-o/cri-o
CRI-O 的優(yōu)勢在于其采用極簡風格,或者說它的設計本身就是作為“純 CRI”運行時存在。不同于作為 Docker 組成部分的 containerd,CRI-O 在本質上屬于純 CRI 運行時、因此不包含除 CRI 之外的任何其他內容。
從 Docker 遷移至 CRI-O 往往更為困難,但無論如何,CRI-O 至少可以支持 Docker 容器在 Kubernetes 上的正常運行。
3、還有一點……
當我們談論容器運行時時,請注意我們到底是在談論哪種類型的運行時。運行時分為兩種:CRI 運行時與 OCI 運行時。
CRI 運行時
正如之前所提到,CRI 是 Kubernetes 提供的 API,用于同容器運行時進行通信以創(chuàng)建 / 刪除容器化應用程序。
各容器化應用程序作為 kubelet 通過 IPC 在 gRPC 內通信,而且運行時也運行在同一主機之上;CRI 運行時負責從 kubelet 獲取請求并執(zhí)行 OCI 容器運行時以運行容器。稍微有點復雜,接下來我們會用圖表來解釋。

因此,CRI 運行時將執(zhí)行以下操作:
從 kubelet 獲取 gRPC 請求。 根據(jù)規(guī)范創(chuàng)建 OCIjson 配置。


https://gvisor.dev/docs/
性能更差 Linux 內核層并非 100% 兼容:參見官方文檔中的兼容性部分 不受默認支持
https://gvisor.dev/docs/user_guide/compatibility/
4、總結
后臺回復?學習資料?領取學習視頻
如有收獲,點個在看,誠摯感謝
