momo's Blog.

一次主机IP变动导致calico网络故障的排查

字数统计: 735阅读时长: 3 min
2021/02/20 Share

前言

在测试环境下使用Prometheus operator的时候, 某个组件的指标总是出现 context deadline exceeded,而如果是本地直接请求,是正常的.所以刚开始并没有怀疑网络问题.

排查

然而, 一番折腾下来, 并没有找到所以然. 因为Prometheus有两个Pod, 最终在另一个Pod里面发现了问题.

组件一共有3个target请求2个指标是正常,请求第三个的时候则是超时. 虽然查看这个Pod所在的node节点, 并在node上请求,发现请求不了。

测试连通性

初步检查下来, 发现是网络问题

  • 检查路由
    1
    2
    route -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
2
route -n
172.30.122.76 0.0.0.0 255.255.255.255 UH 0 0 0 cali15c7619fccc

来到以后,我们发现这台机器的路由,配死到 cali15c7619fccc这个interface, 连接到Pod网络名称空间.

问题定位

我们回到出现问题的机器上, 路由是通过tunl0这块网卡出去的

1
2
3
4
5
6
7
tunl0: flags=193<UP,RUNNING,NOARP>  mtu 1480
inet 172.30.169.128 netmask 255.255.255.255
tunnel txqueuelen 1000 (IPIP Tunnel)
RX packets 4540921 bytes 33968271008 (31.6 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4760571 bytes 1537513262 (1.4 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

让我们测试一下网关的连通性

1
2
3
PING 192.168.1.91 (192.168.1.91) 56(84) bytes of data.
64 bytes from 192.168.1.91: icmp_seq=1 ttl=64 time=0.141 ms
64 bytes from 192.168.1.91: icmp_seq=2 ttl=64 time=0.110 m

网络没问题,说明请求是可以送过去的,但是没有回来.

  • 回到192.168.1.91这台机器
1
2
route -n
172.30.169.128 192.168.1.49 255.255.255.192 UG 0 0 0 tunl0

我们发现, 这个路由172.30.169.128刚好是回去的, 所以我们ping一下网关

1
2
3
PING 192.168.1.49 (192.168.1.49) 56(84) bytes of data.
From 192.168.1.91 icmp_seq=1 Destination Host Unreachable
From 192.168.1.91 icmp_seq=2 Destination Host Unreachable

发现没有找到主机, 我们回到之前的主机上,发现地址不知道什么时候变成了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自动的配置了规则. 问题解决

CATALOG
  1. 1. 前言
  2. 2. 排查
    1. 2.1. 测试连通性
    2. 2.2. 问题定位
  3. 3. 解决