在微服務架構的業務情境下,推薦您使用MSE網關實現Knative服務的流量分發和路由。MSE網關是一款全託管免營運的網關,支援實現基於請求的精準自動彈性,即精準地控制單個Pod的請求並發處理數,能夠滿足大規模雲原生分布式應用的流量治理訴求。
前提條件
已在叢集中部署Knative,請參見部署Knative。
已安裝MSE Ingress Controller組件,並為MSE Ingress Controller組件完成授權,請參見授予MSE Ingress Controller存取權限。
實現原理
在實際業務情境中,單個Pod處理請求的吞吐率有限,如果多個請求同時轉寄到同一個Pod,會導致服務端過載異常。因此,您可能需要精準地控制單個Pod的請求並發處理數。例如,在AIGC情境下,由於單個請求會佔用較多的GPU資源,您需要對每個Pod的並發處理請求數進行嚴格的限制。結合MSE網關,Knative可以實現基於請求的精準自動彈性,以滿足大規模雲原生分布式應用的流量治理訴求。
如下圖所示,彈性外掛程式MPA會從MSE網關擷取並發數,並計算所需要的Pod數進行擴縮容,實現了基於實際請求負載的自動彈性。同時,MSE網關可以根據路由規則和條件,實現基於請求的精準轉寄,以滿足不同服務和版本的路由需求。
步驟一:部署MSE網關
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在組件管理頁簽,單擊一鍵部署Knative,選擇MSE服務網關,然後按照頁面指引完成Knative的部署。
步驟二:通過MSE網關訪問部署的服務
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在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"
若目標服務的狀態列顯示成功,表明服務已部署成功。
在服務管理頁面的預設網域名稱和訪問網關列,分別擷取
helloworld-go
服務的網域名稱和網關地址。執行以下命令,訪問
helloworld-go
服務。curl -H "host: helloworld-go.default.example.com" http://8.141.XX.XX # 網關IP和網域名稱請以您的實際資料為準。
預期輸出:
Hello Knative!
步驟三:基於並發數實現自動彈性
安裝Hey壓測工具。
關於Hey壓測工具的詳細資料,請參見Hey。
執行以下命令,對服務執行壓測。
# 發送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%。
執行如下命令,即時觀察Pod的擴縮容情況。
說明這個命令會持續運行,直到您手動停止它。如果您只想觀察一段時間,可以按
Ctrl + C
按鍵組合來終止命令的運行。kubectl get pods --watch
(可選)步驟四:查看服務監控資料
Knative提供開箱即用的可觀測能力,在Knative頁面,單擊監控大盤頁簽,即可查看目標Knative服務的監控資料情況。如何開啟Knative監控大盤,請參見查看Knative服務監控大盤。
相關文檔
您可以為Knative服務啟用自訂網域名,請參見使用自訂網域名。
您可以為Knative服務配置HTTPS認證訪問,請參見配置HTTPS認證訪問。
您可以在Knative中部署gRPC服務,提升網路效率,請參見在Knative中部署gRPC服務。
您可以配置探針(Probe),監測Knative服務的健康狀態和可用性,請參見在Knative中配置連接埠探測。
如果您的ECI執行個體有串連公網的需求,您需要綁定EIP,請參見為ECI綁定EIP實現公網訪問。