本文介紹注入Sidecar代理后,當Pod停止時,耗時較長的請求會丟失或失敗的問題現象、問題原因和解決方案。
問題現象
為Pod注入Sidecar代理后,當Pod停止時,存在以下兩個問題:
調用該Pod的一些耗時較長的請求會丟失。
使用該Pod調用其他服務可能會失敗。
問題原因
為Pod注入Sidecar代理后,業務Pod的流量會被istio-proxy代理。當Pod開始停止時,對應的Service不再轉發流量給Pod。
在Istio中,默認收到退出信號5秒后會強制停止istio-proxy,不再接收新的Inbound連接(入口流量),將會繼續處理存量的Inbound連接,Outbound連接(出口流量)不受影響,可以正常發起。如果被停止的服務提供的接口調用的耗時較長,已有的Inbound連接和Outbound連接即使沒有處理完成也會被終止。
解決方案
方案一:修改Sidecar代理終止等待時長
您可以延長Sidecar代理終止等待時長,使得Inbound和Outbound連接可以在該時長內處理完成。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在Sidecar代理配置頁面,單擊命名空間頁簽。
選擇命名空間,單擊生命周期管理,選中Sidecar代理終止等待時長,輸入時間,單擊更新設置。
方案二:配置Sidecar代理生命周期
如果您無法預估請求的最大等待時長,建議配置Sidecar代理生命周期的preStop腳本。使用preStop腳本判斷是否還存在請求連接,無請求連接后,將等待默認時長(5秒)再完成退出 。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在Sidecar代理配置頁面,單擊命名空間頁簽。
選擇命名空間,單擊生命周期管理,選中Sidecar代理生命周期,將以下內容輸入到文本框中,單擊更新設置。
{ "postStart": { "exec": { "command": [ "pilot-agent", "wait" ] } }, "preStop": { "exec": { "command": [ "/bin/sh", "-c", "while [ $(netstat -plunt | grep tcp | grep -v envoy | wc -l | xargs) -ne 0 ]; do sleep 1; done" ] } } }