前言
在测试环境下使用Prometheus operator的时候, 某个组件的指标总是出现 context deadline exceeded,而如果是本地直接请求,是正常的.所以刚开始并没有怀疑网络问题.
排查
然而, 一番折腾下来, 并没有找到所以然. 因为Prometheus有两个Pod, 最终在另一个Pod里面发现了问题.
组件一共有3个target请求2个指标是正常,请求第三个的时候则是超时. 虽然查看这个Pod所在的node节点, 并在node上请求,发现请求不了。
测试连通性
初步检查下来, 发现是网络问题
- 检查路由
1
2route -n
172.30.122.64 192.168.1.91 255.255.255.192 UG 0 0 0 tunl0
172.30.122.65 - 172.30.122.126 一共62个IP,而我们请求的IP 172.30.122.76刚好在这里面. 路由转发到了192.168.1.91这台主机
- 192.168.1.91 路由
1 | route -n |
来到以后,我们发现这台机器的路由,配死到 cali15c7619fccc这个interface, 连接到Pod网络名称空间.
问题定位
我们回到出现问题的机器上, 路由是通过tunl0这块网卡出去的
1 | tunl0: flags=193<UP,RUNNING,NOARP> mtu 1480 |
让我们测试一下网关的连通性
1 | PING 192.168.1.91 (192.168.1.91) 56(84) bytes of data. |
网络没问题,说明请求是可以送过去的,但是没有回来.
- 回到192.168.1.91这台机器
1 | route -n |
我们发现, 这个路由172.30.169.128刚好是回去的, 所以我们ping一下网关
1 | PING 192.168.1.49 (192.168.1.49) 56(84) bytes of data. |
发现没有找到主机, 我们回到之前的主机上,发现地址不知道什么时候变成了192.168.1.44
这个时候问题就很清晰了, 我们的主机IP发生了变动, 然而calico并没有及时的更新route表
解决
calico具体的故障原因我并没有找到, 我检查了集群中其他节点的配置,发现都更新正确了.
随后检查了一下问题节点的calico agent日志,发现近期并没有错误。随后尝试重启当前节点的calico agent,也发现没有效果。
随后我只能手动的删除这条路由
1 | route del -net 172.30.169.128 netmask 255.255.255.192 |
删除后, calico自动的配置了规则. 问题解决