K8S灰度环境频繁出现502 k8s ingress 灰度发布
公司一个需求版本开发、测试结束,升级到灰度环境之后频繁出现502
公司使用的是php + nginx 所以分析也是按照这个方向来分析的。
nginx报错:
NGINX ERROR 10.9.95.75 !!!
2020/07/21 17:05:12 [error] 7#7: *38808 recv() failed (104: Connection reset by peer) while reading response header from upstream
这里的意思是,nginx已经和php-cgi(就是php-fpm进程)连接成功,并且发送了消息, 但是php-cgi进程由于某些原因关闭了,发送了一个reset包通知nginx进程。
状态码解释
- 504 nginx超过了自己设置的超时时间,不等php-fpm返回结果,就结束了
- 502 是php-cgi执行了, 但是没有读取到数据就超时了。php-fpm超时 php-fpm主进程会认为这个 php-fpm进程有问题会重启。
如果是程序性能问题导致的,php-fpm进程将会不停的kill && fork,此操作很消耗系统资源, 而且会给nginx进程带来影响,所以nginx会频繁的给客户端返回 502, 再之后, 如果nginx的连接数被占满了,客户端将会收到 504错误码。
Connection reset by peer
表示当前服务器接收到了服务器对端发送过来的TCP RST信号。也就是对端已经关闭了连接, 接收方需要关闭连接,然后根据自己的逻辑处理。
让我们来理解下RST信号:

TCP协议格式
上图中画“红线”的位置是TCP的标识位,每个标志位占用一个bit。以下是6个标志位的解释:
- UGR: URG为1时,表明该包中有需要紧急处理的数据
- ACK: 确认应答是否有效,为1为有效
- PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走;PSH为1时就是将缓冲区中的数据交给上层协议。PSH为0时,就是数据不需要立即传先进行缓存
- RST: RST为1,表示连接出现异常必须重更新连接,会将连接断开重新连接
- SYN: 用于建立连接,为1表示希望重新建立连接
- FIN: FIN为1时,表明之后不再会有数据发送了要断开连接,本端要关闭了,FIN标识为结束报文段
- 这里的RST就是上面 nginx抛出错误 Connection reset by peer 的解释
查看php-fpm的慢日志:
[21-Jul-2020 17:12:10] [pool www] pid 975
script_filename = /data/xmq_api_alpha//api/v1.10/index.php
[0x00007f99db6219b0] pconnect() /data/xmq_api_alpha/common/Redis/RedisManager.php:83
[0x00007f99db621910] _createRedis() /data/xmq_api_alpha/common/Utils.php:952
[0x00007f99db6218a0] call_user_func() /data/xmq_api_alpha/common/Utils.php:952
[0x00007f99db6217e0] retry() /data/xmq_api_alpha/common/Redis/RedisManager.php:98
[0x00007f99db621770] createRedis() /data/xmq_api_alpha/common/Redis/RedisManager.php:122
[0x00007f99db6216e0] tokensRedis() /data/xmq_api_alpha/api/v1.10/app/plugins/SecurityPlugin.php:816
[0x00007f99db621570] auth() /data/xmq_api_alpha/api/v1.10/app/plugins/SecurityPlugin.php:670
[0x00007f99db621380] beforeExecuteRoute() /data/xmq_api_alpha/api/v1.10/index.php:270
[0x00007f99db621310] fireQueue() /data/xmq_api_alpha/api/v1.10/index.php:270
[0x00007f99db6212a0] fire() /data/xmq_api_alpha/api/v1.10/index.php:270
[0x00007f99db621250] dispatch() /data/xmq_api_alpha/api/v1.10/index.php:270
[0x00007f99db621200] handle() /data/xmq_api_alpha/api/v1.10/index.php:270
php-fpm慢日志查看表明,某个 pod 连接到 Redis 超时导致问题。
这是 K8S集群内部网络通信的问题,尝试重启pod,重启之后问题得到解决。