Knative v1.2.5搭配Istio1.12.7时queueproxy报反向代理错误如何修复
问题环境
- Knative 版本:v1.2.5
- Istio 版本:1.12.7
问题现象
服务运行过程中,每隔20分钟queue-proxy容器固定输出如下错误日志:
error: "context canceled" knative.dev/key: "test-common-service/test-app-0-0-0" knative.dev/pod: "test-app-0-0-0-deployment-xxxxxxx-xxxxx" logger: "queueproxy" message: "error reverse proxying request; sockstat: sockets: used 44 TCP: inuse 27 orphan 2 tw 20 alloc 593 mem 52 UDP: inuse 0 mem 3 UDPLITE: inuse 0 RAW: inuse 0 FRAG: inuse 0 memory 0"
注:日志中附带的sockstat为报错时自动采集的现场数据,从数值看TCP总占用、TIME_WAIT数量、socket内存占用均处于正常范围,不存在socket资源耗尽、文件描述符泄漏问题,无需往该方向排查。
排查与修复方案
固定20分钟周期触发的context canceled反向代理错误,本质是请求转发链路中某一侧主动中断了连接,和链路中各组件的空闲超时配置强相关,按以下顺序排查:
- 核对queue-proxy自身超时配置
执行如下命令查看queue-proxy启动参数中的--idle-timeout值:
Knative v1.2.5版本queue-proxy默认空闲超时为1200秒(即20分钟),和报错周期完全吻合。如果业务存在长连接、慢请求场景,默认超时会主动中断空闲过久的连接,触发该报错。可通过给Knative Service添加如下annotation按需调整超时值,不要盲目设置为无限大:kubectl get deploy test-app-0-0-0-deployment -n test-common-service -o jsonpath='{.spec.template.spec.containers[?(@.name=="queue-proxy")].args}'metadata: annotations: queue.knative.dev/idle-timeout: "300s" # 按业务实际场景调整 - 排查链路其他组件的超时配置
- 核对上游调用方(API网关、前端业务服务)的请求超时配置,如果调用方设置的超时时间小于业务接口实际处理时长,调用方主动断开连接时queue-proxy就会抛出该错误,需调整调用方超时时间匹配业务响应耗时,同时优化慢接口响应速度。
- 核对Istio流量规则配置,执行
kubectl get destinationrule -A查看对应服务的连接池策略,如果DestinationRule中配置的connectionPool.tcp.idleTimeout小于业务连接空闲周期,Sidecar会主动回收空闲长连接触发报错,需调整该值和上下游超时保持一致。 - 核对工作负载所在节点的conntrack配置,执行
sysctl net.netfilter.nf_conntrack_tcp_timeout_established查看内核已建立TCP连接的跟踪超时,如果该值被修改为1200秒(20分钟),conntrack表会主动回收空闲连接,导致代理转发时连接失效,需将该参数恢复为默认的432000秒(5天),同时开启TCP keepalive避免空闲连接被误清理。
内容的提问来源于stack exchange,提问作者jagannath shetagar
相关产品推荐
相关产品推荐

