本文介紹注入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" ] } } }