Kubernetes Ingress在JMeter 50/分钟负载+30秒延迟下返回502问题排查
问题背景
部署在Rancher上、以Tomcat容器运行的Java Web应用,在每分钟50次HTTP SOAP调用的正常负载下运行稳定,请求耗时2-4秒。但通过混沌测试工具引入30秒响应延迟后,JMeter发起的请求出现异常:部分立即返回502错误,部分60秒后返回,部分耗时更久;400次请求中约20次被丢弃并返回502。Pod的CPU、内存使用率均低于50%,调整Ingress超时参数后问题未解决,Ingress侧出现如下错误日志:
[error] 260453#260453: *389426939 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 11.22.33.44, server: abc.def.intranet, request: "POST /hello/0 HTTP/1.1", upstream: "http://11.22.33.44:9023/hello/0", host: "abc.def.intranett"
Ingress当前配置如下:
nginx.ingress.kubernetes.io/backend-protocol: HTTPS nginx.ingress.kubernetes.io/client-max-body-size: 10m nginx.ingress.kubernetes.io/proxy-body-size: 10m nginx.ingress.kubernetes.io/proxy-connect-timeout: '600' nginx.ingress.kubernetes.io/proxy-next-upstream: error timeout http_502 non-idempotent nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: '650' nginx.ingress.kubernetes.io/proxy-next-upstream-tries: '3' nginx.ingress.kubernetes.io/proxy-read-timeout: '600' nginx.ingress.kubernetes.io/proxy-send-timeout: '600' nginx.ingress.kubernetes.io/session-cookie-name: JSESSIONID nginx.ingress.kubernetes.io/ssl-passthrough: 'false' nginx.ingress.kubernetes.io/ssl-redirect: 'false'
排查方向
- Tomcat连接与超时配置:检查
server.xml中Connector的connectionTimeout、keepAliveTimeout、maxConnections、maxThreads参数,延迟场景下请求堆积可能导致Tomcat主动关闭连接,触发Connection reset by peer;确认Tomcat长连接是否被提前回收。 - Kubernetes Service的连接管理:检查Service的
sessionAffinity配置,若为ClientIP可能导致请求集中到单个Pod引发连接堆积;查看kube-proxy的连接超时或复用策略,是否存在上游连接意外中断的情况。 - Nginx Ingress的连接池配置:当前仅配置代理超时,缺失
proxy_http_version、proxy_set_header Connection等长连接相关配置,可能导致Ingress与Tomcat之间连接频繁断开重建;确认proxy-next-upstream的non-idempotent是否限制了重试逻辑触发。 - 混沌测试工具的影响范围:验证延迟注入是否仅针对应用容器,是否误影响Ingress与Pod之间的网络链路,导致连接被强制重置。
解决建议
调整Tomcat连接配置
修改server.xml的Connector节点,延长超时时间并调整连接、线程数:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="120000" keepAliveTimeout="120000" maxConnections="2000" maxThreads="500" enableLookups="false" redirectPort="8443"/>重启Tomcat容器生效。
优化Service与Ingress的连接配置
- 若Service启用
ClientIP会话亲和性,改为None让请求均匀分布:apiVersion: v1 kind: Service metadata: name: your-app-service spec: sessionAffinity: None # 其他原有配置 - 在Ingress中添加长连接相关配置:
nginx.ingress.kubernetes.io/proxy-http-version: "1.1" nginx.ingress.kubernetes.io/proxy-set-header: "Connection \"keep-alive\"" nginx.ingress.kubernetes.io/upstream-keepalive-connections: "100" nginx.ingress.kubernetes.io/upstream-keepalive-timeout: "600"
- 若Service启用
调整Ingress重试逻辑
若SOAP接口支持重试,移除non-idempotent参数,让Nginx对502错误进行重试:nginx.ingress.kubernetes.io/proxy-next-upstream: error timeout http_502验证混沌测试配置
检查混沌测试工具规则,确保延迟仅注入到应用业务逻辑中,而非Pod的整个网络栈,避免干扰Ingress与Pod之间的连接。
内容的提问来源于stack exchange,提问作者vick_4444

