Knative Serverless支持AHPA(Advanced Horizontal Pod Autoscaler)的弹性能力,当应用所需资源具备周期性时,可通过弹性预测,预热资源,解决您在使用Knative中遇到的冷启动问题。本文介绍如何在Knative中使用AHPA弹性预测功能。

前提条件

步骤一:安装Application Intelligence Controller

在组件管理页面安装Application Intelligence Controller。

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择运维管理 > 组件管理
  5. 组件管理页面,单击其他页签,然后单击Application Intelligence Controller组件的安装
  6. 安装组件Application Intelligence Controller对话框中,单击确定

步骤二:配置Prometheus指标采集

通过Prometheus采集Knative服务的RT、RPS指标数据。

一、设置采集规则
  1. 登录ARMS控制台
  2. 在左侧导航栏选择Prometheus监控 > Prometheus实例列表
  3. 在顶部菜单栏选择目标集群所在的地域,然后单击实例名称列进入目标实例页面。
  4. 在左侧导航栏选择服务发现,然后单击配置页签。
  5. 配置页签,单击自定义服务发现,然后单击添加
  6. 添加自定义服务发现对话框中,设置采集规则。

    采集规则配置示例如下:

    job_name: queue-proxy
    scrape_interval: 3s
    scrape_timeout: 3s
    kubernetes_sd_configs:
    - role: pod
    relabel_configs:
    - source_labels:
      - __meta_kubernetes_pod_label_serving_knative_dev_revision
      - __meta_kubernetes_pod_container_port_name
      action: keep
      regex: .+;http-usermetric
    - source_labels:
      - __meta_kubernetes_namespace
      target_label: namespace
    - source_labels:
      - __meta_kubernetes_pod_name
      target_label: pod
    - source_labels:
      - __meta_kubernetes_service_name
      target_label: service
二、配置Prometheus数据源
  1. 登录ARMS控制台
  2. 在左侧导航栏选择Prometheus监控 > Prometheus实例列表
  3. Prometheus监控页面左上角选择Prometheus实例所在的地域,然后选择实例类型Prometheus for 容器服务的目标实例名称,进入对应实例页面。
  4. 在左侧导航栏单击设置,复制HTTP API地址下的公网地址。
  5. 在HTTP API地址下单击生成token,获取Prometheus实例的鉴权Token。
  6. 使用以下内容,创建application-intelligence.yaml,在集群中设置Prometheus查询地址。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: application-intelligence
      namespace: kube-system
    data:
      armsUrl: "https://cn-hangzhou.arms.aliyuncs.com:9443/api/v1/prometheus/da9d7dece901db4c9fc7f5b9c40****/158120454317****/cc6df477a982145d986e3f79c985a****/cn-hangzhou"
      token: "****"
    部分参数说明如下:
    • armsUrl:用于设置ARMS Prometheus的访问地址,值为第4步获取的公网地址。
    • token:用于设置访问鉴权Token,值为第5步获取的鉴权Token。
  7. 执行以下命令,部署ConfigMap。
    kubectl apply -f application-intelligence.yaml

步骤三:创建Knative服务

在Knative Service指定使用AHPA弹性策略。

  1. 使用以下内容,创建autoscale-go.yaml
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: autoscale-go
      namespace: default
    spec:
      template:
        metadata:
          labels:
            app: autoscale-go
          annotations:
            autoscaling.knative.dev/class: ahpa.autoscaling.knative.dev
            autoscaling.knative.dev/target: "500"
            autoscaling.knative.dev/metric: "rt"
            autoscaling.knative.dev/minScale: "1"
            autoscaling.knative.dev/maxScale: "30"
            autoscaling.alibabacloud.com/scaleStrategy: "observer"
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
                            
    参数 说明
    autoscaling.knative.dev/class: ahpa.autoscaling.knative.dev 指定弹性插件AHPA。
    autoscaling.knative.dev/metric: "rt" 设置AHPA指标。目前仅支持响应时间RT。
    autoscaling.knative.dev/target: "500 设置AHPA指标的阈值,本示例RT阈值为500,单位毫秒。
    autoscaling.knative.dev/minScale: "1" 设置弹性策略实例数的最小值为1。
    autoscaling.knative.dev/maxScale: "30" 设置弹性策略实例数的最大值为30。
    autoscaling.alibabacloud.com/scaleStrategy: "observer" 设置弹性伸缩模式,默认值是observer
    • observer:表示只观察,但不做真正的伸缩动作。您可以通过这种方式观察AHPA的工作是否符合预期。由于预测需要历史7天的数据,因此创建服务默认是observer模式。
    • auto:表示由AHPA负责扩容和缩容,把AHPA指标和阈值输入到AHPA,AHPA最终决定是否生效。
  2. 执行以下命令,开启AHPA弹性策略。
    kubectl apply -f autoscale-go.yaml

执行结果

Knative Service开启AHPA弹性后,您可以看到弹性预测生效前后的RT数据对比。AHPA效果图.png