如何選擇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"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM