本文介绍如何实现阿里云指标自动伸缩,帮助您完成集群的扩缩容。

背景信息

很多场景下,往往需要更多的监测指标来指导集群的扩缩容,如HTTP请求率、Ingress QPS等,但是默认HPA并不支持这些我们自定义的指标或外部指标,但是Kubernetes提供了External Metrics的机制,为我们的应用提供更加便捷的扩缩机制。

部署alibaba-cloud-metrics-adapter组件

  1. 容器服务管理控制台页面的左侧导航栏,选择市场 > 应用目录,并在应用目录页面,选择阿里云应用 > 弹性伸缩
  2. 单击ack-alibaba-cloud-metrics-adapter图标,在右侧创建区域配置创建信息,单击创建
    在控制台左侧导航栏单击集群,在集群列表页面中,单击目标集群右侧操作列下的详情。在集群管理页面选择发布,在Helm页面看到ack-alibaba-cloud-metrics-adapter组件已经成功部署到集群中。

示例

本文以创建名为nginx的Deployment和Service为例配置HPA自动伸缩。
  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的应用管理
  4. 无状态页面中单击使用模板创建
  5. 使用模板创建页面,部署以下YAML文件创建一个应用,并暴露一个ClusterIP的Service,然后单击创建
    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9 
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: nginx
      type: ClusterIP
  6. 在集群管理页左侧导航栏中,选择路由,并在路由(Ingress)页面右上方,单击创建
  7. 创建面板中填写相关信息,然后单击创建。完成创建后,系统自动跳转至路由页面。
  8. 在生成的Ingress地址右侧,单击详情查看路由信息。
  9. 配置HPA。
    1. 在控制台左侧导航栏选择市场 > 编排模板
    2. 模板列表页面,选择hpa并单击创建应用,然后部署以下文件。
      apiVersion: autoscaling/v2beta2
      kind: HorizontalPodAutoscaler
      metadata:
        name: ingress-hpa
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: nginx-deployment-basic
        minReplicas: 2
        maxReplicas: 10
        metrics:
          - type: External
            external:
              metric:
                name: sls_ingress_qps
                selector:
                  matchLabels:
                    sls.project: "***"
                    sls.logstore: "nginx-ingress"
                    sls.ingress.route: "default-nginx-80"
              target:
                type: AverageValue
                averageValue: 10
          - type: External
            external:
              metric:
                name: sls_ingress_latency_p9999
                selector:
                  matchLabels:
                    # default ingress log project is k8s-log-clusterId
                    sls.project: "***"
                    # default ingress logstre is nginx-ingress
                    sls.logstore: "nginx-ingress"
                    # namespace-svc-port
                    sls.ingress.route: "default-nginx-80"
                    # sls vpc endpoint, default true
                    # sls.internal.endpoint:ture
              target:
                type: Value
                # sls_ingress_latency_p9999 > 10ms
                value: 10
      HPA的配置涉及的参数如下:
      参数名 描述
      sls.ingress.route -
      sls.logstore -
      sls.project -
      sls.internal.endpoint 设置通过内网还是外网访问日志服务,默认为true。选择true说明通过内网访问日志服务;选择false说明通过外网访问日志服务。
      说明
      sls_ingress_qpssls_ingress_latency_p9999是本文实现伸缩使用的两个指标。在targettype中,
      • sls_ingress_qps设置的是AverageValue,表示QPS要除以Pod的数目进行判断。
      • sls_ingress_latency_p9999设置的是Value,表示无需除以Pod的数目。
      以上两种不同的type在HPA的设置中会经常用到。
    3. 模板列表 - hpa页面右侧,单击创建
  10. 设置好HPA后,执行以下脚本进行压测。
    #!/bin/bash
    ##使用Apache Benchmark对ingress暴露的服务设置并发为10,时间为300s的压测。
    ab -t 300 -c 10 <ingress配置的域名>
  11. 验证指标伸缩状态。
    1. 在控制台左侧导航栏集群,并在集群列表页面,单击目标集群操作列的更多 > 通过CloudShell管理集群
    2. 运行命令行kubectl get hpa ingress-hpa进行伸缩状态的检查。

      REPLICAS的值和MAXPODS的值相同时,说明伸缩成功。

      hpa

常见问题

  • 问:如果运行kubectl get hpa后发现target一栏为<unknow>怎么办?

    答:请确认指标名称在HorizontalPodAutoscaler是否正确填写。

  • 问:如何查找HPA支持的指标名称?

    答:请参见阿里云HPA指标, 以下列举为常用指标。
    指标名称 描述 附加参数
    sls_ingress_qps 指定的IngressRoute每秒查询率 sls.ingress.route
    sls_ingress_latency_avg 所有请求的延迟 sls.ingress.route
    sls_ingress_latency_p50 50%请求的延迟 sls.ingress.route
    sls_ingress_latency_p95 95%请求的延迟 sls.ingress.route
    sls_ingress_latency_p99 99%请求的延迟 sls.ingress.route
    sls_ingress_latency_p9999 99.99%请求的延迟 sls.ingress.route
    sls_ingress_inflow Ingress的流入带宽 sls.ingress.route