更新时间:2024-12-04 GMT+08:00

容器引擎

容器引擎介绍

容器引擎是Kubernetes最重要的组件之一,负责管理镜像和容器的生命周期。Kubelet通过Container Runtime Interface (CRI) 与容器引擎交互,以管理镜像和容器。

CCE当前支持用户选择Containerd和Docker容器引擎,其中Containerd调用链更短,组件更少,更稳定,占用节点资源更少

表1 容器引擎对比

对比

Containerd

Docker

调用链

kubelet --> CRI plugin(在containerd进程中) --> containerd

  • Docker(Kubernetes 1.23及以下版本):

    kubelet --> dockershim (在kubelet 进程中) --> docker --> containerd

  • Docker(Kubernetes 1.24及以上版本社区方案):

    kubelet --> cri-dockerd (kubelet使用CRI接口对接cri-dockerd) --> docker --> containerd

命令

crictl/ctr

docker

Kubernetes CRI支持

原生支持

需通过dockershim或cri-dockerd提供CRI支持

Pod 启动延迟

kubelet CPU/内存占用

运行时CPU/内存占用

节点操作系统与容器引擎对应关系

  • v1.23及以上的VPC网络集群都支持Containerd,容器隧道网络集群从v1.23.2-r0开始支持Containerd。
表2 CCE集群节点操作系统与容器引擎对应关系

操作系统

内核版本

容器引擎

容器存储Rootfs

容器运行时

EulerOS 2.9

4.x

Docker

1.23起支持Containerd

OverlayFS

runC

EulerOS 2.10

4.x

Docker

1.23起支持Containerd

OverlayFS

runC

Huawei Cloud EulerOS 2.0

5.x

Docker

Containerd

OverlayFS

runC

Containerd和Docker组件常用命令对比

Containerd不支持dockerAPI和dockerCLI,但是可以通过cri-tool命令实现类似的功能。

表3 镜像相关功能

操作

Docker命令

Containerd命令

docker

crictl

ctr

列出本地镜像列表

docker images

crictl images

ctr -n k8s.io i ls

拉取镜像

docker pull

crictl pull

ctr -n k8s.io i pull

上传镜像

docker push

ctr -n k8s.io i push

删除本地镜像

docker rmi

crictl rmi

ctr -n k8s.io i rm

检查镜像

docker inspect

crictl inspecti

表4 容器相关功能

操作

Docker命令

Containerd命令

docker

crictl

ctr

列出容器列表

docker ps

crictl ps

ctr -n k8s.io c ls

创建容器

docker create

crictl create

ctr -n k8s.io c create

启动容器

docker start

crictl start

ctr -n k8s.io run

停止容器

docker stop

crictl stop

删除容器

docker rm

crictl rm

ctr -n k8s.io c del

连接容器

docker attach

crictl attach

进入容器

docker exec

crictl exec

查看容器详情

docker inspect

crictl inspect

ctr -n k8s.io c info

查看容器日志

docker logs

crictl logs

查看容器的资源使用情况

docker stats

crictl stats

更新容器资源限制

docker update

crictl update

表5 Pod相关功能

操作

Docker命令

Containerd命令

docker

crictl

ctr

列出Pod列表

crictl pods

查看Pod详情

crictl inspectp

启动Pod

crictl start

运行Pod

crictl runp

停止Pod

crictl stopp

删除Pod

crictl rmp

Containerd创建并启动的容器会被kubelet立即删除,不支持暂停、恢复、重启、重命名、等待容器,Containerd不具备docker构建、导入、导出、比较、推送、查找、打标签镜像的能力,Containerd不支持复制文件,可通过修改containerd的配置文件实现登录镜像仓库。

调用链区别

  • Docker(Kubernetes 1.23及以下版本):

    kubelet --> docker shim (在kubelet 进程中) --> docker --> containerd

  • Docker(Kubernetes 1.24及以上版本社区方案):

    kubelet --> cri-dockerd (kubelet使用cri接口对接cri-dockerd) --> docker --> containerd

  • Containerd:

    kubelet --> cri plugin(在containerd进程中) --> containerd

其中Docker虽增加了swarm cluster、docker build、docker API等功能,但也会引入一些bug,并且与Containerd相比,多了一层调用,因此Containerd被认为更加节省资源且更安全