k8s 虚拟机挂起、恢复后网络不通 ,或其他网络问题解决方案

tag: 此方法为终极解决方案,相对其他网上解决方案最优

项目场景:

            service访问不了、pod之间ping不通等问题, service访问不了 、 而k8s集群还是能正常创建deployment以及调度pod,node 之间ping得通

大概原因:

k8s集群时使用的flannel网络插件出了问题的原因。

具体有 虚机机挂起 ,再恢复 , 或其他未知网络原因造成

 

具体排查结果

(1)kubectl get pods -n kube-system

kube-flannel-xxx  可能 CrashLoopBackOff 或 正常(要看日志)

coredns-xxx  可能一直失败

(2)查看日志  

kubectl logs coredns-xxx  -n kube-system



[INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.8.6
linux/amd64, go1.17.1, 13a9191
[ERROR] plugin/errors: 2 5782807611420449381.4040865981692797236. HINFO: read udp 10.244.1.33:37104->8.8.8.8:53: i/o timeout
[ERROR] plugin/errors: 2 5782807611420449381.4040865981692797236. HINFO: read udp 10.244.1.33:55737->8.8.8.8:53: i/o timeout
[ERROR] plugin/errors: 2 5782807611420449381.4040865981692797236. HINFO: read udp 10.244.1.33:49960->8.8.8.8:53: i/o timeout

 kubectl logs kube-flannel-ds-d5sgp -n kube-system

failed to add vxlanRoute (10.244.0.0/24 -> 10.244.0.0): network is down

1 vxlan_network.go:198] failed to add vxlanRoute (10.244.1.0/24 -> 10.244.1.0): network is down

貌似是dns出问题,实际上是网络不通,pod 都ping不通,flannel网卡down了

(3)查找出问题得节点 (node/master)

通过ping pod  \ curl xxxx 的方式,确定是哪个节点的网卡出了问题,如果是某个node,不通就是那个node出问题,如果在master全部不通,就可能是master 出问题,确定好节点后,进入节点sh输入命令

ifconfig

发现缺少 flannel.1 网卡 或 cni0 网卡 丢失 ,问题找到 !!!

解决方案

方案一:

            网上大部分方法就是reboot ,万能解决, 确实能解决问题!!!

           但是,某些场景不想机器reboot(比如生产环境),代价大,或者reboot也解决不了问题

方案二:

        网上的第二种解决方案是删除flannel,重新在master安装yaml , 也可行,但是可能会造成所有pod ip全部丢失,需要重新构建,这个代价也同样巨大,具体方案百度,这里略

方案三:(推荐)

    个人摸索N次方式,实现了不用重启,承载业务的pod不用重新构建,不更改IP,不重启机器,只重构2个系统pod

步骤1:

出问题节点(node/master)

#-----------------------------

#可以测试重新启动看下,会发现IP配置丢失
#ifconfig cni0 up
#ifconfig flannel.1 up


#----------------------------

#关闭网卡,节点实际存在,但是背后被关闭了
ifconfig cni0 down
ifconfig flannel.1 down


#----------------------------
#删除网卡配置
ip link delete flannel.1 

#千万注意: 此项目不可删除,删除节点上IP全部失效,所有pod需要全部重新构建,新ip全部变完
#(屏蔽) ip link delete cni0

步骤2:

在 master 上 删除 系统node

#列出所有系统pod
kubectl get pod -n kube-system -o wide

#通过ip 对应节点,找到2个系统pod

# kube-flanner-xxxx 
# coredns-xxx-xxx

#注意删除顺序,不可搞反

#此pod对应flannel.1
kubectl delete pod kube-flanner-xxxx -n kube-system


#此pod对应 cni0
#此项可能会多次删除还是再启动失败,可能原因上面网络初始化未完成
#间隔时间大一点,多试几次,删除,自动创建,再删除自动创建,直到启动成功
kubectl delete pod coredns-xxx-xxx -n kube-system

#刷状态,到正常为止
kubectl get pod -n kube-system -o wide

删除pod ,系统会重生构建新pod

此时注意观察状态OK了,系统全部恢复

步骤3:

验证: 在master ping 出问题节点上pod 的ip ,和curl xxx 验证service ,ingress 等等

         在节点上输入ifconfig 看看网卡是否恢复

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值