如何选择Docker运行时、containerd运行时、或者安全沙箱运行时?

容器服务 Kubernetes 版 ACK(Container Service for Kubernetes)支持containerd、Docker、安全沙箱三种运行时。本文通过对比三种运行时的实现和使用限制、部署结构,帮助您根据需求场景选择合适的容器运行时。

容器运行时实现和使用限制的对比

特性

containerd运行时

Docker运行时

安全沙箱运行时

集群类型

  • ACK托管集群

  • ACK专有集群

  • ACK Edge集群

所有集群类型

  • ACK托管集群

  • ACK专有集群

集群版本

1.31及以下版本

1.22及以下版本

说明

建议您升级Docker运行时为containerd运行时。详细信息,请参见将节点容器运行时从Docker迁移到containerd

1.31及以下版本

节点型号

  • ECS

  • EBM

  • 用户自有节点(ACK Edge集群

  • ECS

  • EBM

EBM

节点OS

  • CentOS

  • Alibaba Cloud Linux

  • ACK 1.20.4版本及以上的Windows

  • Ubuntu(ACK Edge集群

  • CentOS

  • Alibaba Cloud Linux

Alibaba Cloud Linux定制版

容器引擎

containerd

Docker

containerd

监控

支持

支持

支持

容器日志文件采集

支持

支持

手动支持(Sidecar)

容器标准输出采集

支持

支持

支持

RuntimeClass

不支持

不支持

支持(runV)

Pod调度

无需配置

无需配置

配置如下:

  • Kubernetes 1.14.x版本中必须为nodeSelector增加以下配置。

    alibabacloud.com/sandboxed-container: Sandboxed-Container.runv
  • Kubernetes 1.16.x以及更高版本无需额外配置。

HostNetwork

支持

支持

不支持

exec/logs

支持

支持

支持

节点数据盘

可选

可选

必选(不小于200 GiB)

网络插件

  • Flannel

  • Terway(ACK Edge集群除外)

  • Flannel

  • Terway

  • Flannel

  • terway-eniip:仅支持非IPVlan且非独占弹性网卡模式的terway-eniip。

kube-proxy代理模式

  • iptables

  • IPVS

  • iptables

  • IPVS

  • iptables

  • IPVS

存储插件

CSI Plugin(ACK Edge集群除外)

CSI Plugin

CSI Plugin

容器RootFS

OverlayFS

OverlayFS

配置磁盘Quota的OverlayFS

说明
  • 不支持同一节点同时部署Docker和安全沙箱两种运行时。

  • 集群内可以通过创建不同节点池来实现Docker运行时节点和安全沙箱运行时节点混合部署。

  • 关于Sidecar配置,请参见通过Sidecar-CRD方式采集容器文本日志

运行时部署结构对比

运行时

部署结构

Docker

kubelet
└── dockerd
    └── containerd
        └── containerd-shim
            └── runC容器

containerd

kubelet
└── containerd
    └── containerd-shim
        └── runC容器

安全沙箱v2

kubelet
├── (CRI) containerd
│   ├── containerd-shim
│   │   └── runC 容器
│   └── containerd-shim-runv2
│       └── runV 安全沙箱容器

Docker和containerd两种容器引擎常用命令对比

Docker运行时和安全沙箱运行时的容器引擎分别是Docker和containerd,各自具有独特的命令行工具来管理镜像和容器。两种容器引擎常用命令对比如下。

命令

Docker

containerd

docker

crictl(推荐)

ctr

查看容器列表

docker ps

crictl ps

ctr -n k8s.io c ls

查看容器详情

docker inspect <container>

crictl inspect <container>

ctr -n k8s.io c info <container>

查看容器日志

docker logs <container>

crictl logs <container>

N/A

容器内执行命令

docker exec <container>

crictl exec <container>

N/A

挂载容器

docker attach <container>

crictl attach <container>

N/A

显示容器资源使用情况

docker stats <container>

crictl stats <container>

N/A

创建容器

docker create <container>

crictl create <container>

ctr -n k8s.io c create <container>

启动容器

docker start <container>

crictl start <container>

ctr -n k8s.io run <container>

停止容器

docker stop <container>

crictl stop <container>

N/A

删除容器

docker rm <container>

crictl rm <container>

ctr -n k8s.io c del <container>

查看镜像列表

docker images

crictl images

ctr -n k8s.io i ls <image>

查看镜像详情

docker inspect <image>

crictl inspecti <image>

N/A

拉取镜像

docker pull <image>

crictl pull <image>

ctr -n k8s.io i pull <image>

推送镜像

docker push <image>

N/A

ctr -n k8s.io i push <image>

删除镜像

docker rmi <image>

crictl rmi <image>

ctr -n k8s.io i rm <image>

查看Pod列表

N/A

crictl pods

N/A

查看Pod详情

N/A

crictl inspectp <pod name>

N/A

启动Pod

N/A

crictl runp <pod name>

N/A

停止Pod

N/A

crictl stopp <pod name>

N/A