
# containerd 2.x版本说明
CCE v1.35版本集群默认将容器运行时升级为containerd 2.x。相比于1.x版本，containerd 2.x在镜像安全、运行时性能、以及多沙箱（Sandbox）支持等方面均有显著提升。
本文重点介绍containerd 2.x的核心变更说明（包括新特性与废弃功能），以及升级过程中的注意事项和自检指南。
#### 功能特性与核心变更
以下仅介绍主要功能特性，详细信息请参见[containerd发布记录](https://github.com/containerd/containerd/blob/main/docs/containerd-2.0.md)。
#### 新增与增强特性
containerd特性：
- **默认启用NRI（Node Resource Interface）**：允许外部插件介入容器生命周期，实现更精细的节点资源管理和分配。
- **默认启用CDI（Container Device Interface）**：标准化了复杂设备（如GPU、FPGA等）注入容器的方式。
- **支持Sandbox API**：原生支持PodSandbox机制，对运行多种隔离级别的容器（如结合Kata Containers或其他轻量级安全沙箱）提供了更好的底层架构支持。
Kubernetes上游关联特性：
- **[支持用户命名空间（User Namespaces）](https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/user-namespaces/)**：通过底层的隔离技术，允许Pod内的root用户映射为主机上的非特权用户。这大幅提升了容器的安全隔离性，同时Kubernetes会相应地放宽对此类Pod的安全标准限制（如runAsNonRoot检查）（注意该特性还依赖linux 6.3+内核，请确认内核支持情况，推荐使用HCE 3.0上使用）。
- [**支持容器镜像卷（Image Volumes）**](https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/image-volumes/)：支持将OCI镜像的内容直接作为数据卷（Volume）挂载到Pod内部。借助containerd的支持，您可以复用镜像仓库的分发能力来下发静态配置、模型文件或构建产物，而无需将其作为独立容器运行（注：自K8s 1.33起进一步支持subPath挂载）。
 
#### 废弃功能与API移除
- **移除CRI v1alpha2 API**：Kubernetes自1.26起弃用该API，containerd 2.x系列已彻底移除。如果您有自定义组件依赖此API，必须切换至CRI v1。
- **不再支持Docker Schema 1镜像**：拉取如application/vnd.docker.distribution.manifest.v1+json格式的旧版镜像将被拒绝。
- **Seccomp策略收紧**：io_uring_\*系统调用已从默认的Seccomp配置文件中移除。默认情况下，容器内不再允许发起io_uring相关的系统调用。
- **移除AUFS snapshotter**：彻底移除对AUFS存储驱动的支持。
- **废弃部分配置项**：移除了registry.auths、registry.configs、registry.mirrors以及\[plugins."io.containerd.internal.v1".tracing\]等配置。建议通过控制台节点池自定义containerd参数来实现同等功能。
 
#### 升级前自检（重要）
升级至containerd 2.x之前，系统会进行废弃API和不兼容项的检测。**若检测到相关阻碍，升级将被中断。**建议您在触发集群升级前，手动完成以下自检。
#### 检查是否直接挂载了containerd目录
如果业务Pod直接挂载了containerd的socket或相关运行目录，可能会受到影响。您可以使用以下命令检查当前集群（需提前安装jq工具，可通过**yum install jq**命令安装）：
```
kubectl get pods --all-namespaces -o json | \
jq -r '.items[] |
  select(.spec.volumes[]?.hostPath.path as $p |
    ["/", "/var", "/var/","/var/run", "/var/run/",
     "/var/run/containerd", "/var/run/containerd/",
     "/var/run/containerd/containerd.sock",
     "/run", "/run/", "/run/containerd", "/run/containerd/",
     "/run/containerd/containerd.sock"] | index($p)) |
  .metadata.namespace + "/" + .metadata.name'
```
#### 识别当前节点废弃的API调用
登录到具体节点，使用ctr命令行工具查看当前是否有正在被调用的废弃API：
```
ctr deprecations list
```
 #### 检查是否存在Docker Schema 1镜像
同样在节点层执行以下命令，排查本地缓存中是否仍有Schema 1格式的镜像：
```
ctr --namespace k8s.io images list 'labels."io.containerd.image/converted-docker-schema1"'
```
#### 升级方式
请将集群升级至1.35或以上版本，升级过程中会自动将containerd版本升级至2.x。操作详情请参见[集群升级](https://support.huaweicloud.com/usermanual-cce/cce_10_0197.html)。
#### 常见问题
- **升级containerd版本，业务是否会受影响？**
  升级过程中默认采取**原地升级**策略。升级期间容器不会重启，正在运行的业务可保持正常提供服务。
  
- **从containerd 1.7升级至2.x后，如果遇到问题可以回退吗？**
  **不支持回退**。containerd 2.x系列全面引入了Shim v3 API，底层架构与1.x时代的Shim v2存在不兼容性。一旦升级完成，无法原地降级回老版本。
  
- **升级过程中，节点上的容器数据（如镜像、容器日志）会丢失吗？**
  不会。原地升级时，containerd 2.x将继续复用原有的数据目录（Data Root和State Root），现有数据不会丢失。
  
 
#### 相关文档
- [containerd社区发布记录](https://github.com/containerd/containerd/blob/v2.0.0/RELEASES.md)
- [containerd社区变更说明](https://github.com/containerd/containerd/blob/main/docs/containerd-2.0.md)
 
