啟動NetworkManager服務(wù)導(dǎo)致K8S集群報錯
# 關(guān)閉NetworkManager服務(wù)
systemctl stop NetworkManager
# 重啟K8S集群網(wǎng)絡(luò)組件CNI
kubectl restart deployment flannel -n kube-system
以下回復(fù)來自AI
K8S集群部分節(jié)點啟動NetworkManager導(dǎo)致服務(wù)無法對外訪問
1. 確認(rèn)問題現(xiàn)象
● 故障表現(xiàn):
○ Pod 無法跨節(jié)點通信。
○ 節(jié)點無法訪問集群服務(wù)(如 CoreDNS、API Server)。
○ kubectl get nodes 顯示節(jié)點狀態(tài)為 NotReady。
● 直接原因:
○ NetworkManager 接管了網(wǎng)絡(luò)接口(如 eth0),覆蓋了容器網(wǎng)絡(luò)插件(如 Flannel/Calico)的配置。
○ CNI 插件依賴的虛擬網(wǎng)橋(如 cni0)或路由表被 NetworkManager 修改。
2. 臨時恢復(fù)網(wǎng)絡(luò)
(1) 停止并禁用 NetworkManager
# 停止 NetworkManager 服務(wù)
systemctl stop NetworkManager
# 禁止開機啟動
systemctl disable NetworkManager
(2) 重啟網(wǎng)絡(luò)服務(wù)
# 重啟傳統(tǒng)網(wǎng)絡(luò)服務(wù)(如 network.service)
systemctl restart network
# 重啟容器運行時和 kubelet
systemctl restart docker containerd kubelet
(3) 檢查網(wǎng)絡(luò)接口和路由
# 確認(rèn) CNI 相關(guān)接口(如 cni0、flannel.1)已恢復(fù)
ip addr show
# 檢查路由表是否包含容器網(wǎng)絡(luò)的路由
ip route show
3. 永久修復(fù)方案
(1) 配置 NetworkManager 忽略容器網(wǎng)絡(luò)接口
編輯 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(如果仍需保留該服務(wù))
systemctl restart NetworkManager
(2) 使用傳統(tǒng)網(wǎng)絡(luò)服務(wù)(推薦)
如果不需要 NetworkManager,直接禁用并改用 network-scripts:
# 安裝 network-scripts(部分系統(tǒng)需手動安裝)
yum install network-scripts -y # CentOS/RHEL
# 禁用 NetworkManager
systemctl disable --now NetworkManager
# 啟用傳統(tǒng)網(wǎng)絡(luò)服務(wù)
systemctl enable --now network
4. 檢查 CNI 插件狀態(tài)
(1) 確認(rèn) CNI 插件配置
檢查 /etc/cni/net.d/ 下的 CNI 配置文件(如 10-calico.conflist)是否正常:
cat /etc/cni/net.d/*
(2) 重啟 CNI 插件
根據(jù)使用的網(wǎng)絡(luò)插件執(zhí)行重啟:
# 示例:重啟 Calico
kubectl delete pod -n kube-system -l k8s-app=calico-node
# 示例:重啟 Flannel
systemctl restart flanneld
5. 驗證修復(fù)
● 檢查節(jié)點狀態(tài):
kubectl get nodes
確保所有節(jié)點狀態(tài)為 Ready。
● 測試跨節(jié)點通信:
kubectl run test-pod --image=busybox -- sleep 3600
kubectl exec test-pod -- ping <其他節(jié)點的PodIP>
● 檢查服務(wù)暴露:
curl -I <Service的ClusterIP>:<Port>
6. 根本原因分析
● 沖突機制:
○ NetworkManager 默認(rèn)會接管所有網(wǎng)絡(luò)接口,包括 CNI 插件創(chuàng)建的虛擬接口(如 cni0),導(dǎo)致路由表和防火墻規(guī)則被覆蓋。
○ 部分 Linux 發(fā)行版(如 CentOS 8+)默認(rèn)啟用 NetworkManager,需顯式配置以避免沖突。
● 預(yù)防措施:
○ 在節(jié)點初始化時禁用 NetworkManager。
○ 若必須使用 NetworkManager,嚴(yán)格配置 unmanaged-devices 規(guī)則。

浙公網(wǎng)安備 33010602011771號