容器运行时是 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" |