问题背景
- 查看
kube-system
下的系统组件,发现harbor、influxdb、coredns
等组件反复重启; - 使用
kubectl get pod -n kube-system
命令查看pod
列表,发现命令会稳定的卡15s
;
原因分析
先看第一点,这几个pod
反复重启已经遇到过几次,看过前面的问题排查文章[1,2]的应该知道,在业务高并发场景下可能出现。先使用top
命令看一下负载情况:
1 | load average: 14.76 18.45 17.85 |
实际负载不高,排除这个可能(实际定位过程中,也依据前面的经验,做了相关内核参数的优化,问题确实没什么改善)。那就继续看,先describe
看几个异常pod
的错误信息:
1 | kubelet Liveness probe failed: Get "http://177.177.138.139:8885/api/health": context deadline exceeded (Client.Timeout exceeded while awaiting headers) |
错误基本一致,就是kubelet
调用pod
提供的健康检查接口超时了,所以被不断地kill
再重启。为什么调不通?模拟kubelet
的调用操作,在pod
所在节点上使用curl
命令调用,结果显示timeout
,再ping
一下看看pod
通信有没有问题:
1 | ping 177.177.212.186 |
ping
不通!这也就讲通了为啥健康检查不过,因为kubelet
与所在节点上的Pod
根本就无法通信。为啥会这样?通过一顿验证,发现一个规律:**集群各节点无法访问自己节点上的pod
,但可以访问其他节点上的pod
**;
这个现象是比较奇怪的,一般来说影响节点与自己节点上pod
通信的原因不多,对于使用calic
的cni
网络插件来说,可能的原因有:
pod
内的ip
/arp
/路由异常;calico
网卡的arp
配置异常;- 请求被
iptables
拦截;
分别查看1,2相关配置,显示正常:
1 | ip addr |
对于第三点,通过iptables
命令检查过,也没什么异常规则;
抓包看看啥情况:
- 在节点上
ping
本节点上的pod,同时在cali7acfda72e71
上抓包,发现请求到了cali
网卡,但没有响应; - 在
pod
内ping
本节点ip
,同时在cali7acfda72e71
上抓包,发现cali
网卡上有请求和响应,但依然无法ping
通;
看起来像是请求被主动丢弃了,跟问题提出人确认问题环境的基本情况,发现该集群有额外安装EDR
防病毒软件。为了确认该软件有没有影响,先停掉防病毒软件,观察一段时候后,发现环境恢复正常。重新启动防病毒软件,一段时间后问题复现;
与负责防病毒软件的技术沟通确认,该集群被设置到了防病毒软件的默认策略里,触发条件是默认策略组里面有防止端口扫描和流量阈值配置,结果触发了网络防护,导致节点ip
被封了。经过软件提供方的调整,将该集群调整到单独的策略编组,问题解决;
问题解决后,现象1和现象2都消失了,但回过头想想,为什么会出现现象2?当时环境好了没有细究,后来自己的测试环境也出现过这个现象,通过debug
日志发现,卡在了调用metric
服务的接口上,根本原因就是访问metric
的pod
不通,日志现象比较明显,这里就不贴了:
1 | kubectl get pod -n kube-system -owide --v 10 |
解决方案
- 针对该集群环境,单独配置策略编组;
- 节点与
Pod
通信正常后,现象2消失;
参考资料
- https://lyyao09.github.io/2021/06/19/k8s/K8S%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5-%E4%B8%9A%E5%8A%A1%E9%AB%98%E5%B9%B6%E5%8F%91%E5%AF%BC%E8%87%B4Pod%E5%8F%8D%E5%A4%8D%E9%87%8D%E5%90%AF/
- https://lyyao09.github.io/2021/07/16/k8s/K8S%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5-%E4%B8%9A%E5%8A%A1%E9%AB%98%E5%B9%B6%E5%8F%91%E5%AF%BC%E8%87%B4Pod%E5%8F%8D%E5%A4%8D%E9%87%8D%E5%90%AF(%E7%BB%AD)/
- https://developer.aliyun.com/article/409634
- https://www.css3.io/31linuxxi-tong-diao-you.htmls