全部產品
Search
文件中心

Container Service for Kubernetes:在Knative中使用MSE網關實現自動彈性

更新時間:Jun 19, 2024

在大規模雲原生分布式應用的流量治理過程中,Knative結合MSE Ingress可實現基於請求的自動彈性、縮容到0、多服務版本同時灰階發布、服務治理能力以及安全防護保障等能力。

前提條件

實現原理

在實際業務情境中,單個Pod處理請求的吞吐率有限,如果多個請求同時轉寄到同一個Pod,會導致服務端過載異常,因此,需要精準地控制單個Pod的請求並發處理數。尤其在AIGC情境下,由於單個請求會佔用較多的GPU資源,有必要對每個Pod的並發處理請求數進行嚴格的限制。Knative結合MSE網關,可以實現基於請求的精準自動彈性,能夠滿足大規模雲原生分布式應用的流量治理訴求。

如下圖所示,彈性外掛程式MPA會從MSE網關擷取並發數,並計算所需要的Pod數進行擴縮容,實現了基於實際請求負載的自動彈性。同時,MSE網關可以根據路由規則和條件,實現基於請求的精準轉寄,以滿足不同服務和版本的路由需求。

image.png

步驟一:部署MSE網關

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Knative

  3. 組件管理頁簽,單擊一鍵部署Knative

  4. 在部署Knative頁面,選擇MSE服務網關,然後單擊一鍵部署

步驟二:通過MSE網關訪問部署的服務

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Knative

  3. Knative頁面的服務管理頁簽下,選擇命名空間default,然後單擊使用模板建立,將以下YAML樣本粘貼至模板,最後單擊建立

    建立一個名為helloworld-go的服務。

    重要

    請將下方代碼中的{REGION-ID}替換為您叢集所在地區,以確保可以正確地訪問和使用鏡像。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: mpa.autoscaling.knative.dev # 表明使用MSE指標進行擴縮容,支援縮容到0。
            autoscaling.knative.dev/max-scale: '20' # 擴容Pod數上限是20。
        spec:
          containerConcurrency: 5 # 1個Pod能處理的最大並發數是5。
          containers:
          - image: registry-vpc.{REGION-ID}.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 # {REGION-ID}為對應叢集所在的地區,如cn-hangzhou。
            env:
            - name: TARGET
              value: "Knative"

    若目標服務的狀態列顯示成功,表明服務已部署成功。

  4. 服務管理頁面的預設網域名稱訪問網關列,分別擷取helloworld-go服務的網域名稱和網關地址。

  5. 執行以下命令,訪問helloworld-go服務。

    curl -H "host: helloworld-go.default.example.com" http://8.141.XX.XX # 網關IP和網域名稱請以您的實際資料為準。

    預期輸出:

    Hello Knative!

步驟三:基於並發數實現自動彈性

  1. 安裝Hey壓測工具。

    關於Hey壓測工具的詳細資料,請參見Hey

  2. 執行以下命令,對服務執行壓測。

    # 發送100000個請求,並發數為50,請求逾時時間為180秒。
    hey -n 100000 -c 50 -t 180 -host "helloworld-go.default.example.com" "http://8.141.XX.XX"

    預期輸出:

    Summary:
      Total:        86.0126 secs
      Slowest:      0.1672 secs
      Fastest:      0.0276 secs
      Average:      0.0337 secs
      Requests/sec: 1162.6199
      
      Total data:   1500000 bytes
      Size/request: 15 bytes
    
    Response time histogram:
      0.028 [1]     |
      0.042 [95291] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
      0.056 [4573]  |■■
      0.069 [64]    |
      0.083 [19]    |
      0.097 [2]     |
      0.111 [0]     |
      0.125 [0]     |
      0.139 [18]    |
      0.153 [23]    |
      0.167 [9]     |
    
    
    Latency distribution:
      10% in 0.0294 secs
      25% in 0.0305 secs
      50% in 0.0327 secs
      75% in 0.0367 secs
      90% in 0.0386 secs
      95% in 0.0405 secs
      99% in 0.0433 secs
    
    Details (average, fastest, slowest):
      DNS+dialup:   0.0000 secs, 0.0276 secs, 0.1672 secs
      DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0000 secs
      req write:    0.0000 secs, 0.0000 secs, 0.0009 secs
      resp wait:    0.0336 secs, 0.0276 secs, 0.1671 secs
      resp read:    0.0000 secs, 0.0000 secs, 0.0009 secs
    
    Status code distribution:
      [200] 100000 responses

    輸出結果表明,持續發送了100000個請求,請求成功率為100%。

  3. 執行如下命令,可即時觀察Pod的擴縮容情況。

    說明

    這個命令會持續運行,直到您手動停止它。如果您只想觀察一段時間,可以按Ctrl + C按鍵組合來終止命令的運行。

    kubectl get pods --watch

    image.png

查看服務監控資料

Knative提供開箱即用的可觀測能力,在Knative頁面,單擊監控大盤頁簽,即可查看helloworld-go服務的監控資料情況。如何開啟Knative監控大盤,請參見通過阿里雲Prometheus監控查看Knative大盤