CNI 插件相关错误排查

为避免 CNI 插件相关错误,请验证你使用的或升级到的容器运行时已测试并能与你当前的 Kubernetes 版本正常工作。

关于“不兼容的 CNI 版本”和“销毁沙箱网络失败”错误

当 CNI 插件未升级和/或 CNI 配置文件中未声明 CNI 配置版本时,containerd v1.6.0-v1.6.3 中存在 pod CNI 网络设置和销毁的服务问题。containerd 团队报告称:“这些问题已在 containerd v1.6.4 中解决。”

使用 containerd v1.6.0-v1.6.3 时,如果你不升级 CNI 插件和/或声明 CNI 配置版本,可能会遇到以下“不兼容的 CNI 版本”或“销毁沙箱网络失败”错误情况。

不兼容的 CNI 版本错误

如果你的 CNI 插件版本与配置文件中的插件版本不正确匹配(因为配置版本高于插件版本),containerd 日志在启动 pod 时很可能会显示类似如下的错误消息

incompatible CNI versions; config is \"1.0.0\", plugin supports [\"0.1.0\" \"0.2.0\" \"0.3.0\" \"0.3.1\" \"0.4.0\"]"

要解决此问题,请更新你的 CNI 插件和 CNI 配置文件

销毁沙箱网络失败错误

如果在 CNI 插件配置中缺少插件的版本信息,pod 可能会运行。但是,停止 pod 时会生成类似如下的错误

ERROR[2022-04-26T00:43:24.518165483Z] StopPodSandbox for "b" failed
error="failed to destroy network for sandbox \"bbc85f891eaf060c5a879e27bba9b6b06450210161dfdecfbb2732959fb6500a\": invalid version \"\": the version is empty"

此错误会导致 pod 处于 NotReady 状态,并且网络命名空间仍处于附加状态。要从此问题中恢复,请编辑 CNI 配置文件以添加缺少的版本信息。下一次停止 pod 的尝试应该会成功。

更新 CNI 插件和 CNI 配置文件

如果你正在使用 containerd v1.6.0-v1.6.3 并遇到“不兼容的 CNI 版本”或“销毁沙箱网络失败”错误,请考虑更新你的 CNI 插件并编辑 CNI 配置文件。

以下是针对每个节点的典型步骤概述

  1. 安全地排空并封锁节点.

  2. 停止容器运行时和 kubelet 服务后,执行以下升级操作

    • 如果你正在运行 CNI 插件,请将其升级到最新版本。
    • 如果你使用的是非 CNI 插件,请将其替换为 CNI 插件。使用最新版本的插件。
    • 更新插件配置文件以指定或匹配插件支持的 CNI 规范版本,如下面的“containerd 配置文件示例”部分所示。
    • 对于 containerd,请确保你已安装最新版本(v1.0.0 或更高版本)的 CNI loopback 插件。
    • 将节点组件(例如 kubelet)升级到 Kubernetes v1.24
    • 升级或安装最新版本的容器运行时。
  3. 通过重启容器运行时和 kubelet 将节点重新加入集群。解除节点封锁(kubectl uncordon <nodename>)。

containerd 配置文件示例

以下示例显示了 containerd 运行时 v1.6.x 的配置,它支持最新版本的 CNI 规范 (v1.0.0)。

有关配置系统的更多说明,请参阅你的插件和网络提供商的文档。

在 Kubernetes 中,containerd 运行时默认会为 pod 添加一个 loopback 接口 lo。containerd 运行时通过 CNI 插件 loopback 配置 loopback 接口。loopback 插件作为带有 cni 标记的 containerd 发布包的一部分分发。containerd v1.6.0 及更高版本包含与 CNI v1.0.0 兼容的 loopback 插件以及其他默认 CNI 插件。loopback 插件的配置由 containerd 内部完成,并设置为使用 CNI v1.0.0。这也意味着当启动较新版本的 containerd 时,loopback 插件的版本必须是 v1.0.0 或更高版本。

以下 bash 命令生成一个 CNI 配置示例。在此示例中,配置版本的值 1.0.0 被赋值给 cniVersion 字段,供 containerd 调用 CNI bridge 插件时使用。

cat << EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
 "cniVersion": "1.0.0",
 "name": "containerd-net",
 "plugins": [
   {
     "type": "bridge",
     "bridge": "cni0",
     "isGateway": true,
     "ipMasq": true,
     "promiscMode": true,
     "ipam": {
       "type": "host-local",
       "ranges": [
         [{
           "subnet": "10.88.0.0/16"
         }],
         [{
           "subnet": "2001:db8:4860::/64"
         }]
       ],
       "routes": [
         { "dst": "0.0.0.0/0" },
         { "dst": "::/0" }
       ]
     }
   },
   {
     "type": "portmap",
     "capabilities": {"portMappings": true},
     "externalSetMarkChain": "KUBE-MARK-MASQ"
   }
 ]
}
EOF

根据你的用例和网络寻址方案,更新前述示例中的 IP 地址范围。

最后修改于 2025 年 2 月 11 日下午 5:08 PST:清理两个关于 migrating-from-dockershim 的页面 (ab48d1b846)