文档

Knative结合AHPA实现基于RPS的定时弹性

更新时间:

AHPA(Advanced Horizontal Pod Autoscaler)可以根据历史指标弹性预测未来负载的情况,同时也支持根据时间段设置最大和最小实例数量。将Knative与AHPA结合,可以实现基于每秒请求数(RPS)或并发数的定时弹性能力。这种弹性能力不仅可以周期性地调整资源,还可以在突发流量场景下随时扩容资源。本文介绍如何将Knative和AHPA结合从而拥有基于RPS定时弹性的能力。

索引

前提条件

步骤一:配置弹性指标

本文通过AHPA配置弹性指标和扩缩容边界。

  1. 执行以下命令,新建一个名为ahpa-demo的YAML文件。

    vi ahpa-demo.yaml
  2. 将以下内容粘贴至已创建的YAML文件中。

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: AdvancedHorizontalPodAutoscalerTemplate
    metadata:
      name: ahpa-demo
    spec:
      metrics:
      - type: Resource
        resource:
          name: rps
          target:
            type: Utilization
            averageUtilization: 10 # 目前阈值,10表示RPS使用目标阈值是10。
      maxReplicas: 50 # 定义了Pod最大副本数为50。
      minReplicas: 0 # 定义了Pod最小副本数为0。
      prediction:
        quantile: 95 # 表示预测使用95%的置信度进行预测。
        scaleUpForward: 180 # 表示向前预测的时间范围为180秒。
    # 在2023-06-01 00:00:00~2123-06-01 00:00:00这个时间范围内,Pod副本数的数量将受到AHPAT中定义的最大和最小副本数的限制。
      instanceBounds:
      - startTime: "2023-06-01 00:00:00"
        endTime: "2123-06-01 00:00:00"
        bounds:
    # 在0-6小时的时间段内,最小副本数为0,最大副本数为50。
        - cron: '* 0-6 ? * *'
          maxReplicas: 50
          minReplicas: 0
    # 在7-9小时的时间段内,最小副本数为5,最大副本数为50。
        - cron: '* 7-9 ? * *'
          maxReplicas: 50
          minReplicas: 5
    # 在10-16小时的时间段内,最小副本数为10,最大副本数为50。
        - cron: '* 10-16 ? * *'
          maxReplicas: 50
          minReplicas: 10
    # 在17-23小时的时间段内,最小副本数为2,最大副本数为50。
        - cron: '* 17-23 ? * *'
          maxReplicas: 50
          minReplicas: 2

    参数说明如下所示:

    参数

    是否必选

    说明

    metrics

    必选

    用于配置弹性Metrics 。当前支持RPS、并发数、CPU、Memory指标。

    maxReplicas

    必选

    最大扩容实例数。

    minReplicas

    必选

    最小缩容实例数。

    instanceBounds

    可选

    扩缩容时间段实例数边界。

    • startTime:开始时间。

    • endTime:结束时间。

    bounds

    可选

    在不同的时间范围内Pod副本数的最小值和最大值。

    • cron:用于表示时间范围的格式化字符串。可以配置定时任务。

      如果您需要使用Cron表达式来定义定期运行的任务或自动扩展Pod副本数,请先根据下文Cron表达式中各个字段的详细说明,熟悉Cron中特殊字符和通配符的含义。

    • maxReplicas:最大副本数。

    • minReplicas:最低副本数。

    Cron表达式中各个字段的详细说明

    Cron表达式的字段解释如下,更多信息,请参见Cron表达式

    字段

    特定字符

    是否必选

    说明

    分(Minutes)

    * / , -

    必选

    取值范围为[0,59]。

    时(Hours)

    * / , -

    必选

    取值范围为[0,23]。

    日(Day of month)

    * / , – ?

    必选

    取值范围为[1,31]。

    月(Month

    * / , -

    必选

    取值范围为[1,12]或者JAN~DEC。

    说明

    JAN~DEC字段的值不区分大小写。

    星期(Day of week)

    * / , – ?

    可选

    取值范围为[0,6]或者SUN~SAT。

    说明
    • SUN~SAT字段的值不区分大小写。如:SUN和sun都可表示星期日。

    • 星期(Day of week)字段如果没提供,相当于是 *

    cron表达式中各个字符代表的意义如下:

    • 星号(*)表示所有可能的值。例如,*表示匹配所有分钟和小时。

    • 斜杠(/)表示步长。例如,/5表示每隔5个时间单位。

    • 英文半角逗号(,)表示分隔符。例如,1,3,5表示匹配1、3、5等值。

    • 破折号(-)表示范围。例如,1-5表示匹配1到5。

    • 问号(?)仅在日(Day of month)和星期(Day of week)字段中使用,表示不指定值。

步骤二:创建Knative服务,并指定使用AHPA弹性策略

配置完弹性策略之后,您可以通过Knative服务使用该定时弹性策略。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. Knative页面的服务管理页签下,选择命名空间default,然后单击使用模板创建,将以下YAML示例粘贴至模板,最后单击创建,创建一个名为helloworld-go-demo的服务。

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: helloworld-go-demo
    spec:
      template:
        metadata:
          annotations:
            autoscaling.knative.dev/class: ahpa.autoscaling.knative.dev # 指定AHPA弹性插件。
            autoscaling.knative.dev.alibabacloud/ahpa-template: "ahpa-demo" # 注意这里引用的AHPA模版参数修改时,关联的revision会自动修改弹性策略。
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
            env:
            - name: TARGET
              value: "Knative"

    服务创建成功后,请获取并记录服务网关地址和域名,供步骤三:访问服务时使用。

    image.png

步骤三:访问服务

执行如下命令,访问服务。

# helloworld-go-demo.default.example.com为服务的默认域名。
# alb-i5lagvip6fga******.cn-shenzhen.alb.aliyuncs.com为服务对应的访问网关。
curl -H "Host: helloworld-go-demo.default.example.com" http://alb-i5lagvip6fga******.cn-shenzhen.alb.aliyuncs.com

预期输出:

Hello Knative!

表明服务访问成功。

结果验证

在Knative的监控大盘页面,可查看Knative服务的实例扩缩容趋势。关于Knative监控大盘的更多信息,请参见通过阿里云Prometheus监控查看Knative大盘

说明
  • 当Knative应用缩容到0且没有Pod实例时,无法采集Pod的并发请求数、Pod每秒请求数等指标。只有访问Knative应用Pod后,才能在服务发现页面查看这些指标。

  • 当Knative应用没有缩容到0时,无需访问Knative应用Pod,即可在服务发现页面查看Pod的并发请求数、Pod每秒请求数等指标。

image.png

  • 本页导读 (1)