Kubernetes v1.24将不再支持将Docker作为内置容器运行时,为了将ACK升级到Kubernetes v1.24及更高版本,您需要将节点容器运行时从Docker迁移到containerd。本文介绍如何在ACK管理控制台将节点容器运行时从Docker迁移到containerd。
前提条件
已创建Kubernetes集群。具体操作,请参见创建ACK托管集群。
在您的Kubernetes集群中存在以Docker作为容器运行时的节点。
Docker迁移到containerd信息介绍
升级方案
将节点容器运行时从Docker迁移到containerd主要通过以下两种节点池升级方案实现。
方案一:轮转节点。通过新建节点池(新建节点池时选择containerd运行时),然后通过应用负载重新发布,指定节点池调度的方式,逐步把应用全部迁移到新的节点池,旧的节点池再做下线处理。
方案二:替盘升级。该方案需要替换节点的系统盘。下文介绍的升级内容,均为替盘升级的方案说明和操作方法。
替盘升级的执行步骤及处理逻辑
前置检查,后台程序会自动检查集群以及所依赖的组件版本是否符合containerd的运行要求,如果有不符合项,在升级前需要提前处理。
执行节点池升级,节点池升级过程会根据设置的最大并行数,依次对节点进行升级,最大并行数不会超过节点总数的10%。每个批次的升级节点数为:1、2、4、8……直至达到最大并行数,达到最大并行数后,每个批次都按最大并行数的节点进行升级。例如最大并行数设置为4,那么第一批升级的节点个数为1,第二批升级的节点个数为2,第三批升级的节点个数为4,以后每批的升级节点个数均为4。
替盘升级单个节点内部的升级逻辑
执行节点排水(并设置节点为不可调度)。
ECS关机,即停止节点。
更换系统盘, 系统盘ID会变更,但是云盘类型、实例IP地址以及弹性网卡MAC地址保持不变。
重新初始化节点。
重启节点,节点就绪(设置节点为可调度)。
注意事项
一般情况下,您的工作负载不依赖于容器运行时,且Docker本身的后端也是调用的containerd,因此,理论上在完成迁移后您的工作负载将不受影响。
建议您先在测试环境中进行迁移测试,确认没有影响后再在生产环境中进行迁移操作,以免造成预期外的损失。
由于containerd本身不具有镜像构建的功能,因此在完成升级后,在集群节点上您将无法使用Docker Build进行镜像构建,但镜像的拉取不受影响。
建议您不要在集群节点上进行镜像构建工作。
将容器运行时迁移到containerd后,Docker将不再作为容器生命周期的管理者。因此,在完成迁移后您将无法在节点上使用Docker命令或Docker API查看容器状态或与容器进行交互。
背景信息
因为Kubernetes社区将在Kubernetes v1.24中不再支持将Docker作为内置容器运行时。为此,Dockershim组件也将在Kubernetes v1.24版本中被正式移除,这意味着kubelet将无法再通过该组件与Docker进行交互并进行容器的创建和管理操作。
由于社区的更改,ACK也将在Kubernetes v1.24及更高版本中不再支持将Docker作为内置容器运行时。如果您正在使用Docker作为容器运行时,则必须先迁移到使用containerd作为容器运行时,否则将无法在ACK的后续更新中升级到Kubernetes v1.24及更高版本。
containerd容器运行时是Kubernetes支持的行业标准容器运行时,与Docker运行时相比,containerd具有更省资源且更安全的优势。关于containerd的更多信息,请参见containerd。
操作步骤
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在节点池页面,选择目标节点池,选择更多>升级。
选择运行时升级,单击前置检查。
前置检查通过后,选择运行时升级,单击开始升级。
更多节点池升级的内容,请参见升级节点池。
常见问题
每个批次升级大概需要多长时间?
通过节点池升级页面将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目录。