通过AHPA配置自定义指标以实现应用扩缩

很多场景中需要根据自定义指标(例如HTTP请求的QPS、消息队列的长度等)对应用进行扩缩容。AHPA(Autoscaling Horizontal Pod Autoscaler)提供了External Metrics机制,结合alibaba-cloud-metrics-adapter组件,可以为应用提供更加丰富的扩缩容机制。本文介绍如何通过AHPA配置自定义指标以实现应用扩缩容。

前提条件

步骤一:准备示例

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

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 无状态页面,单击使用YAML创建资源

  4. 创建页面,使用如下YAML,创建应用sample-app、对应的Service以及压测示例fib-loader-qps,然后单击创建

    说明

    此容器暴露出自定义指标requests_per_second,用来标识每秒访问次数。

    展开查看YAML详细内容

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs/knative-sample-fib-server:v1
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
            env:
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
  5. 创建页面,使用如下YAML,创建ServiceMonitor,然后单击创建

    展开查看YAML详细内容

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: sample-app
      namespace: default
    spec:
      endpoints:
      - interval: 30s
        port: http
        path: /metrics
      namespaceSelector:
        any: true
      selector:
        matchLabels:
          app: sample-app
  6. 开启ServiceMonitor。

    1. 登录ARMS控制台

    2. 在左侧导航栏选择Prometheus监控 > 实例列表,进入可观测监控 Prometheus 版的实例列表页面。

    3. 在页面顶部,选择Prometheus实例所在的地域,单击目标实例名称(与集群同名)。

    4. 在左侧导航栏选择服务发现,然后在右侧页面单击配置页签,然后单击ServiceMonitor页签。

    5. sample-app所在行,开启操作列的开关。1.jpg

步骤二:部署Metrics Adapter

  1. 获取HTTP API的内网地址。

    1. 登录ARMS控制台

    2. 在左侧导航栏选择Prometheus监控 > 实例列表,进入可观测监控 Prometheus 版的实例列表页面。

    3. 实例列表页面顶部,选择Prometheus实例所在的地域,然后单击目标实例名称(格式为arms_metrics_{RegionId}_XXX)。

    4. 在左侧导航栏单击设置,在HTTP API地址(Grafana 读取地址)区域,查看并记录内网地址(Prometheus URL)。

      • (可选)如果开启了Token,则需要设置访问Token。请记录Token的值。

      • 查看并记录内网地址(Prometheus URL)。

      2.jpg

  2. 部署ack-alibaba-cloud-metrics-adapter。

    1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

    2. 单击应用目录页签,搜索并单击ack-alibaba-cloud-metrics-adapter

    3. ack-alibaba-cloud-metrics-adapter页面,单击右上角的一键部署

    4. 基本信息配置向导中,选择集群命名空间,然后单击下一步

    5. 参数配置配置向导中,选择Chart版本。根据在获取HTTP API的内网地址获取的值,在参数区域配置prometheus.urlprometheus.prometheusHeader,然后单击确定

        prometheus:
          enabled: true
          # 填写HTTP API的内网地址,即阿里云Prometheus监控的URL地址。
          url: http://cn-beijing-intranet.arms.aliyuncs.com:9090/api/v1/prometheus/6b4b40986a3bec4f92ea418534****/115964845466****/arms-metrics-6fae216078e4****/cn-beijing
          # 阿里云Prometheus开启鉴权Token后,请配置prometheusHeader Authorization。
          prometheusHeader:
          - Authorization: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjIwMDc1MTY0MDksImlzcyI6Imh0dHA6******liYWJhY2xvdWQuY29tIiwiaWF0IjoxNjkyMTU2NDA5LCJqdGkiOiI3NmRkOWJkOS0zYzBkLTRjY2MtOTFkYy1lZTU1OGFkNjg3NmMifQ.gltEJ7g4j-QPao2durNk3OiEBYhv2F_nzG-cncVfFtY
  3. 配置自定义指标。

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

    2. alibaba-cloud-metrics-adapter所在行,单击操作列的更新

    3. 将下面的YAML文件内容复制,然后粘贴并覆盖模板中对应的参数。注意下面示例说明中的requests_per_second,需要修改为实际对应的指标,对应Prometheus每秒请求数指标。然后单击更新

        ......
        prometheus:
          adapter:
            rules:
              custom:
              - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>})
                name:
                  as: requests_per_second
                resources:
                  overrides:
                    namespace:
                      resource: namespace
                seriesQuery: requests_per_second # 设置指标名称,请确保阿里云Prometheus中指标和此处一致。
              default: false
          enabled: true    # 这里设置为true,打开Prometheus Adapter。
          ......
    4. 执行如下命令,通过Custom Metrics指标查询方式,查看可用指标详情。

      kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/requests_per_second"
      {"kind":"ExternalMetricValueList","apiVersion":"external.metrics.k8s.io/v1beta1","metadata":{},"items":[{"metricName":"requests_per_second","metricLabels":{},"timestamp":"2023-08-15T07:59:09Z","value":"10"}]}

步骤三:部署AHPA

  1. 创建如下AHPA资源。

    • 设置external.metric, 指定指标名称以及matchLabels。指标名称与配置自定义指标中的指标名称保持一致。这里指定自定义指标为requests_per_second。

    • 设置目标阈值,这里指定AverageValue为10, 表示每秒请求数超过10就开始扩容。

    展开查看YAML详细信息

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: AdvancedHorizontalPodAutoscaler
    metadata:
      name: customer-deployment
      namespace: default
    spec:
      metrics:
      - external:
          metric:
            name: requests_per_second
            selector:
              matchLabels:
                namespace: default
                service: sample-app
          target:
            type: AverageValue
            averageValue: 10
        type: External
      minReplicas: 0
      maxReplicas: 50
      prediction:
        quantile: 95
        scaleUpForward: 180
      scaleStrategy: observer
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      instanceBounds:
      - startTime: "2023-08-01 00:00:00"
        endTime: "2033-08-01 00:00:00"
        bounds:
        - cron: "* 0-8 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 4
        - cron: "* 9-15 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 5
        - cron: "* 16-23 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 1
  2. 执行如下命令,查看AHPA结果。

    custom-metric % kubectl get ahpa
    NAME                  STRATEGY   REFERENCE                   METRIC                TARGETS     DESIREDPODS   REPLICAS   MINPODS   MAXPODS   AGE
    customer-deployment   observer   Deployment/sample-app       requests_per_second   60000m/10   6             1          1         50        7h53m

    K8s需要高精度时,会使用单位m或k。例如1001m=1.001,这里60000m=60。预期输出表明,每秒请求数为60,超过了设置的目标阈值10,计算出期望Pod数(DESIREDPODS)为6。