排查 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 处于未就绪状态,并且仍然附加着网络命名空间。要从这个问题中恢复,请编辑 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
  • 升级或安装最新版本的容器运行时。
  1. 通过重新启动容器运行时和 kubelet 将节点带回集群。取消隔离节点 (kubectl uncordon <nodename>)。

一个 containerd 配置文件的示例

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

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

在 Kubernetes 上,containerd 运行时默认行为是将 loopback 接口 lo 添加到 pod。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 地址范围更新上述示例中的 IP 地址范围。

上次修改时间:太平洋标准时间 2023 年 12 月 24 日下午 9:00: 修复拼写错误 (d536e46dbd)