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
    • 升级到或安装最新版本的容器运行时。
  3. 通过重启容器运行时和 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 地址范围更新为基于你的用例和网络寻址计划的范围。

上次修改时间:2025 年 2 月 11 日下午 5:08 PST:清理两个关于从 dockershim 迁移的页面 (ab48d1b846)