Rancher某环境所有主机网络瘫痪问题

欢迎访问陈同学博客原文

Rancher 1.6.14
OS:Ubuntu 16.04

本文记录Rancher整个环境因一台主机网络问题导致环境中所有主机网络瘫痪,无法跨主机通讯问题。

发现问题

收到故障预警邮件,网站无法访问。

为了便于介绍,先画个请求处理的简图:

Rancher某环境所有主机网络瘫痪问题_第1张图片

请求由nginx做第一层转发,haproxy是Rancher提供的标准Loader Balance组件,可以将请求根据规则代理到特定的应用,如果应用多实例,同时会做负载均衡。

排查问题

  • ping 域名,能通 => 说明网络正常

  • 访问网站地址,nginx日志中请求状态为502504 => 说明请求到达了nginx,后续网关出现了问题

注:502 Bad Gateway; 504 Gateway Time-out

  • 查看Rancher中所有主机,发现所有Rancher网络容器 healthcheck 组件处于 initializing 状态,且不同主机之间的容器无法ping通 => 证实Rancher网络出现了问题

所有主机的healthcheck状态如下截图:

Rancher某环境所有主机网络瘫痪问题_第2张图片

  • 查看 healthcheck、rancher-agent、rancher-server、network-manager 这些容器的日志,毫无收获 => 陷入尴尬,对于使用的第三方工具,若未深入了解,遇到问题就非常被动

  • 想起上次处理过的rancher网络问题, Rancher无法启动healthcheck和lb,根据rancher官方步骤进行排查:

    • 主机未启用 UFW 服务,排除防火墙干扰
    • 检查控制台主机IP是否正确,发现端倪,如下图:

    一台主机的IP变成了 172.17.0.1,这不是机器的正常IP,一般是 docker0 网桥的IP

    Rancher某环境所有主机网络瘫痪问题_第3张图片

  • ifconfig 检查问题主机IP,172.17.0.1 为 docker0的IP。Rancher官网说遇到IP不对需要重新注册主机

这下GG了,只能把主机上的容器移走或stop

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:9cff:fea1:bc40  prefixlen 64  scopeid 0x20<link>
        ether 02:42:9c:a1:bc:40  txqueuelen 0  (Ethernet)
        RX packets 144756223  bytes 17497382352 (16.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 124049363  bytes 79629803176 (74.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 将这台问题主机移除后,重启其他主机的healthcheck服务,各主机通讯恢复正常。至此,问题排查结束。

解决方式

移除问题主机,并重新添加,这台问题主机恢复正常。

注:忘了这是第几次处理Rancher网络问题了,Rancher一个个版本升级上来,也是踩坑不少

问题重现

且不管问题因何引发,好奇的是一台主机的IP不对怎么会引发所有主机雪崩?尝试重现该问题。

重现方式:在一个网络正常的环境中添加一台IP为 docker0 网桥上的主机,IP为: 172.17.0.1

重现结果:添加IP为 172.17.0.1 的主机后,整个环境的网络立马异常,主机之间无法通讯,复现了上述问题

问题探索

为什么主机IP会变成172.17.0.1?

在Rancher官网 FAQs cross host communication 讲述:

Every so often, the IP of the host will accidentally pick up the docker bridge IP instead of the actual IP. These are typically 172.17.42.1 or starting with 172.17.x.x. If this is the case, you need to re-register your host with the correct IP by explicitly setting the CATTLE_AGENT_IP environment variable in the docker run command.

即每隔一段时间,偶尔会使用docker网桥IP来替换主机实际IP,这些IP通常是172.17.42.1或以172.17.x.x开始。如果遇到这种情况,需要重新添加主机。

todo: 疑惑待解决

为什么一台主机出问题会影响全部主机?

todo: 疑惑待解决

你可能感兴趣的:(rancher)