一帜慢、問(wèn)題描述
在定位連接丟失的問(wèn)題過(guò)程中俘陷,通過(guò)分析日志發(fā)現(xiàn),請(qǐng)求到達(dá) istio-proxy 的 sidecar 之后并沒(méi)有繼續(xù)轉(zhuǎn)發(fā)到相應(yīng)的應(yīng)用容器掉伏,而且大部分503報(bào)錯(cuò)都是 inbound 型流量。通過(guò)查看 istio 文檔以及進(jìn)一步定位,我們發(fā)現(xiàn)仆邓,當(dāng)一個(gè)請(qǐng)求到達(dá) Istio-proxy 后,Istio-proxy 會(huì)新建一個(gè)與應(yīng)用容器的連接伴鳖,這些連接緩存在 istio 內(nèi)以實(shí)現(xiàn)更好的性能表現(xiàn)(復(fù)用)节值。但從應(yīng)用側(cè)來(lái)看,這些連接都有 idle 超時(shí)設(shè)置榜聂,而503報(bào)錯(cuò)就是因?yàn)?Istio-proxy 轉(zhuǎn)發(fā)請(qǐng)求時(shí)使用的已有連接搞疗,而該連接在應(yīng)用側(cè)由于idle超時(shí)設(shè)置是已經(jīng)關(guān)閉了的。
二须肆、解決方案
2.1 關(guān)閉 istio-proxy 緩存機(jī)制
影響性能匿乃,暫不考慮
2.2 引入重試機(jī)制
引入重試機(jī)制,當(dāng)請(qǐng)求由于某些特定連接錯(cuò)誤而失敗時(shí)豌汇,進(jìn)行必要的重試操作幢炸。
方法就是配置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
配置后,當(dāng)請(qǐng)求遇到這3種錯(cuò)誤時(shí)拒贱,會(huì)每隔0.1s進(jìn)行一次重試宛徊,一共重試3次,重試間隔根據(jù)實(shí)際情況自行調(diào)試逻澳。