背景:由于之前老平台的docker不再维护,业务需要做docker迁移。    

问题:docker迁移后,新老平台同时运行docker正常(access_log、error_log、env环境变量)。昨天接到运维邮件,需要清理旧平台的容器,所以就下掉了旧平台的流量(域名解析配置下掉了旧容器ip),但是pod还未删除(怕后续有问题,就保留了,把副本数设置为了0,事实证明这个举动太明智了)。因为之前运行了一段时间了,新平台容器没有出现过什么问题,以为下掉老平台容器不会有问题,结果今天来就收到反馈,接口大部分504了。

临时解决:旧平台pod副本数设置为1,重新发布,解决了。事实证明,做任何大的改动之前一定要备份,备份,备份!!!  有问题可及时恢复,不然就在大家的疯狂追问下紧张崩溃。

分析:第一眼,很懵。完全没头绪。不知道问题出在了哪。第一直觉肯定是与自己迁移容器有关,并且昨天刚刚下掉了旧平台的流量,今天就报错。立即查看新容器云平台错误日志,正常。访问日志,正常。觉得很诡异.... 及时又恢复了旧平台的pod副本数,归于平静。先冷静下来,再思考问题。

出现问题的第一刻,永远都在想是不是自己代码有问题!!!典型的菜鸟,┭┮﹏┭┮

仔细想想要是代码有问题,新平台应该早报错才是。就没有了思路...

接下来就是慢慢排查路。首先要明白504是什么,为什么会504?弄懂了这块,也就明白了问题所在,才会有后续的解决方案。这块我理解有偏差,以为504是访问新容器云平台造成的(猪头),第一反应永远都是自己代码问题。仔细想想根本行不通,要是有问题就不会在先行运行那么久都没报错了。那么是用户访问了旧容器造成的?旧容器ip被下掉了,但是依旧访问的是旧容器的IP?难道说域名解析配置那块有问题?查看域名解析配置确实下掉了旧容器的ip。那为什么还会访问旧容器呢。

咨询了运维,说虽然域名解析那下掉了旧容器的ip,但是pod还在(正常运行)的问题。流量就可以打到旧容器上。

难道是DNS缓存问题?只有这个能解释的通了。

运维设置的域名DNS缓存时间没过期?客户端本地hosts写了固定IP?

解释的通了...

再仔细查看客户端发来的报错信息,接口域名是上层代理的域名A,与迁移的业务域名B不是一个。然后再加一种可能,是不是访问A代理到B,nginx代理缓存的问题?

这三种情况,先从自身业务代码nginx代理缓存开始检查,另其他两中情况涉及运维和客户端。自身检查没问题,才能找别人。

找到上层代理域名A所在的服务器(集群),挑选了一部分机器,上去查看nginx配置文件和hosts文件。hosts文件并没有设置对应的业务域名B和ip,nginx配置文件里:

location /api { 
          proxy_pass http://域名B; 
    }

也没有固定写的旧容器ip。然后查阅资料,nginx反向代理使用的域名会不会有缓存?

然后,就restart集群的nginx服务。观察旧容器的流量确实是下掉了(access_log没有显示了),新容器云平台流量正常。

再通知测试同事进行了测试,没问题。

至此,结束。

遇到问题,先理清思路,问题找到了,解决方法也就快了。

原因:nginx反向代理使用域名的缓存问题。可参考:https://blog.51cto.com/u_15127677/4243175

解决:集群服务全选restart nginx,解决。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐