启动NetworkManager服务导致K8S集群报错
# 关闭NetworkManager服务
systemctl stop NetworkManager
# 重启K8S集群网络组件CNI
kubectl restart deployment flannel -n kube-system
以下回复来自AI
K8S集群部分节点启动NetworkManager导致服务无法对外访问
1. 确认问题现象
● 故障表现:
○ Pod 无法跨节点通信。
○ 节点无法访问集群服务(如 CoreDNS、API Server)。
○ kubectl get nodes 显示节点状态为 NotReady。
● 直接原因:
○ NetworkManager 接管了网络接口(如 eth0),覆盖了容器网络插件(如 Flannel/Calico)的配置。
○ CNI 插件依赖的虚拟网桥(如 cni0)或路由表被 NetworkManager 修改。
2. 临时恢复网络
(1) 停止并禁用 NetworkManager
# 停止 NetworkManager 服务
systemctl stop NetworkManager
# 禁止开机启动
systemctl disable NetworkManager
(2) 重启网络服务
# 重启传统网络服务(如 network.service)
systemctl restart network
# 重启容器运行时和 kubelet
systemctl restart docker containerd kubelet
(3) 检查网络接口和路由
# 确认 CNI 相关接口(如 cni0、flannel.1)已恢复
ip addr show
# 检查路由表是否包含容器网络的路由
ip route show
3. 永久修复方案
(1) 配置 NetworkManager 忽略容器网络接口
编辑 NetworkManager 配置文件,排除 CNI 管理的接口(如 cni0、veth*、flannel*):
cat <<EOF > /etc/NetworkManager/conf.d/calico.conf
[keyfile]
unmanaged-devices=interface-name:cni0;interface-name:veth*;interface-name:flannel*
EOF
# 重启 NetworkManager(如果仍需保留该服务)
systemctl restart NetworkManager
(2) 使用传统网络服务(推荐)
如果不需要 NetworkManager,直接禁用并改用 network-scripts:
# 安装 network-scripts(部分系统需手动安装)
yum install network-scripts -y # CentOS/RHEL
# 禁用 NetworkManager
systemctl disable --now NetworkManager
# 启用传统网络服务
systemctl enable --now network
4. 检查 CNI 插件状态
(1) 确认 CNI 插件配置
检查 /etc/cni/net.d/ 下的 CNI 配置文件(如 10-calico.conflist)是否正常:
cat /etc/cni/net.d/*
(2) 重启 CNI 插件
根据使用的网络插件执行重启:
# 示例:重启 Calico
kubectl delete pod -n kube-system -l k8s-app=calico-node
# 示例:重启 Flannel
systemctl restart flanneld
5. 验证修复
● 检查节点状态:
kubectl get nodes
确保所有节点状态为 Ready。
● 测试跨节点通信:
kubectl run test-pod --image=busybox -- sleep 3600
kubectl exec test-pod -- ping <其他节点的PodIP>
● 检查服务暴露:
curl -I <Service的ClusterIP>:<Port>
6. 根本原因分析
● 冲突机制:
○ NetworkManager 默认会接管所有网络接口,包括 CNI 插件创建的虚拟接口(如 cni0),导致路由表和防火墙规则被覆盖。
○ 部分 Linux 发行版(如 CentOS 8+)默认启用 NetworkManager,需显式配置以避免冲突。
● 预防措施:
○ 在节点初始化时禁用 NetworkManager。
○ 若必须使用 NetworkManager,严格配置 unmanaged-devices 规则。

浙公网安备 33010602011771号