合理配置kubernetes ingress超时时间的核心是分层匹配客户端、网关、后端三者超时并启用长连接复用:客户端空闲超时设15–30秒防慢速攻击;proxy-connect-timeout等需略大于后端sla(如5s/10–15s),避免统一设60秒;keepalive超时设75秒并启用upstream-keepalive及内核参数调优防连接耗尽。

合理配置 Kubernetes Ingress 超时时间,核心是避免连接堆积、资源耗尽,同时不误杀正常业务请求。关键不在“设大一点”,而在于分层匹配:客户端行为、网关自身处理、后端服务响应三者超时需形成梯度,且必须开启长连接复用。
区分三类超时,避免混淆
很多人把所有超时都设成 60 秒,结果既挡不住慢请求,又占满连接池。Ingress-Nginx 实际生效的超时有三个层级:
- 客户端空闲超时(client-header-timeout / client-body-timeout):控制用户发请求头或 body 的最大等待时间,建议 15–30 秒。防止恶意慢速攻击或客户端网络卡顿导致连接长期挂起。
- 代理连接与读写超时(proxy-connect-timeout / proxy-send-timeout / proxy-read-timeout):这是网关与后端 Pod 通信的超时。它们必须略大于后端服务自身的处理耗时(比如后端 SLA 是 2s,这里至少设 5s),但不能远大于它(如设 300s 就会拖住连接池)。
- Keepalive 超时(keepalive-timeout):控制网关和后端 Pod 之间长连接的最大空闲存活时间,默认 75 秒较合理。配合 upstream-keepalive-connections 使用,能大幅降低 TIME_WAIT 和握手开销。
按业务场景设置 proxy-* 超时
统一设 60 秒是最大误区。应根据后端类型动态调整:
- 常规 REST API(如用户登录、订单查询):proxy-connect-timeout: 5s,proxy-read-timeout: 10–15s。这类接口本应快速返回,超时过长只会让失败请求滞留更久。
- 文件上传/导出任务:仅放大 proxy-read-timeout 和 proxy-send-timeout(如 300s),connect 超时仍保持 5–10s。上传失败应尽快暴露,而非让连接卡在建立阶段。
- WebSocket 或 SSE 长连接:proxy-read-timeout 可设为 3600s 或更高,但务必关闭 client-body-timeout(设为 0),并启用 keepalive-timeout 与 upstream-keepalive 配合,避免连接被误关。
必须开启 upstream keepalive
不配 keepalive,每个请求都会新建 TCP 连接,高并发下迅速触发 TIME_WAIT 爆炸和端口耗尽。这是造成“网关长连接堵塞”的最常见原因,比超时参数本身影响更大。
- 在 ConfigMap 中启用:upstream-keepalive-connections: "1000"(每 worker 最多缓存 1000 个空闲连接)
- upstream-keepalive-timeout: "60"(后端连接空闲 60 秒后自动关闭)
- keepalive: "300"(Nginx worker 与 upstream 之间最多保持 300 个长连接)
配合内核参数防雪崩
即使超时和 keepalive 都配对了,宿主机内核若扛不住连接跟踪压力,照样丢包。必须同步调优:
- 增大连接跟踪表:
net.netfilter.nf_conntrack_max = 131072 - 加快 TIME_WAIT 回收:
net.ipv4.tcp_fin_timeout = 30,net.ipv4.tcp_tw_reuse = 1 - 启用 SO_REUSEPORT:
--set controller.containerPort.http=80 --set controller.containerPort.https=443 --set controller.extraArgs.http-port=80 --set controller.extraArgs.https-port=443并确保 Helm 部署时启用了该特性











