将节点容器运行时从Docker迁移到containerd

Kubernetes 1.24将不再支持将Docker作为内置容器运行时,Dockershim组件也将在1.24版本中被正式移除。这意味着kubelet将无法再通过该组件与Docker进行交互并进行容器的创建和管理操作。为此,ACK也将在1.24及更高版本中不再支持将Docker作为内置容器运行时。为了将ACK升级到1.24及更高版本,您需要将节点容器运行时从Docker迁移到containerd。

containerd容器运行时是Kubernetes支持的行业标准容器运行时,与Docker运行时相比,containerd具有更省资源且更安全的优势。关于containerd的更多信息,请参见containerd

前提条件

已创建集群且集群中存在以Docker作为容器运行时的节点,请参见创建集群

Docker迁移到containerd信息介绍

升级方案

将节点容器运行时从Docker迁移到containerd主要通过以下两种节点池升级方案实现。

  • 方案一:轮转节点。通过新建节点池(新建节点池时选择containerd运行时),然后通过应用负载重新发布,指定节点池调度的方式,逐步把应用全部迁移到新的节点池,旧的节点池再做下线处理。

  • 方案二:替盘升级。该方案需要替换节点的系统盘,请勿在系统盘中保存重要数据,或提前做好备份工作,数据盘在升级过程中则不受影响。

    下文介绍的升级内容,均为替盘升级的方案说明和操作方法。

替盘升级的执行步骤及处理逻辑

  1. 前置检查,后台程序会自动检查集群以及所依赖的组件版本是否符合containerd的运行要求,如果有不符合项,在升级前需要提前处理。

  2. 执行节点池升级,节点池升级过程会根据设置的最大并行数,依次对节点进行升级,最大并行数不会超过节点总数的10%。每个批次的升级节点数为:1、2、4、8……直至达到最大并行数,达到最大并行数后,每个批次都按最大并行数的节点进行升级。例如最大并行数设置为4,那么第一批升级的节点个数为1,第二批升级的节点个数为2,第三批升级的节点个数为4,以后每批的升级节点个数均为4。

替盘升级单个节点内部的升级逻辑

  1. 执行节点排水(并设置节点为不可调度)。

  2. ECS关机,即停止节点。

  3. 更换系统盘, 系统盘ID会变更,但是云盘类型、实例IP地址以及弹性网卡MAC地址保持不变。

  4. 重新初始化节点。

  5. 重启节点,节点就绪(设置节点为可调度)。

image

注意事项

  • 一般情况下,您的工作负载不依赖于容器运行时,且Docker本身的后端也是调用的containerd,因此,理论上在完成迁移后您的工作负载将不受影响。

    重要

    建议您先在测试环境中进行迁移测试,确认没有影响后再在生产环境中进行迁移操作,以免造成预期外的损失。

  • 由于containerd本身不具有镜像构建的功能,因此在完成升级后,在集群节点上您将无法使用Docker Build进行镜像构建,但镜像的拉取不受影响。

    重要

    建议您不要在集群节点上进行镜像构建工作。

  • 将容器运行时迁移到containerd后,Docker将不再作为容器生命周期的管理者。因此,在完成迁移后您将无法在节点上使用Docker命令或Docker API查看容器状态或与容器进行交互。

操作步骤

建议您在业务低峰期登录控制台执行运行时的更换和升级。下方介绍如何完成节点运行时的升级,关于节点池升级的更多介绍,请参见升级节点池

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,选择目标节点池,选择更多>Kubelet 升级

  4. 选择运行时升级,单击前置检查,前置检查通过后,按照页面提示完成运行时的升级。

常见问题

每个批次升级大概需要多长时间?

通过节点池升级页面将Docker迁移到containerd,采用的是替盘升级方式。如果不涉及快照,一般是8min内。如果在升级时选中快照,升级会在快照结束后执行,执行时间取决于快照时间。节点池升级容忍快照40min,如果40min内快照还未结束会判定节点超时失败,失败的节点此时还未开始执行升级操作。如果没有在系统盘中保存业务数据,可以不选中快照,避免升级用时过久。

升级过程业务是否受影响?

通过节点池升级页面将Docker迁移到containerd,采用的是替盘升级方式。替盘升级时会对节点排水,如果Pod实现了优雅退出逻辑(Graceful shutdown and zero downtime deployments in Kubernetes),并且多副本部署在多个Node上,对业务没有影响。为了避免同一个应用的多个副本都在一个批次内进行升级,可以手动调整并行数小于Pod副本数。

将Docker迁移到containerd后,支持回退吗?

不支持回退。

将Docker迁移到containerd的过程中,节点数据会丢失吗?

通过节点池升级页面将Docker迁移到containerd,采用的是替盘升级方式。以替换节点系统盘的方式执行节点运行时升级时,请不要在系统盘中保存重要数据或者提前做好备份工作,数据盘在升级过程中则不受影响。

节点替换系统盘后,节点的IP地址会变吗?

替换系统盘, 系统盘ID会变更,但是云盘类型、实例IP地址以及弹性网卡MAC地址保持不变。更多信息,请参见更换操作系统(系统盘)

containerd对Docker的兼容情况是怎样的?

一般情况下,您的工作负载不依赖于容器运行时,且Docker本身的后端也是调用的containerd,因此,理论上在完成迁移后您的工作负载将不受影响。

由于containerd本身不具有镜像构建的功能,因此在完成升级后,在集群节点上您将无法使用Docker Build进行镜像构建,但镜像的拉取不受影响。

将容器运行时迁移到containerd后,Docker将不再作为容器生命周期的管理者。因此,在完成迁移后您将无法在节点上使用Docker命令或Docker API查看容器状态或与容器进行交互。

如果之前在集群节点上依赖Docker构建了镜像,现在运行时升级为containerd怎么办?

您可以基于阿里云容器镜像服务ACR的产品化能力构建镜像,也可以手动构建镜像。

  • 使用ACR构建(推荐):ACR镜像构建基于Docker官方镜像构建工具BuildKit实现。您可以创建ACR实例,基于Dockerfile文件的构建规则自动触发镜像构建,然后运行Dockerfile执行构建,构建完成后自动提交镜像到容器镜像仓库。具体操作,请参见使用企业版实例构建镜像

  • 手动构建:为保障最佳的节点性能,建议额外创建一台ECS实例,手动安装Docker后使用Docker命令构建镜像。具体操作,请参见安装Docker

节点运行时由Docker切换为containerd后,Docker目录未被清理占用磁盘空间怎么办?

除Kubernetes集群可管理的容器、镜像、日志等文件外,Docker目录中也包含您自行创建的文件路径。如无需使用,请在运行时切换后手动删除数据盘中的Docker目录。