一、问题描述
在定位连接丢失的问题过程中,通过分析日志发现,请求到达 istio-proxy 的 sidecar 之后并没有继续转发到相应的应用容器,而且大部分503报错都是 inbound 型流量。通过查看 istio 文档以及进一步定位,我们发现,当一个请求到达 Istio-proxy 后,Istio-proxy 会新建一个与应用容器的连接,这些连接缓存在 istio 内以实现更好的性能表现(复用)。但从应用侧来看,这些连接都有 idle 超时设置,而503报错就是因为 Istio-proxy 转发请求时使用的已有连接,而该连接在应用侧由于idle超时设置是已经关闭了的。
二、解决方案
2.1 关闭 istio-proxy 缓存机制
影响性能,暂不考虑
2.2 引入重试机制
引入重试机制,当请求由于某些特定连接错误而失败时,进行必要的重试操作。
方法就是配置VirtualService
:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
label:
applyverb: automated
project: example
service: app
name: example-ivs
namespace: example-ns
spec:
gateways:
- istio-system/prod-domain-gty
hosts:
- domain.io
http:
- match:
- uri:
prefix: /api/
route:
- destination:
host: example-svc
port:
number: 80
retries:
attempts: 3
perTryTimeout: 0.1s
retryOn: gateway-error, connect-failure,refused-stream
添加retries
配置后,当请求遇到这3种错误时,会每隔0.1s进行一次重试,一共重试3次,重试间隔根据实际情况自行调试。