istio-proxy在1小时后关闭长时间运行的TCP连接



TL;DR:我们如何配置istio-sidecar-injection/istio-proxy/exession-proxy/istio-egressgateway以允许长时间(>3小时(,可能是空闲的TCP连接?

一些细节:

我们正在尝试将数据库迁移到PostgreSQL,这是由一个配置了SpringBoot+Flyway的应用程序触发的,这次迁移预计将持续约3个小时。

我们的应用程序部署在kubernetes集群中,该集群配置了istio-sidecar注入。在运行迁移整整一个小时后,连接总是处于关闭状态。

我们确信是istio-proxy关闭了连接,因为我们试图在没有istio-sidecar注入的情况下从pod迁移,并且它运行了一个多小时,但这不是一个未来的选择,因为这可能意味着生产中会有一些我们无法考虑的停机时间。

我们怀疑这应该在istio-proxy中进行配置,设置参数idle_timeout,这是在这里实现的。然而,这不起作用,或者我们没有正确配置它,我们试图在istio安装期间通过将--set gateways.istio-ingressgateway.env.ISTIO_META_IDLE_TIMEOUT=5s添加到我们的helm模板来配置它。

如果您使用高于1.7的istio版本,您可以尝试使用特使过滤器使其工作。github上有@ryant1986提供的答案和示例。

我们在1.7上遇到了同样的问题,但我们注意到ISTIO_META_IDLE_TIMEOUT设置只在事物的OUTBOUND一侧出现,而不是INBOUND。通过添加应用于请求的INBOUND侧的额外过滤器,我们能够成功地增加超时(我们使用了24小时(

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: listener-timeout-tcp
namespace: istio-system
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
context: SIDECAR_INBOUND
listener:
filterChain:
filter:
name: envoy.filters.network.tcp_proxy
patch:
operation: MERGE
value:
name: envoy.filters.network.tcp_proxy
typed_config:
'@type': type.googleapis.com/envoy.config.filter.network.tcp_proxy.v2.TcpProxy
idle_timeout: 24h

我们还创建了一个类似的过滤器来应用于直通集群(这样超时仍然适用于我们没有服务条目的外部流量(,因为那里也没有获取配置。

对于入口网关,我们使用env。ISTIO_META_IDLE_TIMEOUT设置TCP或HTTP协议的空闲超时。对于sidecar,您可以使用类似的envoyfilter(侦听器超时tcp(来配置INBOUND方向或OUTBOUND的方向。

最新更新