选择容器运行时

概述

容器运行时是 Kubernetes 的核心组件,负责管理镜像和容器的生命周期。

在通过平台创建集群时,您可以选择 Containerd 或 Docker 作为您的运行时组件。

注意:Kubernetes 版本 1.24 及以上不再官方支持 Docker 运行时。官方推荐的运行时是 Containerd。如果您仍需使用 Docker 运行时,则在创建集群时必须首先在功能开关中启用 cri-docker,才能选择 Docker 作为运行时组件。有关使用功能开关的详细信息,请参见 功能开关配置

快速选择指南

选择 Containerd选择 Docker
  • 更短的调用链
  • 更少的组件
  • 更加稳定
  • 消耗较少的节点资源
  • 支持 docker-in-docker
  • 允许在节点上使用 docker build/push/save/load 命令
  • 可以调用 Docker API
  • 支持 Docker Compose 或 Docker Swarm

Docker 和 Containerd 的区别

常用命令

ContainerdDocker描述
crictl psdocker ps查看正在运行的容器
crictl inspectdocker inspect查看容器详细信息
crictl logsdocker logs查看容器日志
crictl execdocker exec在容器中执行命令
crictl attachdocker attach附加到容器
crictl statsdocker stats显示容器资源使用情况
crictl createdocker create创建容器
crictl startdocker start启动容器
crictl stopdocker stop停止容器
crictl rmdocker rm移除容器
crictl imagesdocker images查看镜像列表
crictl pulldocker pull拉取镜像
Nonedocker push推送镜像
crictl rmidocker rmi删除镜像
crictl podsNone查看 Pod 列表
crictl inspectpNone查看 Pod 详细信息
crictl runpNone启动 Pod
crictl stoppdocker images查看镜像
ctr images lsNone停止 Pod
crictl stoppdocker load/save导入/导出镜像
ctr images import/exportNone停止 Pod
ctr images pull/pushdocker pull/push拉取/推送镜像
ctr images tagdocker tag标记镜像

调用链差异

  • Docker 作为 Kubernetes 容器运行时有以下调用关系:

    kubelet > cri-dockerd > dockerd > containerd > runC

  • Containerd 作为 Kubernetes 容器运行时有以下调用关系:

    kubelet > cri 插件(在 containerd 进程中)> containerd > runC

总结:虽然 dockerd 添加了像集群、docker build 和 Docker API 等功能,但可能会引入 bug,并增加调用链中的一个额外层。Containerd 拥有更短的调用链,更少的组件,更大的稳定性,并消耗较少的节点资源。

日志和参数比较

比较DockerContainerd
存储路径当 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 指向数据磁盘挂载点下的目录。

CNI 网络比较

比较DockerContainerd
谁调用 CNIcri-dockerd内置在 Containerd 中的 cri 插件(在 containerd 1.1 之后)
如何配置 CNIcri-dockerd 参数 --cni-conf-dir --cni-bin-dir --cni-cache-dirContainerd 配置文件(toml):
[plugins.cri.cni]
bin_dir = "/opt/cni/bin"
conf_dir = "/etc/cni/net.d"