Container Runtime 是 Kubernetes 的核心组件,负责管理镜像和容器的生命周期。
通过平台创建集群时,可以选择 Containerd 或 Docker 作为运行时组件。
注意:Kubernetes 1.24 及以上版本不再官方支持 Docker 运行时。官方推荐的运行时是 Containerd。如果仍需使用 Docker 运行时,必须先在 feature gate 中启用 cri-docker,才能在创建集群时选择 Docker 作为运行时组件。有关 feature gate 的使用详情,请参见 Feature Gate Configuration。
| 选择 Containerd | 选择 Docker |
|---|---|
|
|
| Containerd | Docker | 说明 |
|---|---|---|
| crictl ps | docker ps | 查看运行中的容器 |
| crictl inspect | docker inspect | 查看容器详情 |
| crictl logs | docker logs | 查看容器日志 |
| crictl exec | docker exec | 在容器内执行命令 |
| crictl attach | docker attach | 附加到容器 |
| crictl stats | docker stats | 显示容器资源使用情况 |
| crictl create | docker create | 创建容器 |
| crictl start | docker start | 启动容器 |
| crictl stop | docker stop | 停止容器 |
| crictl rm | docker rm | 删除容器 |
| crictl images | docker images | 查看镜像列表 |
| crictl pull | docker pull | 拉取镜像 |
| None | docker push | 推送镜像 |
| crictl rmi | docker rmi | 删除镜像 |
| crictl pods | None | 查看 Pod 列表 |
| crictl inspectp | None | 查看 Pod 详情 |
| crictl runp | None | 启动 Pod |
| crictl stopp | docker images | 查看镜像 |
| ctr images ls | None | 停止 Pod |
| crictl stopp | docker load/save | 导入/导出镜像 |
| ctr images import/export | None | 停止 Pod |
| ctr images pull/push | docker pull/push | 拉取/推送镜像 |
| ctr images tag | docker tag | 镜像打标签 |
Docker 作为 Kubernetes 容器运行时的调用关系为:
kubelet > cri-dockerd > dockerd > containerd > runC
Containerd 作为 Kubernetes 容器运行时的调用关系为:
kubelet > cri 插件(在 containerd 进程中)> containerd > runC
总结:虽然 dockerd 增加了 swarm 集群、docker build 和 Docker API 等功能,但也可能引入 bug,并增加调用链层级。Containerd 调用链更短,组件更少,稳定性更高,且消耗更少的节点资源。
| 对比项 | Docker | Containerd |
|---|---|---|
| 存储路径 | 当 Docker 作为 Kubernetes 容器运行时时,容器日志由 Docker 存储在 /var/lib/docker/containers/$CONTAINERID 等目录下。Kubelet 会在 /var/log/pods 和 /var/log/containers 创建指向该目录下容器日志文件的符号链接。 | 当 Containerd 作为 Kubernetes 容器运行时时,容器日志由 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 指向数据盘挂载点下的目录。 |
| 对比项 | Docker | Containerd |
|---|---|---|
| 谁调用 CNI | cri-dockerd | 集成在 Containerd 中的 cri-plugin(containerd 1.1 之后) |
| 如何配置 CNI | cri-dockerd 参数 --cni-conf-dir --cni-bin-dir --cni-cache-dir | Containerd 配置文件(toml):[plugins.cri.cni]bin_dir = "/opt/cni/bin"conf_dir = "/etc/cni/net.d" |