全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用ASM慢啟動預熱功能

更新時間:Dec 05, 2024

當您的應用在進行擴容、部署新版本或預期流量突增時,可以使用ASM慢啟動預熱功能,在自訂的時間視窗內逐步增加請求流量,從而平穩過渡,降低因瞬間壓力過高導致的服務中斷、請求逾時及潛在的資料丟失風險,確保應用在伸縮和更新過程中的效能穩定性和高可用性。

前提條件

背景資訊

在未啟用慢啟動預熱功能時,每當新目標Pod加入時,請求方都會向該Pod發送一定比例的流量,不支援新Pod的漸進式流量增加。這對於需要一些預熱時間來提供全部負載的服務可能是不可取的,並且可能會導致請求逾時、資料丟失和使用者體驗惡化。例如在基於JVM的Web應用程式中,這些應用程式使用水平Pod自動縮放。當服務剛啟動時,它會被大量請求淹沒,這會導致應用程式預熱時持續逾時。因此,每次擴充服務時,都會遺失資料或者會導致這部分請求的回應時間增加。預熱的基本思想就是讓剛啟動的機器逐步接入流量。

慢啟動預熱功能介紹

慢啟動模式又稱漸進式流量增加,使用者可以為服務配置一個時間段,每當一個服務執行個體啟動時,請求方會向該執行個體發送一部分請求負載,並在配置的時間段內逐步增加請求量。當慢啟動視窗期間到達,就會退出慢啟動模式。

在慢啟動模式下,添加新的目標服務Pod時,避免新增Pod被大量請求擊垮,這些新目標服務可以根據指定的加速期在接受其均衡策略的請求之前進行預熱。

慢啟動對於依賴緩衝並且需要預熱期才能以最佳效能響應請求的應用程式非常有用。在ASM下,您只需在服務對應的DestinationRule下的配置trafficPolicy/loadBalancer即可,需要注意的是:

  • loadBalancer:表示負載平衡器資訊。類型限定於ROUND_ROBINLEAST_REQUEST負載平衡器。

  • warmupDurationSecs:表示Service的預熱期間。如果設定,則新建立的服務端點在此視窗期間從其建立時間開始保持預熱模式,並且Istio逐漸增加該端點的流量,而不是發送成比例的流量。

說明

慢啟動要求應用在當前可用性區域的副本數不為0。例如:

  • 資料面叢集只有一個可用性區域A,可用性區域A中當前有一個副本,啟動第二個時,慢啟動會生效。

  • 資料面叢集有兩個可用性區域A、B,當前應用只有一個副本,且位於可用性區域A,如果啟動的第二個副本位於可用性區域B(一些調度器會預設採用跨可用性區域分布的策略),則不會觸發慢啟動。此時,如果再啟動第三個副本,慢啟動會生效。

DestinationRule的YAML樣本如下:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: mocka
spec:
  host: mocka
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
      warmupDurationSecs: 100s

步驟一:配置路由規則並訪問入口網關

為方便示範,本文先將Reviews的v3版本的Deployment副本數調整為0,即在Kubernetes叢集中將名為reviews-v3的Deployment部署的副本數縮容為0。

  1. 定義訪問入口。

    1. 使用以下內容,建立bookinfo-gateway.yaml檔案。

      展開查看bookinfo-gateway.yaml

      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: bookinfo-gateway
      spec:
        selector:
          istio: ingressgateway
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
      ---
      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: bookinfo
      spec:
        gateways:
          - bookinfo-gateway
        hosts:
          - '*'
        http:
          - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                exact: /login
            - uri:
                exact: /logout
            - uri:
                prefix: /api/v1/products
            route:
              - destination:
                  host: productpage
                  port:
                    number: 9080
          - match:
            - uri:
                prefix: /reviews
            route:
              - destination:
                  host: reviews
                  port:
                    number: 9080
      
    2. 執行以下命令,部署bookinfo-gateway。

      kubectl apply -f bookinfo-gateway.yaml
  2. 建立Reviews服務。

    1. 使用以下內容,建立reviews.yaml檔案。

      展開查看reviews.yaml

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: reviews
      spec:
        host: reviews
        trafficPolicy:
          loadBalancer:
            simple: ROUND_ROBIN                        
    2. 執行以下命令,部署Reviews。

      kubectl apply -f reviews.yaml
  3. 開啟網格拓撲, 持續訪問入口網關地址。

    本文以通過hey命令發送壓測請求10s為例。關於hey命令的下載和安裝,請參見hey;關於開啟和查看網格拓撲的具體操作,請參見查看應用的網格拓撲

    hey -z 10s -q 100 -c 4 http://${網關地址}/reviews/0

    調用拓撲樣本圖如下:image

步驟二:通過可觀測資料查看Pod啟動

  1. 登入ASM控制台

  2. 在左側導覽列,選擇服務網格 > 網格管理

  3. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  4. 在左側導覽列單擊可觀測管理中心 > 監控指標

    • ASM執行個體版本為1.17.2.35以下:在監控指標頁面,單擊監控儀錶頁簽,然後單擊網格服務等級監控頁簽,選擇對應的Reviews服務。

    • ASM執行個體版本為1.17.2.35及以上:在監控指標頁面,單擊網格工作負載層級監控頁簽,選擇對應的reviews-v3工作負載,選擇Reporter為source。

  5. 發送壓測請求並觀察監控資料。

    1. 在未開啟預熱功能的情況下,在Kubernetes叢集中將名為reviews-v3的Deployment部署的副本數從0擴容為1。

    2. 執行以下命令,發送壓測請求入口網關。

      本文以發送壓測請求120s為例。

      hey -z 120s -q 100 -c 4 http://${網關地址}/reviews/0
    3. 觀察Prometheus監控的儀錶盤資料。

      大約需要45s左右,reviews-v3 Pod將接收均衡的請求(具體時間會跟實際壓測環境有關)。image

  6. 在Kubernetes叢集中將名為reviews-v3的Deployment部署的副本數縮容為0。

步驟三:啟用預熱功能

  1. 使用以下內容,更新reviews.yaml檔案。

    增加warmupDurationSecs欄位,配置為120s,即定義預熱期間為120s。

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
      name: reviews
    spec:
      host: reviews
      trafficPolicy:
        loadBalancer:
          simple: ROUND_ROBIN
          warmupDurationSecs: 120s
  2. 執行以下命令,更新Reviews。

    kubectl apply -f reviews.yaml

步驟四:查看預熱效果

  1. 開啟預熱功能後,在Kubernetes叢集中將名為reviews-v3的Deployment部署的副本數從0擴容為1。

  2. 執行以下命令,發送壓測請求入口網關。

    本文以發送壓測請求150s為例。

    hey -z 150s -q 100 -c 4 http://${網關地址}/reviews/0
  3. 網格服務等級監控頁簽中,觀察Prometheus監控的儀錶盤資料。

    大概需要120s左右,reviews-v3 Pod將接收均衡的請求(具體時間會跟實際壓測環境有關)。image由於Metrics的採集時間間隔限制,這條曲線並不平滑。實際上,到達reviews-v3 pod的流量是平滑增長的,如果您開啟了Sidecar日誌採集,可以在SLS中搜尋這個Sidecar對應的日誌,可以看到近5分鐘的日誌量。image在啟用預熱功能的情況下,每當一個服務執行個體啟動時,請求方會向該執行個體發送一部分請求負載,並在配置的時間段內逐步增加請求量。當慢啟動視窗期間到達,就會退出慢啟動模式。

    啟用預熱功能之後,需要2分30秒左右,流量將均衡地分布到v1、v2、v3版本。image

相關文檔