对 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 回环插件。
  • 将节点组件(例如,kubelet)升级到 Kubernetes v1.24
  • 升级到或安装最新版本的容器运行时。
  1. 通过重新启动容器运行时和 kubelet 将节点重新加入集群。取消隔离节点(kubectl uncordon <nodename>)。

containerd 配置文件示例

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

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

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

以下 bash 命令生成一个 CNI 配置示例。此处,配置版本的值 1.0.0 被分配给 cniVersion 字段,以便在 containerd 调用 CNI 桥接插件时使用。

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 地址范围更新前面的示例。

上次修改时间:2023 年 12 月 24 日太平洋标准时间晚上 9:00:修复错别字 (d536e46dbd)