本文介绍如何通过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降低,服务整体的表现有显著改善。