如何選擇Containerd和docker<轉載>
阿新 • • 發佈:2021-07-21
如何選擇執行時元件?
容器執行時(Container Runtime)是 Kubernetes(k8s) 最重要的元件之一,負責管理映象和容器的生命週期。Kubelet 通過 Container Runtime Interface (CRI)
與容器執行時互動,以管理映象和容器。
TKE 支援使用者選擇 containerd 和 docker 作為執行時元件:
- Containerd 呼叫鏈更短,元件更少,更穩定,佔用節點資源更少。 建議選擇 containerd。
- 當您遇到以下情況時,請選擇 docker 作為執行時元件:
- 如需使用 docker in docker。
- 如需在 TKE 節點使用 docker build/push/save/load 等命令。
- 如需呼叫 docker API。
- 如需 docker compose 或 docker swarm。
Containerd 和 Docker 元件常用命令是什麼?
Containerd 不支援 docker API 和 docker CLI,但是可以通過 cri-tool 命令實現類似的功能。
映象相關功能 | Docker | Containerd |
---|---|---|
顯示本地映象列表 | docker images | crictl images |
下載映象 | docker pull | crictl pull |
上傳映象 | docker push | 無 |
刪除本地映象 | docker rmi | crictl rmi |
檢視映象詳情 | docker inspect IMAGE-ID | crictl inspect IMAGE-ID |
容器相關功能 | Docker | Containerd |
---|---|---|
顯示容器列表 | docker ps | crictl ps |
建立容器 | docker create | crictl create |
啟動容器 | docker start | crictl start |
停止容器 | docker stop | crictl stop |
刪除容器 | docker rm | crictl rm |
檢視容器詳情 | docker inspect | crictl inspect |
attach | docker attach | crictl attach |
exec | docker exec | crictl exec |
logs | docker logs | crictl logs |
stats | docker stats | crictl stats |
POD 相關功能 | Docker | Containerd |
---|---|---|
顯示 POD 列表 | 無 | crictl pods |
檢視 POD 詳情 | 無 | crictl inspectp |
執行 POD | 無 | crictl runp |
停止 POD | 無 | crictl stopp |
呼叫鏈區別有哪些?
- Docker 作為 k8s 容器執行時,呼叫關係如下:
kubelet --> docker shim (在 kubelet 程序中) --> dockerd --> containerd
- Containerd 作為 k8s 容器執行時,呼叫關係如下:
kubelet --> cri plugin(在 containerd 程序中) --> containerd
其中 dockerd 雖增加了 swarm cluster、 docker build 、 docker API 等功能,但也會引入一些 bug,而與 containerd 相比,多了一層呼叫。
Stream 服務
?Kubectl exec/logs 等命令需要在 apiserver 跟容器執行時之間建立流轉發通道。
如何在 Containerd 中使用並配置 Stream 服務?
Docker API 本身提供 stream 服務,kubelet 內部的 docker-shim 會通過 docker API 做流轉發。
Containerd 的 stream 服務需要單獨配置:
[plugins.cri]
stream_server_address = "127.0.0.1"
stream_server_port = "0"
enable_tls_streaming = false
k8s 1.11 前後版本配置區別是什麼?
Containerd 的 stream 服務在 k8s 不同版本執行時場景下配置不同。
- 在 k8s 1.11 之前:
Kubelet 不會做 stream proxy,只會做重定向。即 Kubelet 會將 containerd 暴露的 stream server 地址傳送給 apiserver,並讓 apiserver 直接訪問 containerd 的 stream 服務。此時,您需要給 stream 服務轉發器認證,用於安全防護。 - 在 k8s 1.11 之後:
k8s1.11 引入了 kubelet stream proxy, 使 containerd stream 服務只需要監聽本地地址即可。
其他差異
容器日誌及相關引數
對比項 | Docker | Containerd |
---|---|---|
儲存路徑 |
如果 Docker 作為 k8s 容器執行時,容器日誌的落盤將由 docker 來完成,儲存在類似/var/lib/docker/containers/$CONTAINERID 目錄下。Kubelet 會在 /var/log/pods 和 /var/log/containers 下面建立軟連結,指向 /var/lib/docker/containers/$CONTAINERID 該目錄下的容器日誌檔案。
|
如果 Containerd 作為 k8s 容器執行時, 容器日誌的落盤由 Kubelet 來完成,儲存至 /var/log/pods/$CONTAINER_NAME 目錄下,同時在 /var/log/containers 目錄下建立軟連結,指向日誌檔案。
|
配置引數 |
在 docker 配置檔案中指定:
"log-driver": "json-file",
"log-opts": {"max-size": "100m","max-file": "5"}
|
|
把容器日誌儲存到資料盤 | 把資料盤掛載到 “data-root”(預設是 /var/lib/docker )即可。 |
建立一個軟連結 /var/log/pods 指向資料盤掛載點下的某個目錄。 在 TKE 中選擇“將容器和映象儲存在資料盤”,會自動建立軟連結 /var/log/pods 。
|
CNI 網路
對比項 | Docker | Containerd |
---|---|---|
誰負責呼叫 CNI | Kubelet 內部的 docker-shim | Containerd 內建的 cri-plugin(containerd 1.1 以後) |
如何配置 CNI | Kubelet 引數 --cni-bin-dir 和 --cni-conf-dir |
Containerd 配置檔案(toml):[plugins.cri.cni] bin_dir = "/opt/cni/bin" conf_dir = "/etc/cni/net.d" |