使用HPA基于QPS数据实现应用的弹性伸缩

如果您的应用需要根据单位时间内收到的请求数量动态地调整计算资源总量,您可以使用ALB实例统计的QPS数据为应用的Pod设置弹性伸缩。

阅读前提示

阅读本文前,推荐您阅读创建ALB Ingress了解ALB Ingress的基础使用方法。

工作原理

QPS(Queries Per Second)指的是每秒钟收到的请求数量。ALB实例可以通过日志服务记录客户端的访问数据。HPA(Horizontal Pod Autoscaler)可以根据访问记录,对Service的QPS数据进行观测,并对相应的工作负载(Deployment、StatefulSet等)进行扩缩容。

前提条件

步骤一:创建AlbConfig并关联日志Project

  1. 查看集群关联的日志Project。

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

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

    3. 基本信息页签下,找到日志服务 Project资源,记录右侧的日志Project名称。

  2. 创建AlbConfig。

    1. 创建并拷贝以下内容到alb-qps.yaml中,并在accessLogConfig字段中填入日志Project相关的信息。

      apiVersion: alibabacloud.com/v1
      kind: AlbConfig
      metadata:
        name: alb-qps
      spec:
        config:
          name: alb-qps
          addressType: Internet
          zoneMappings:
          - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 虚拟交换机的ID
          - vSwitchId: vsw-uf6nun9tql5t8nh15****
          accessLogConfig:
            logProject: <LOG_PROJECT> # 集群关联的日志项目名称
            logStore: <LOG_STORE> # 自定义日志库名称,必须以“alb_“开头
        listeners:
          - port: 80
            protocol: HTTP

      字段说明如下:

      字段

      取值类型

      说明

      logProject

      string

      SLS日志项目的名称。

      默认值:""

      logStore

      string

      SLS日志库的名称,必须以alb_开头。如果不存在此日志库,则会自动创建。SLS日志库的配置示例,请参见开启日志服务访问日志

      默认值:""

    2. 执行以下命令,创建AlbConfig。

       kubectl apply -f alb-qps.yaml

      预期输出:

      albconfig.alibabacloud.com/alb-qps created

步骤二:创建示例资源

除了AlbConfig外,ALB Ingress还需要Deployment、Service、IngressClass、Ingress这4种资源才能正常工作,您可以使用以下的示例快速创建这4种资源。

  1. 使用以下内容,创建qps-quickstart.yaml。

    apiVersion: networking.k8s.io/v1
    kind: IngressClass
    metadata:
      name: qps-ingressclass
    spec:
      controller: ingress.k8s.alibabacloud/alb
      parameters:
        apiGroup: alibabacloud.com
        kind: AlbConfig
        name: alb-qps # 与AlbConfig的名称一致
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: qps-ingress
    spec:
      ingressClassName: qps-ingressclass # 与Ingress Class的名称一致
      rules:
       - host: demo.alb.ingress.top # 替换为您的域名
         http:
          paths:
          - path: /qps
            pathType: Prefix
            backend:
              service:
                name: qps-svc
                port:
                  number: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: qps-svc
      namespace: default
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: qps-deploy
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: qps-deploy
      labels:
        app: qps-deploy
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: qps-deploy
      template:
        metadata:
          labels:
            app: qps-deploy
        spec:
          containers:
          - name: qps-container
            image: nginx:1.7.9
            ports:
            - containerPort: 80
  2. 执行以下命令,创建示例资源。

    kubectl apply -f qps-quickstart.yaml

步骤三:创建HPA

  1. 创建qps-hpa.yaml文件,并将以下内容拷贝到该文件中并保存。

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: qps-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: qps-deploy # HPA所控制的工作负载的名称
      minReplicas: 2 # 最低Pod数量
      maxReplicas: 10 # 最高Pod数量
      metrics:
        - type: External
          external:
            metric:
              name: sls_alb_ingress_qps # QPS数据的指标名称,请勿修改
              selector:
                matchLabels:
                  sls.project: <LOG_PROJECT> # 集群关联的日志项目名称
                  sls.logstore: <LOG_STORE> # 自定义日志库名称
                  sls.ingress.route: default-qps-svc-80 # Service的路径,参数的格式为<namespace>-<svc>-<port>
            target:
              type: AverageValue
              averageValue: 2 # 指标的预期目标,示例中是所有Pod的平均QPS为2

    字段说明如下:

    字段

    说明

    scaleTargetRef

    应用所使用的工作负载。示例中使用的是步骤一中创建的名为qps-deployment的Deployment。

    minReplicas

    该Deployment可缩容的容器数量下限。该值需要设置为大于等于1的整数。

    maxRaplicas

    该Deployment可扩容的容器数量上限。该值需要大于最小副本数。

    external.metric.name

    HPA基于的QPS数据的指标,请勿修改。

    sls.project

    指标所基于的日志项目,与AlbConfig中的内容保持一致。

    sls.logstore

    指标所基于的日志库,与AlbConfig中的内容保持一致。

    sls.ingress.route

    Service的路径,格式为<namespace>-<svc>-<port>,示例中为步骤一中创建的名为qps-svc的Service。

    external.target

    指标的预期目标,本示例中所有Pod的平均QPS为2。HPA会控制Pod的数量,使QPS尽可能接近预期目标。

  2. 执行以下命令,创建HPA。

    kubectl apply -f qps-hpa.yaml
  3. 执行以下命令,查看HPA部署情况。

    kubectl get hpa

    预期输出:

    NAME      REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    qps-hpa   Deployment/qps-deploy   0/2 (avg)   2         10        2          5m41s
  4. 执行以下命令,查看HPA配置信息。

    kubectl describe hpa qps-hpa

    预期输出:

    Name:                                            qps-hpa
    Namespace:                                       default
    Labels:                                          <none>
    Annotations:                                     <none>
    CreationTimestamp:                               ******** # HPA的时间戳,可忽略
    Reference:                                       Deployment/qps-deployment
    Metrics:                                         ( current / target )
      "sls_alb_ingress_qps" (target average value):  0 / 2
    Min replicas:                                    2
    Max replicas:                                    10
    Deployment pods:                                 2 current / 2 desired

(可选)步骤四:效果验证

  1. 验证应用扩容。

    1. 执行以下命令,查看Ingress信息。

      kubectl get ingress

      预期输出:

      NAME            CLASS                HOSTS                  ADDRESS                         PORTS     AGE
      qps-ingress     qps-ingressclass     demo.alb.ingress.top   alb-********.alb.aliyuncs.com   80        10m31s

      记录下HOSTSADDRESS部分的值,以便后续步骤使用。

    2. 执行以下命令,对应用进行压测。其中的demo.alb.ingress.topalb-********.alb.aliyuncs.com请替换为在上一步中得到的值。

      ab -r -c 5 -n 10000 -H Host:demo.alb.ingress.top http://alb-********.alb.aliyuncs.com/qps
    3. 执行以下命令,查看应用的伸缩情况。

      kubectl get hpa

      预期输出:

      NAME      REFERENCE               TARGETS          MINPODS   MAXPODS   REPLICAS   AGE
      qps-hpa   Deployment/qps-deploy   14375m/2 (avg)   2         10        10         15m

      返回结果中REPLICAS为10,表明随着QPS数据增大,应用的Pod扩容到10个。

  2. 验证应用缩容。

    压力测试结束后,执行以下命令,查看应用的伸缩情况。

    kubectl get hpa

    预期输出:

    NAME      REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    qps-hpa   Deployment/qps-deploy   0/2 (avg)   2         10        2          28m

    返回结果中REPLICAS为2,表明QPS数据下降到0后,应用缩容到2个Pod。

相关文档