博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

记录一次生产容器环境接口响应502故障排查

Posted on 2022-09-18 17:08  小憩清风  阅读(351)  评论(0编辑  收藏  举报

故障现象

产品反馈新能源业务系统验证码异常、权限系统授权异常,需要多次刷新,才能恢复。

环境拓扑与背景

背景:
最近对服务进行了容器化改造。
简略拓扑如下

  1. 华为云 使用CCE 容器集群,作为流量的入口
  2. 腾讯云 使用CVM(虚拟机)部署鉴权服务用于登录,权限获取以及验证码接收等服务。
  3. 云与云之间使用专线物理专线进行连接。
  4. 容器网络使用云插件,直接使用了VPC网络能力。

排查思路

  1. 访问网站获取获取异常接口名称

  2. 登录ELK查看异常日志情况,发现在页面异常时,主调服务有报503,被调服务并没有相关业务日志打印。

  1. 与开发确认日志情况,通过排查发现业务框架中有大量的通道连接超时的日志,初步判断网络因素导致。

  2. 开始在腾讯云侧进行上时间抓包分析,经过一天的抓包,通过对抓包文件进行分析,来自业务的请求非常少,在达到内核keepalive设置的1800s后,被调系统开始发起keepalive探活检测,在重试6次不成功后,强制RST连接。查看服务器内核keepalive相关配置,和抓包反馈的基本吻合。

  3. 目前被调服务的流量大部分都来自于腾讯云,并未发生问题。在容器化之前,华为云虚拟机也为发现该问题。初步推断可能是华为云侧的问题。联系华为云售后沟通,开始进行华为云物理机、虚拟机(与pod位于同一个子网部署同样主调服务对照组)、容器、腾讯云虚拟机同步进行抓包。发现30分钟后,CCE集群问题复现,对照组虚拟机保持正常通讯。

  • 主调(容器)与被调方一条连接生命周期内的报文
  • 主调(虚拟机)与被调方一条连接生命周期内的报文
  1. 期间我们还对被调机器的keepalive的时间进行了调整,改为180s。抓包发现主调(容器和对照组虚机) 能够正常收发心跳包。
  2. 问题已经逐渐明了,通过对照组已经排除掉了中间网络的问题,推断是物理服务器到容器这段链路出了问题,未进行心跳包的转发或者已经自己关闭了这条连接。由于华为云侧专家并未提供物理机上抓包的数据,因此无法有进一步的结论。目前已经交由华为云作为攻坚项目去处理。
  3. 华为云专家经过进一步排查,给出了最终结论:华为云的k88节点主机在主动发起链接,若长时间不发起数据请求,在超过600秒后,链接被转为安全组ACL控制,由于主调是随机端口,安全组ACL未对被调方开通,因此被调方的发起的心跳包被拦截掉,从而发起了tcp reset。而主调方由于没有收到任何的返回,会认为链接正常,仍然会往该链接发送数据,多次发送失败后,重置链接,响应成功。

解决办法

  1. 主调方安全组对被调方开放所有端口,解决拦截的问题。
  2. keepalive_time的时间调整到600m以内,确保华为云在出发ACL策略前,发起探测,从而保证链接不被华为云安全组接管。