容器运行时是 Kubernetes 的核心组件,负责管理镜像和容器的生命周期。
在通过平台创建集群时,您可以选择 Containerd 或 Docker 作为您的运行时组件。
注意:Kubernetes 版本 1.24 及以上不再官方支持 Docker 运行时。官方推荐的运行时是 Containerd。如果您仍需使用 Docker 运行时,则在创建集群时必须首先在功能开关中启用 cri-docker,才能选择 Docker 作为运行时组件。有关使用功能开关的详细信息,请参见 功能开关配置。
| 选择 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 添加了像集群、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"} | 方法 1:在 kubelet 参数中指定:--container-log-max-files=5--container-log-max-size="100Mi"方法 2:在 KubeletConfiguration 中指定: "containerLogMaxSize": "100Mi","containerLogMaxFiles": 5, |
| 将容器日志保存到数据磁盘 | 将数据磁盘挂载到 "data-root"(默认是 /var/lib/docker)。 | 创建符号链接 /var/log/pods 指向数据磁盘挂载点下的目录。 |
| 比较 | Docker | Containerd |
|---|---|---|
| 谁调用 CNI | cri-dockerd | 内置在 Containerd 中的 cri 插件(在 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" |