在大規模云原生分布式應用的流量治理過程中,Knative結合MSE Ingress可實現基于請求的自動彈性、縮容到0、多服務版本同時灰度發布、服務治理能力以及安全防護保障等能力。
前提條件
已創建ACK托管集群或ACK Serverless集群。具體操作,請參見創建ACK Serverless集群、創建Kubernetes托管版集群。
已安裝MSE Ingress Controller組件,并為MSE Ingress Controller組件完成授權。具體操作,請參見授予MSE Ingress Controller訪問權限。
實現原理
在實際業務場景中,單個Pod處理請求的吞吐率有限,如果多個請求同時轉發到同一個Pod,會導致服務端過載異常,因此,需要精準地控制單個Pod的請求并發處理數。尤其在AIGC場景下,由于單個請求會占用較多的GPU資源,有必要對每個Pod的并發處理請求數進行嚴格的限制。Knative結合MSE網關,可以實現基于請求的精準自動彈性,能夠滿足大規模云原生分布式應用的流量治理訴求。
如下圖所示,彈性插件MPA會從MSE網關獲取并發數,并計算所需要的Pod數進行擴縮容,實現了基于實際請求負載的自動彈性。同時,MSE網關可以根據路由規則和條件,實現基于請求的精準轉發,以滿足不同服務和版本的路由需求。
步驟一:部署MSE網關
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在組件管理頁簽,單擊一鍵部署Knative。
在部署Knative頁面,選擇MSE服務網關,然后單擊一鍵部署。
步驟二:通過MSE網關訪問部署的服務
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在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頁面,單擊監控大盤頁簽,即可查看helloworld-go服務的監控數據情況。如何開啟Knative監控大盤,請參見通過阿里云Prometheus監控查看Knative大盤。