Kubernetes Kong ingress代理1GB以上JSON接口时1028MB处断连如何解决
大响应体请求经过Kong Ingress被截断的排查修复方案
1. 先确认断流触发层级
- 直接在集群内部curl对应服务的ClusterIP,请求该大JSON接口,确认能否拿到完整响应,排除K8s服务层或上游服务本身的配置问题
- 开启Kong的debug级日志,复现请求后查看Kong的错误日志,根据日志报错内容定位是客户端到Kong的链路问题,还是Kong到上游服务的链路问题
2. 核心配置项排查与调整
1028MB的截断值刚好匹配Nginx默认的临时文件大小限制,优先调整以下配置:
2.1 代理缓冲区与大小限制配置
Nginx默认proxy_max_temp_file_size为1024MB,当上游返回响应超过内存缓冲区大小时会写入本地临时文件,超过该阈值就会直接截断响应。
如果你使用Kong Ingress Controller,可以直接给对应Ingress资源添加如下annotation调整:
annotations: kubernetes.io/ingress.class: kong # 调整临时文件最大大小,根据你的最大返回体设置,0为不限制 nginx.ingress.kubernetes.io/proxy-max-temp-file-size: "0" # 关闭代理缓冲,大文件场景下不需要缓冲到本地再转发,可避免截断问题 nginx.ingress.kubernetes.io/proxy-buffering: "off" # 调整请求/响应最大大小,0为不限制 nginx.ingress.kubernetes.io/client-max-body-size: "0"
如果是全局调整Kong配置,可以在Kong的启动环境变量里添加对应参数:NGINX_PROXY_PROXY_MAX_TEMP_FILE_SIZE=0、NGINX_HTTP_CLIENT_MAX_BODY_SIZE=0
2.2 HTTP/2相关配置
报错明确是HTTP/2 stream异常,需要调整HTTP/2的窗口与超时配置:
- 给Ingress添加annotation调整传输超时时间,避免大文件传输时间过长被主动切断:
annotations: # 调整代理读/写超时时间,单位为秒,根据你的带宽情况设置足够大的值 nginx.ingress.kubernetes.io/proxy-read-timeout: "300" nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
- 检查是否给该路由配置了响应转换、流量限制类的Kong插件,这类插件普遍存在最大处理体大小限制,临时禁用插件测试确认是否是插件导致的截断
3. 修复验证
配置更新完成后等待Kong重载生效,使用curl指定HTTP/2协议复现请求:curl --http2 <你的接口地址> --output test.json
检查下载的文件大小是否符合预期,同时查看Kong错误日志是否还有相关报错。如果问题仍然存在,可以分别抓取客户端到Kong、Kong到上游服务的TCP包,确认是哪一侧主动发起的连接断开,进一步定位问题。
内容的提问来源于stack exchange,提问作者areller
相关产品推荐
相关产品推荐

