本文介紹如何通過ASM Playground建立Peak EWMA負載平衡情境,並示範情境中標準的互動流程。
本文內容依賴於您對ASM Playground概述的理解。開始閱讀前,請確保您已經閱讀並理解了其相關的內容。
情境簡介
Peak EWMA負載平衡是ASM推出的基於後端狀態加權進行流量分配的負載平衡器,該負載平衡器可以在端點狀態發生異常時主動將異常(延遲升高、請求失敗)端點暫時權重降低,從而提升應用整體的延遲和成功率表現。這種特性使得EWMA負載平衡器在應對後端突發異常時有著顯著更優於傳統負載平衡器的表現,本情境將部署simple-server應用,該應用通過Deployment部署了兩個版本,其中simple-server-normal是正常的版本,simple-server-high-latency則是會偶發高延遲的版本,通過切換負載平衡演算法並發起測試流量,我們將通過監控面板直觀地感受到Peak EWMA負載平衡器和預設負載平衡器LEAST_REQUEST在應用偶發延遲升高情境下的表現差異,本情境的完整調用鏈和部署拓撲如下:
建立情境
您可以使用Playground ID: ewmaLb建立本情境。具體操作,請參見建立Playground。
情境互動方法
通過ASM Playground CR與情境互動
您可以通過ASMPlayground CR控制Playground執行個體,本情境提供了如下配置:
欄位 | 類型 | 描述 |
spec.scene.ewmaLb.testTrafficStartTimestamp | int64 | 測試流量發起時間戳記,修改該值為目前時間戳可以發起測試流量(也可以是非0的任一數字,但必須是與上次不同過的數字),如果該值不存在,手動添加即可。 |
spec.scene.ewmaLb.enableEwmaForSimpleServer | bool | 是否為simple-server服務啟用Peak EWMA負載平衡器,如果設定為true,ASMPlayground控制器將為simple-server服務建立DestinationRule,並將負載平衡演算法配置為PEAK_EWMA。如果設定為false,將不部署DestinationRule,此時採用預設的LEAST_REQUEST演算法進行負載平衡。 |
情境互動樣本
這裡給出本情境互動過程的標準流程,您可以參考以下流程體驗本情境,也可以根據需求任意修改ASMPlayground CR與當前情境互動。本樣本將按照以下流程進行示範:
發起測試流量,此時使用預設負載平衡器。
查看監控面板。
修改ASMPlayground CR,將
spec.scene.ewmaLb.enableEwmaForSimpleServer改為true,為simple-server服務啟用Peak EWMA負載平衡。再次發起測試流量,並與之前的測試結果進行對比。
步驟一:使用預設負載平衡器發起測試流量
使用Playground執行個體的kubeconfig,執行以下命令。
kubectl edit asmplayground default將
spec.scene.ewmaLb.testTrafficStartTimestamp設定為1(該值設定為時間戳記,或任意不重複的數字,都可以發起測試流量),修改完成後儲存退出。apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMPlayground metadata: name: default spec: scene: ewmaLb: testTrafficStartTimestamp: 1執行以下命令,查看Pod資訊。
kubectl get pod預期輸出:
NAME READY STATUS RESTARTS curl-job-npgbd 2/2 Running 0 simple-server-high-latency-7968d5978b-cnrqt 2/2 Running 0 simple-server-normal-66bd9d546-kvn2m 2/2 Running 0可以看到首碼為
curl-job的Pod啟動,說明測試流量已經發起,該Pod將持續發起5分鐘的測試流量,對simple-server服務進行訪問。
步驟二:查看監控面板
在
curl-job產生測試流量期間,您可以通過內建在Playground執行個體中的Grafana監控面板查看回應時間,Grafana通過Playground執行個體的3000連接埠暴露於公網,您可以使用Playground執行個體的kubeconfig,執行以下命令擷取Grafana訪問地址。kubectl -n istio-system get svc istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}:3000'預期輸出:
xxx.xxx.xxx.xxx:3000使用該地址訪問Grafana控制台,點擊Dashboards > Istio > Istio Workload Dashboard,開啟工作負載監控面板,按照以下設定配置過濾器:
datasource: Prometheus
Namespace: default
Workload: curl-job
Reporter: source & destination
Inbound Workload Namespace: All
Inbound Workload: All
Destination Service: simple-server.default.svc.cluster.local

查看Outbound Services欄目下的Dashboards,可以看到,自
curl-job發往simple-server服務的流量P95會間歇性超過1s,這是因為部分流量被負載平衡演算法打到了高延遲的端點(由simple-server-high-latency Deployment部署的Pod)。
步驟三:啟用Peak EWMA負載平衡器
使用Playground執行個體的kubeconfig,執行以下命令。
kubectl edit asmplayground default將
spec.scene.ewmaLb.enableEwmaForSimpleServer設定為true,修改完成後儲存退出。apiVersion: istio.alibabacloud.com/v1beta1 kind: ASMPlayground metadata: name: default spec: scene: ewmaLb: testTrafficStartTimestamp: 1 enableEwmaForSimpleServer: true status: scene: ewmaLb: testTrafficStartTimestamp: 1執行以下命令,擷取目標規則配置。
kubectl get destinationrule -o yaml預期輸出:
apiVersion: v1 items: - apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: creationTimestamp: "2024-07-18T01:33:26Z" generation: 1 labels: provider: asm name: simple-server namespace: default resourceVersion: "134230265" uid: bafdcd48-a90c-4b68-8517-9dbc99dcb94e spec: host: simple-server.default.svc.cluster.local trafficPolicy: loadBalancer: simple: PEAK_EWMA kind: List metadata: resourceVersion: ""可以看到執行個體中已經部署了名為
simple-server的DestinationRule,並指定了loadBalancer為PEAK_EWMA。
步驟四:再次發起測試流量並與之前的測試結果對比
再次執行步驟一:使用預設負載平衡器發起測試流量中的步驟發起測試,並參考步驟二:查看監控面板查看測試結果。

可以看到,請求的P95顯著下降,這是由於當Peak EWMA負載平衡器檢測到某個端點有延遲/錯誤率升高的情況,會在一段時間內降低這個端點的權重,從而使更多請求被路由到負載正常的端點,使得服務總體的Latency降低,服務整體的表現有顯著改善。