前言
- Kubelet 中對 Docker 支持被棄用,並將在以后的版本中刪除。Kubelet 使用一個名為
dockershim
的模塊,該模塊實現了對Docker的CRI
支持,在此PR后續版本將刪除dockershim
。 - Kubectl 棄用
--delete-local-data
參數。
名詞解釋
上面中提到兩個名詞,分別為 CRI
和 dockershim
。下面分別解釋一下:
CRI
大家在看到 CRI
時就會想起 OCI
,這兩個名詞概念容易混淆。
CRI
:容器運行時接口 container runtime interface
,CRI 中定義了容器和鏡像兩個接口,實現了這兩個接口目前主流的是:CRI-O、Containerd。(目前 PCI 產品使用的即為 Containerd)。
其主要的作用:
- 1、針對容器操作的接口,包括容器的創建、啟動和停止等
- 2、針對鏡像的操作,拉去、刪除鏡像等
- 3、針對 podsandbox(容器沙箱環境)
- 4、以上全是接口
OCI
:開放容器標准 open container initiative
,OCI 中定義了兩個標准:容器運行時標准
和 容器鏡像標准
,實現了這一標准的主流是:runc(也即我們日常說的 Docker)、Kata-Container。
主要作用,制作容器:
- 1、容器鏡像制作內容,即
ImageSpec
- 2、容器需要接收哪些指令,即
runtimeSpec
Dockershim
Dockershim 作用
:把外部收到的請求轉化成 Docker Daemon
能聽懂的請求,讓 Docker Daemon 執行創建、刪除等容器操作。
Kubelete 創建容器步驟 [1]
- 1、Kubelet 通過 CRI 接口(gRPC)調用 dockershim,請求創建一個容器。CRI 即容器運行時接口,這一步中,Kubelet 可以視作一個簡單的 CRI Client,而 dockershim 就是接收請求的 Server。目前 dockershim 的代碼其實是內嵌在 Kubelet 中的,所以接收調用就是 Kubelet 進程。
- 2、dockershim 收到請求后,轉化成 Docker Daemon 能聽懂的請求,發到 Docker Daemon 上請求創建一個容器。
- 3、Docker Daemon 早在 1.12 版本中就已經將針對容器的操作移到另一個守護進程 containerd 中,因此 Docker Daemon 仍然不能幫我們創建容器,而是要請求 containerd 創建一個容器。
- 4、containerd 收到請求后,並不會自己直接去操作容器,而是創建一個叫做 containerd-shim 的進程,讓 containerd-shim 去操作容器。是因為容器進程需要一個父進程來做諸如收集狀態,維持 stdin 等 fd 打開等工作。而假如這個父進程就是 containerd,那每次 containerd 掛掉或升級,整個宿主機上所有的容器都得退出了。而引入了 containerd-shim 就規避了這個問題(containerd 和 shim 並不是父子進程關系)。
- 5、我們知道創建容器需要做一些設置 namespaces 和 cgroups,掛載 root filesystem 等等操作,而這些事該怎么做已經有了公開的規范,那就是 OCI。它的一個參考實現叫做 runC。於是,containerd-shim 在這一步需要調用 runC 這個命令行工具,來啟動容器。
- 6、runC 啟動完容器后本身會直接退出,containerd-shim 則會成為容器進程的父進程,負責收集容器進程的狀態,上報給 containerd,並在容器中 pid 為 1 的進程退出后接管容器中的子進程進行清理,確保不會出現僵屍進程。
通過上面來看,Docker Daemon
和 dockershim
看上去就是兩個不干活的東西,Kubelet 為啥不直接調用 containerd
呢?其實和容器歷程有關,這里不在闡述。
盡管現在已經有 CRI-O
,containerd-plugin
這樣更精簡輕量的 Runtime
架構,但 dockershim
這一套作為經受了最多生產環境考驗的方案,迄今為止仍是 Kubernetes 默認的 Runtime 實現。不過 Containerd
逐漸被人們所知曉。
展望
雖然未來 Kubelet 刪除 dockershim 支持,但並不說明 Docker 馬上就不能在 Kubernetes 中使用,目前容器市場 Docker 還是占用很大的比例。這中間會有一個過渡期,大家可以關注 Containerd
或者 Podman
。Centos8 開始,倉庫源默認容器已經從 Docker
切換為 Podman
。
參考鏈接
- https://www.cnblogs.com/charlieroro/articles/10998203.html
- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md
- https://blog.51cto.com/12182612/2436484
- https://mp.weixin.qq.com/s/_NJA71eWT0-mGEMy1DEqLw