轉載自 騰訊文檔
如何選擇運行時組件?
容器運行時(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" |