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

示例 containerd 配置文件

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

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

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

上次修改时间:2023 年 12 月 24 日下午 9:00 PST:修复错别字 (d536e46dbd)