containerd 2.0/2.1 变更清单与升级前检查:NRI、CDI 默认启用,废弃 API 命中会中断升级
参考文档:
containerd 2.0 主要变化
- Transfer service 稳定:提供在任意源与目标之间传输 artifact 对象的简单接口,API 以二进制流和数据通道为一等公民,减少协议与 API 的频繁更新。
- Sandbox service 稳定:扩展对 containerd shim 的管理,为 pod、VM 等多容器环境提供更多灵活性。
- Sandboxed CRI 默认启用:CRI 插件从旧 CRI server 切换到 sandbox controller 实现,以支持 podsandbox。
- Sandbox 属性可变:sandbox controller 新增 Update API(
/containerd.services.sandbox.v1.Controller/Update),可修改已存在 sandbox 的 spec、runtime、extensions、labels。 - NRI(Node Resource Interface)默认启用。
- CDI(Container Device Interface)默认启用。
- 守护进程配置版本 3(
version = 3);启动时自动迁移旧配置,建议主动迁移以优化启动时间。 - Introspection API 新增
PluginInfo。 - 内置 tracing 插件支持 OpenTelemetry 标准环境变量。
- 镜像拉取支持 Intel ISA-L igzip,作为 pigz 的替代。
- 新增 image verifier 插件。
- CRI 支持 user namespaces(把容器内用户 ID 映射到宿主机不同用户 ID,限制容器内 root 权限)、递归只读挂载、默认允许非特权端口与 ICMP。
弃用与移除项:
- Docker Schema 1 镜像默认禁用。
- 默认 Seccomp 配置移除
io_uring_*,容器默认没有 io_uring 系统调用权限。 - 移除
LimitNOFILE配置。 - 移除
io.containerd.runtime.v1.linux与io.containerd.runc.v1。 - 移除
containerd.io/restart.logpath标签。 - 移除 CRI v1alpha2 API(K8s 自 1.26 起弃用)。
- 移除 AUFS snapshotter。
- 移除
cri-containerd-(cni-)-VERSION-OS-ARCH.tar.gz发布包。 - containerd client 拆到独立包。
- CRI registry properties 弃用。
- Go-plugin 运行时插件、events envelope 弃用。
containerd 2.1
containerd 2.1 被 ACK 1.33 默认使用:
- 默认启用 NRI 与 CDI;支持 Sandbox API。
- 废弃配置
registry.auths、registry.configs、registry.mirrors。 - 不再支持 Docker Schema 1 镜像(如
application/vnd.docker.distribution.manifest.v1+json),拉取会被拒绝。 io_uring_*从默认 Seccomp 配置移除;移除 CRI v1alpha2 API、AUFS snapshotter、[plugins."io.containerd.internal.v1".tracing]配置项。
排查与升级
先确认当前环境是否踩到弃用项:
# 列出已弃用 API
ctr deprecations list
# 识别 Docker Schema 1 镜像
ctr --namespace k8s.io images list 'labels."io.containerd.image/converted-docker-schema1"'
再用 kubectl + jq 检查是否有 Pod 通过 hostPath 挂载了 /var/run/containerd、containerd.sock 等目录。这类挂载在运行时升级后可能失效。
升级到 2.1 的路径是:先把控制面升到 K8s 1.33 及以上,再升级节点池运行时。升级过程会做废弃 API 检测,命中会中断升级。
不支持回退:2.1 引入 shim-v3 API,无法退回 1.6 的 shim-v2。原地升级默认沿用原数据目录,数据不丢。