
# 将节点容器运行时从Docker迁移到Containerd
Kubernetes社区已经在v1.24版本中[移除Dockershim](https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/migrating-from-dockershim/)，为保持与社区技术路线同步，并提升集群运行的稳定性与资源效率，强烈建议您将节点容器运行时从Docker逐步迁移至官方推荐的Containerd，以确保未来与Kubernetes版本的兼容性和持续支持。
[Containerd](https://containerd.io/)是Kubernetes支持的行业标准容器运行时，与Docker相比，Containerd资源占用更低、容器启动更快、兼具更高稳定性与安全性。
#### 前提条件
- 已创建至少一个集群，并且该集群支持Containerd节点，详情请参见[节点操作系统与容器运行时对应关系](https://support.huaweicloud.com/usermanual-cce/cce_10_0462.html#cce_10_0462__section159298451879)。
- 您的集群中存在容器运行时为Docker的节点或节点池。
 
#### 注意事项
- 节点容器运行时的迁移会重建节点上运行的业务Pod，理论上**可能会导致业务短暂中断**，因此强烈建议您确保业务在多实例高可用部署的情况下进行迁移，并且建议先在测试环境试验迁移的影响，然后在业务低峰期进行生产环境迁移，以最大限度避免可能存在的风险。
- **Containerd不具备镜像构建功能** ，完成迁移后，您无法在Containerd节点上使用Docker Build功能构建镜像，但拉取镜像不受影响。Docker和Containerd其他差异请参考[容器运行时说明](https://support.huaweicloud.com/usermanual-cce/cce_10_0462.html)。
- 若您在原有Docker节点或节点池上部署的负载设置了对应的节点亲和性策略，则需要将负载的节点亲和性策略配置为新的Containerd节点或节点池。这种情况下，为尽可能避免业务中断，您可以采用滚动升级的方式，在不删除现有节点亲和性配置的前提下，为工作负载添加对新Containerd节点或节点池的亲和性配置，等滚动升级全部完成，经过充分测试确认没有问题后，再安全地删除对旧Docker节点的亲和性配置。
 
#### 默认节点池迁移
您可以将原Docker节点直接重置为Containerd节点。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
如果节点资源使用率较高，直接将已有Docker节点重置可能导致该节点上的Pod迁移后重建失败，您可以按需新增一定数量的节点进行避免。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在集群控制台左侧导航栏中选择"节点管理"，切换至"节点"页签。
3. 筛选集群中的Docker节点，选择一个Docker节点，在"更多"功能中选择"禁止调度"。
4. 在"更多"功能中选择"节点排水"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002531649585.png "点击放大")
   
   
   
5. 在确认界面开启"强制排水"，然后单击"确定"进行节点排水。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002499729690.png "点击放大")
   
   
   
6. 排水完成后，在节点列表中选择该节点，单击"更多 \> 重置节点"。
7. 在容器运行时中选择Containerd，其余参数可根据需要进行调整，也可以和创建时保持一致。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002499729692.png "点击放大")
   
   
   
8. 单击"下一步：规格确认"。
9. 阅读使用说明并勾选确认，单击"提交"。当节点状态显示为安装中时，即表示正在重置节点。 
   待节点状态显示为运行中时，您即可检查节点容器运行时是否切换成功，页面中可以看到节点运行时版本已经切换为Containerd，并且登录节点可以执行**crictl** **ps** 、**crictl inspect**等Containerd相关命令查看节点上运行的容器信息。
   
   
10. 重复以上步骤，直至所有Docker节点均被替换为Containerd节点。
 
#### 自定义节点池迁移
您可以选择以下方案进行迁移。
#### 自定义节点池迁移方案一：滚动更新原Docker节点池
您可使用[更新节点池](https://support.huaweicloud.com/usermanual-cce/cce_10_0653.html)功能，修改原Docker节点池的运行时配置为Containerd，其余配置保持不变，随后将节点池内的节点进行滚动更新。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧选择"节点管理"，切换至"节点池"页签，找到需要修改的Docker节点池，单击"更新"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002499880420.png "点击放大")
   
   
   
3. 在节点池配置页面中，选择容器运行时为Containerd，其余参数可根据需要进行调整，并完成节点池更新。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002499729692.png "点击放大")
   
   
4. 完成节点池更新后，该节点池中新增的节点为Containerd运行时，而节点池中存量节点会出现"节点池更新"字样，此时如果重置该节点会将其更新为Containerd运行时。 
   您也单击节点池名称后的"更多 \> 同步"，根据需要分批次完成节点池中的所有节点重置。
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
   如果节点池资源使用率较高，直接将已有Docker节点重置可能导致该节点上的Pod迁移后重建失败，您可以在该节点池中按需新增一定数量的节点进行避免。
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002511651312.png "点击放大")
   
   
   
 
#### 自定义节点池迁移方案二：新建Containerd节点池迁移
您可使用[节点池复制](https://support.huaweicloud.com/usermanual-cce/cce_10_0655.html)功能，复制原有的Docker节点池，并将新节点池的容器运行时选择为Containerd，其余配置和原Docker节点池保持一致。
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧选择"节点管理"，切换至"节点池"页签，并在需要复制的Docker节点池"操作"栏中，单击"更多 \> 复制"。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001967393806.png "点击放大")
   
   
3. 在节点池配置页面中，选择容器运行时为Containerd，其余参数可根据需要进行调整，并完成节点池创建。 
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000002499729692.png "点击放大")
   
   
4. 将创建完的Containerd节点池扩容至原Docker节点池的节点数量，并逐个删除Docker节点池中的节点。 
   **推荐使用滚动的方式迁移**，即扩容部分Containerd节点，再删除部分Docker节点，直至新的Containerd节点池中节点数量和原Docker节点池中节点数量一致。
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
   若您在原有Docker节点或节点池上部署的负载设置了对应的节点亲和性策略，则需要将负载的节点亲和性策略配置为新的Containerd节点或节点池。这种情况下，为尽可能避免业务中断，您可以在不删除现有节点亲和性配置的前提下，为工作负载添加对新Containerd节点或节点池的亲和性配置，等滚动升级全部完成，经过充分测试确认没有问题后，再安全地删除对旧Docker节点的亲和性配置。
   
   
5. 迁移完成后，删除原有Docker节点池。
 
#### 常见问题
#### 迁移到containerd后对Docker的兼容情况如何？
containerd支持OCI（Open Container Initiative）标准规范，之前用**docker build**创建的所有镜像可以在containerd环境下运行，理论上在完成迁移后您的工作负载将不受影响。
但在以下开发场景中可能会受影响：
- 需要使用docker build命令进行镜像构建，而containerd本身不具有镜像构建的功能。
- 开发环境需要Docker-in-Docker（DinD）或Docker Socket挂载到容器（DooD），例如CI/CD流水线的场景，需要构建并推送镜像。
- 需要使用Docker API查看容器状态或与容器进行交互。
 
#### 如果之前在集群节点上依赖Docker构建镜像，现在运行时升级为containerd无法构建镜像，怎么办？
您可以在节点上安装containerd的官方工具[nerdctl](https://github.com/containerd/nerdctl)来构建镜像，或者额外创建一台ECS实例手动安装Docker后使用Docker命令构建镜像。
