使用自适应配置推送优化提升控制平面推送效率

当遇到控制平面向数据平面大量推送无关配置导致效率低下时,您可以借助自适应配置推送优化功能来提升控制平面的推送效率。通过分析服务间的实际调用关系,该功能自动为服务生成优化后的Sidecar资源,仅为必要的服务推送必需的Sidecar配置,减少不必要的网络通信,增强服务网格的性能和响应速度。

重要
  • 启用自适应配置推送优化能力,ASM实例需为1.15.3.63及以上版本。关于升级实例的具体操作,请参见升级ASM实例

  • 自适应配置推送优化功能仅支持基于HTTP协议访问的服务。

背景信息

在默认情况下,由于不能确定网格内服务之间的调用依赖关系,Sidecar的配置中保存了数据平面内所有服务的信息。每次针对控制平面或数据平面的修改(例如在控制平面新建一条虚拟服务规则),都会导致控制平面向数据平面的所有Sidecar推送新的配置。

您可以通过开启自适应配置推送优化功能,为服务自动创建用于配置推送优化的Sidecar资源。功能开启后,集群中会部署名为istio-axds-egressgateway的出口网关,所有HTTP流量初始都将导向该出口网关,并通过网关记录的访问日志自动分析服务之间的依赖关系,无需您手动管理。关于应用Sidecar资源的配置推送优化效果,请参见应用Sidecar资源后的配置推送优化效果

前提条件

步骤一:开启自适应配置推送优化功能

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格优化中心 > 自适应配置推送优化

  3. 自适应配置推送优化页面,打开启用自适应配置推送优化开关,在确认对话框,单击确定

    单击确定后,在启用自适应配置推送优化开关下方,会显示更新中。更新完毕后,您可以看到启用自适应配置推送优化开关已打开,在开关下方会显示可自适应优化的命名空间列表。

步骤二:为命名空间开启自适应配置推送优化

为命名空间开启自适应配置推送优化后,命名空间内的服务都将自动地进行基于Sidecar资源的配置推送优化。您也可以在服务的annotations中增加asm.alibabacloud.com/asm-adaptive-xds: true注解,单独为服务启用自适应配置推送优化。

  1. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格优化中心 > 自适应配置推送优化

  2. 自适应配置推送优化页面的选择自适应优化命名空间列表,打开目标服务所在命名空间右侧的开关(本文以default为例),然后在确认对话框,单击确定

  3. 在网格详情页面左侧导航栏,选择流量管理中心 > Sidecar流量配置

  4. Sidecar流量配置页面,查看Sidecar资源详情。

    您可以看到自动创建且名称以axds开头的Sidecar资源。每个Sidecar资源对应前提条件中已部署的Bookinfo应用中的一个服务。Sidecar资源

步骤三:访问应用,触发自适应配置推送优化

  1. 获取入口网关IP地址

  2. 在浏览器地址栏,输入http://{入口网关的IP地址}/productpage地址,访问Bookinfo应用。

    请将{入口网关的IP地址}替换为上一步获取的IP地址。

  3. 查看自适应优化的Sidecar资源。

    1. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > Sidecar流量配置

    2. Sidecar流量配置页面的axds-productpage右侧,单击操作列下方的查看YAML。示例如下。

      apiVersion: networking.istio.io/v1beta1
      kind: Sidecar
      metadata:
        annotations:
          adapted-svc: productpage.default.svc.cluster.local
        creationTimestamp: '2024-01-05T07:52:56Z'
        generation: 4
        labels:
          asm-adaptive-xds-system: 'true'
          asm-system: 'true'
          provider: asm
        name: axds-productpage
        namespace: default
        resourceVersion: '23688435'
        uid: 753e3603-6bee-4dd1-b1fc-2e735a88****
      spec:
        egress:
          - hosts:
              - arms-prom/*
              - default/details.default.svc.cluster.local
              - default/kubernetes.default.svc.cluster.local
              - default/reviews.default.svc.cluster.local
              - istio-system/*
              - kube-system/*
        workloadSelector:
          labels:
            app: productpage

      可以看到在访问Bookinfo应用后,为优化productpage服务生成的Sidecar资源axds-productpage,已经自适应地添加了productpage服务所依赖的details服务与reviews服务,无需您手动配置。

启用自适应配置推送优化前后性能对比

以下将从命名空间asm-perf未开启/开启自适应配置推送优化时的两种场景展开以下测试,以演示控制面以及数据面的配置下发性能:

  • 扩容工作负载:将httpbin从 2 个扩容到 400 个。

  • 发起测试流量:从sleep应用随机向不同httpbin应用发起请求,触发自适应配置的重新推送。

  • 重启工作负载:触发httpbin应用的重新部署,模拟工作负载扩缩容、更新场景。

步骤一:环境准备

  1. 获取示例脚本。

    git clone https://github.com/AliyunContainerService/asm-labs.git && \
      cd asm-labs/asm-perf/adativexds
  2. 构建测试环境。

    bash run.sh -s

    此命令将在集群中创建以下资源:

    • 命名空间asm-perf

    • prometheusgrafana工作负载用于对工作负载进行监测。

    • 一个sleep应用和两个副本的httpbin应用用于接收配置推送。

    您可以通过以下命令对监控大盘进行端口转发,通过访问localhost:3000查看大盘。

    kubectl port-forward svc/grafana -n asm-perf 3000

步骤二:性能对比

  1. 扩容工作负载。

    bash run.sh -su

    等待一段时间后查看大盘,预期效果:

    未开启自适应配置推送优化

    sleep应用CPU利用率

    image.png

    sleep应用内存占用

    image.png

    sleep应用网络带宽占用

    image.png

    控制面流量变化
    1. 在网格实例的基本信息页面,记录Istio Pilot负载均衡后的CLB ID。

    2. 登录传统型负载均衡CLB控制台。单击对应CLB监控列图标,选择监听 > 带宽/流量,查看监听流量图表。

      image.png

    可以看出,在网格内服务发生变化时,会触发控制面的配置推送,产生一定的性能损耗。

    开启自适应配置推送优化

    sleep应用CPU利用率

    image.png

    sleep应用内存占用

    image.png

    sleep应用网络带宽占用

    image.png

    控制面流量变化

    image.png

    可以看出,在网格内服务发生变化时,会触发控制面的配置推送,产生一定的性能损耗,但相对于未开启自适应配置推送优化的情况,性能损耗有所降低。

    查看Sidecar资源配置
    1. 查看sleep应用生效的Sidecar资源配置。

      kubectl get sidecar axds-sleep -n asm-perf -o yaml

      预期输出:

      apiVersion: networking.istio.io/v1
      kind: Sidecar
      metadata:
        annotations:
          adapted-svc: sleep.asm-perf.svc.cluster.local
        creationTimestamp: "2025-04-03T03:09:42Z"
        generation: 2
        labels:
          asm-adaptive-xds-system: "true"
          asm-system: "true"
          provider: asm
        name: axds-sleep
        namespace: asm-perf
        resourceVersion: "14844729886"
        uid: 31dfc081-b0ec-403f-b420-91f3c3e5f8fb
      spec:
        egress:
        - hosts:
          - arms-prom/*
          - asm-perf/grafana.asm-perf.svc.cluster.local
          - default/kubernetes.default.svc.cluster.local
          - istio-system/*
          - kube-system/*
        workloadSelector:
          labels:
            app: sleep

      可以看到,spec.egress.hosts下有多个service。即只有以上 service 发生变化时会触发sleep应用的配置重新推送。更多关于Sidecar资源对性能优化的影响,请参见应用Sidecar资源后的配置推送优化效果

  2. 发起测试流量。从sleep应用向不同的httpbin应用随机发起共 100 个请求。

    bash run.sh -t

    请求结束后,再次查看大盘。

    未开启自适应配置推送优化

    sleep应用CPU利用率

    image.png

    sleep应用内存占用

    image

    sleep应用网络带宽占用

    image

    控制面流量变化

    image

    可以看出,在未开启自适应配置推送优化的情况下,从sleep应用发起流量不会对配置下发造成影响,因为每个工作负载都拥有完整的配置。

    开启自适应配置推送优化

    sleep应用CPU利用率

    image

    sleep应用内存占用

    image

    sleep应用网络带宽占用

    image

    控制面流量变化

    image.png

    可以看出,从sleep应用发起流量会触发控制面的配置推送。

    查看Sidecar资源配置
    1. 查看sleep应用生效的Sidecar资源配置。

      kubectl get sidecar axds-sleep -n asm-perf -o yaml

      预期输出:

      展开查看预期输出

      apiVersion: networking.istio.io/v1
      kind: Sidecar
      metadata:
        annotations:
          adapted-svc: sleep.asm-perf.svc.cluster.local
        creationTimestamp: "2025-04-03T05:26:00Z"
        generation: 90
        labels:
          asm-adaptive-xds-system: "true"
          asm-system: "true"
          provider: asm
        name: axds-sleep
        namespace: asm-perf
        resourceVersion: "14845598119"
        uid: a272cb0f-6e6a-492e-9ee1-b0d072813c19
      spec:
        egress:
        - hosts:
          - arms-prom/*
          - asm-perf/grafana.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v102.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v113.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v115.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v116.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v121.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v122.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v13.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v131.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v136.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v144.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v145.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v151.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v158.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v17.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v170.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v174.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v19.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v203.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v218.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v220.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v222.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v223.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v227.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v230.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v235.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v24.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v240.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v243.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v245.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v247.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v252.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v254.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v257.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v258.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v259.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v26.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v260.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v265.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v266.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v269.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v270.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v271.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v276.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v281.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v283.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v30.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v32.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v321.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v325.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v33.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v330.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v331.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v335.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v338.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v34.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v340.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v341.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v345.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v346.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v348.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v353.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v354.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v357.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v36.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v365.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v368.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v370.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v373.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v378.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v379.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v387.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v390.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v397.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v41.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v46.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v47.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v48.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v52.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v58.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v62.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v66.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v68.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v7.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v86.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v89.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v91.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v92.asm-perf.svc.cluster.local
          - asm-perf/httpbin-v94.asm-perf.svc.cluster.local
          - default/kubernetes.default.svc.cluster.local
          - istio-system/*
          - kube-system/*
        workloadSelector:
          labels:
            app: sleep

      可以看到,spec.egress.hosts下有多个service。即只有以上 service 发生变化时会触发sleep应用的配置重新推送。更多关于Sidecar资源对性能优化的影响,请参见应用Sidecar资源后的配置推送优化效果

  3. 重启工作负载。

    bash run.sh -r

    等待所有工作负载都重启完成后,查看控制面流量变化。

    未开启自适应配置推送优化

    控制面流量变化

    image

    可以看出,在网格内服务发生变化时,会触发控制面的配置推送,产生一定的性能损耗。

    开启自适应配置推送优化

    控制面流量变化

    image

    可以看出,在重启工作负载的情况下,相较于未开启自适应配置推送优化,配置推送量大幅减小。

  4. 恢复测试环境。

    bash run.sh -sd

    需要2分钟左右,httpbin应用Pod400个缩容到2个,环境恢复到开始测试之前的状态。

相关操作

关闭自适应配置推送优化功能

  1. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格优化中心 > 自适应配置推送优化

  2. 自适应配置推送优化页面,关闭启用自适应配置推送优化开关,在确认对话框,单击确定

    单击确定后,在启用自适应配置推送优化开关下方,会显示更新中。更新完毕后,您可以看到启用自适应配置推送优化开关已关闭。

  3. 在网格详情页面左侧导航栏,选择流量管理中心 > Sidecar流量配置

    您可以看到由自适应配置推送优化功能创建出的Sidecar资源已被删除。

修改出口网关配置

自适应配置推送优化功能开启后,ACK集群中会部署名为istio-axds-egressgateway的出口网关(可通过ACK控制台目标集群的网络 > 服务页面查看),所有HTTP流量初始都将导向该出口网关,并通过网关记录的访问日志自动分析服务之间的依赖关系。您可以根据实际需求修改出口网关的配置,以适应不同的流量压力。

  1. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格优化中心 > 自适应配置推送优化

  2. 自适应配置推送优化页面,单击出口网关配置页签,按需修改出口网关配置,然后单击更新设置

    单击更新设置后,服务网格将进入短暂的更新状态。更新完毕后,您可以看到出口网关已更新为指定的配置。

    说明

    ASM支持修改的出口网关配置包括出口网关资源设置、网关副本数、是否开启扩缩容HPA、网关扩缩容HPA的指标监控阈值、网关扩缩容HPA的最大副本数和最小副本数。