解决 Kubernetes 中 NetworkPluginNotReady 错误

297次阅读
没有评论

问题描述

在一个拥有 4 个工作节点和 1 个主节点的 Kubernetes 集群中,使用 flannel CNI 插件。每个节点上都有一个名为 kube-flannel-ds-xxxx 的 pod 运行。之前一切正常,但突然有一个节点进入了 NotReady 状态,并且无法恢复。

在该节点上,journalctl 不断输出 “cni plugin not initialized” 的错误信息,如下所示:

Jul 25 14:44:05 ubdock09 kubelet[13076]: E0725 14:44:05.916280   13076 kubelet.go:2349] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"

尝试删除 flannel pod 可以启动一个新的 pod,但插件仍然保持未初始化状态。用户希望知道如何修复这个问题,或者如何进行排查。

解决方案

请注意以下操作可能涉及版本差异或风险操作,确保在执行之前备份数据并谨慎操作。

步骤1:检查 CNI 配置文件

根据最佳回答,可能的原因是 CNI 配置文件出现问题。首先,检查 /etc/cni/net.d/ 目录中是否存在名为 10-flannel.conf 的配置文件。如果存在问题,可能会导致初始化失败。
如果该文件存在,确保配置内容正确,特别是确保没有缺少关键信息,例如 type 字段。

步骤2:解决 CNI 配置问题

如果发现 CNI 配置文件存在问题,可以尝试以下步骤来解决:
1. 登录到节点,找到并删除 /etc/cni/net.d/ 目录。
2. 删除可能残留的 network device cni0,使用以下命令:
shell
ip link delete cni0

3. 重新启动 containerd 服务:
shell
sudo systemctl restart containerd

4. 删除原本的 flannel pod 并等待它重新启动。你可以使用以下命令删除 pod:
shell
kubectl delete pod <pod_name> --namespace=<namespace_name>

请将 <pod_name> 替换为 flannel pod 的名称,<namespace_name> 替换为 pod 所在的命名空间。
5. 等待 flannel pod 重新初始化并检查节点的状态是否变为 Ready。

通过执行以上步骤,你可以尝试解决 “cni plugin not initialized” 错误,使节点重新变为 Ready 状态。

总结

当 Kubernetes 节点进入 NotReady 状态并且 journalctl 不断输出 “cni plugin not initialized” 错误时,可能是因为 CNI 配置文件出现问题。你可以通过检查和解决 CNI 配置问题,删除残留的 network device cni0,重新启动 containerd 服务以及删除并重新启动 flannel pod 来尝试解决该问题。记得在操作前做好备份,并仔细遵循操作步骤,以避免出现不必要的问题。

正文完