全部產品
Search
文件中心

Alibaba Cloud Service Mesh:為什麼注入Sidecar代理後,耗時較長的請求會丟失或失敗

更新時間:Jun 30, 2024

本文介紹注入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串連可以在該時間長度內處理完成。

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇資料面組件管理 > Sidecar代理配置

  3. Sidecar代理配置頁面,單擊命名空間頁簽。

  4. 選擇命名空間,單擊生命週期管理,選中Sidecar代理終止等待時間長度,輸入時間,單擊更新設定

方案二:配置Sidecar代理生命週期

如果您無法預估請求的最大等待時間長度,建議配置Sidecar代理生命週期的preStop指令碼。使用preStop指令碼判斷是否還存在請求串連,無請求串連後,將等待預設時間長度(5秒)再完成退出 。

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇資料面組件管理 > Sidecar代理配置

  3. Sidecar代理配置頁面,單擊命名空間頁簽。

  4. 選擇命名空間,單擊生命週期管理,選中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"
          ]
        }
      }
    }