1. 程式人生 > 其它 >如何選擇Containerd和docker<轉載>

如何選擇Containerd和docker<轉載>

如何選擇執行時元件?

容器執行時(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"}
  • 方法一:在 kubelet 引數中指定:
    --container-log-max-files=5
    --container-log-max-size="100Mi"

  • 方法二:在 KubeletConfiguration 中指定:
    "containerLogMaxSize": "100Mi",
    "containerLogMaxFiles": 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"
擁抱不確定,未來可期!喜歡該文章請不吝點贊推薦,如有疑問歡迎留言,我們一起探討。