阿里云的很多场景下,需要更多的监测指标来指导集群的扩缩容。本文介绍如何实现阿里云指标自动伸缩。

前提条件

您已创建一个容器服务Kubernetes版集群,请参见创建 Kubernetes 集群。

背景信息

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

部署alibaba-cloud-metrics-adapter组件

  1. 在容器服务管理控制台页面,单击左侧导航栏市场 > 应用目录,并在应用目录页面,单击阿里云应用 > 弹性伸缩
    a
  2. 单击Alibaba-cloud-metrics-adapter图标,并在右侧创建区域单击创建
    create
    单击左侧导航栏应用 > 发布,看到alibaba-cloud-metrics-adapter组件已经成功部署到集群中。组件部署成功

示例

以下举例如何配置HPA自动伸缩。

  1. 单击左侧导航栏应用 > 无状态 > 使用模板创建create app
  2. 使用模板创建页面,部署以下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
  3. 单击左侧导航栏中路由与负载均衡 > 路由,并在路由(Ingress)页面右上方,单击创建
  4. 创建面板中填写相关信息,然后单击创建。完成创建后,系统自动跳转至路由(Ingress)页面。ngnix
  5. 在生成的Ingress地址右侧,单击详情查看路由信息。ingressingress2
  6. 配置HPA。
    说明 在您配置HPA前,请确保集群已经开启集群升级功能并配置Ingress日志采集,请参见升级集群Ingress 访问日志分析与监控。

    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 none
      sls.logstore none
      sls.project none
      sls.internal.endpoint sls vpc endpoint,默认为true。
      说明

      sls_ingress_qpssls_ingress_latency_p9999是本文实现伸缩使用的两个指标。在targettype中,

      • sls_ingress_qps设置的是AverageValue,表示QPS要除以Pod的数目进行判断。
      • sls_ingress_latency_p9999设置的是Value,表示无需除以Pod的数目。

      以上两种不同的type在HPA的设置中会经常用到。

    3. 模板列表 – hpa页面右侧,单击创建
  7. 设置好HPA后,执行以下脚本进行压测。
    #!/bin/bash
    ##使用Apache Benchmark对ingress暴露的服务设置并发为10,时间为300s的压测。
    ab -t 300 -c 10 <ingress配置的域名>
  8. 验证指标伸缩状态。
    1. 单击右侧导航栏集群,并在集群列表页面,单击集群右侧的管理
    2. 在集群管理页面右上方,单击通过CloudShell管理集群
    3. 运行命令行kubectl describe hpa ingress-hpa进行伸缩状态的检查。

常见问题

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

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

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

    答:请参见阿里云HPA指标, 以下列举为常用指标。

    指标名称 描述 附加参数
    sls_ingress_qps QPS of a specific ingress route sls.ingress.route
    sls_ingress_latency_avg latency of all requests sls.ingress.route
    sls_ingress_latency_p50 latency of 50% requests sls.ingress.route
    sls_ingress_latency_p95 latency of 95% requests sls.ingress.route
    sls_ingress_latency_p99 latency of 99% requests sls.ingress.route
    sls_ingress_latency_p9999 latency of 99.99% requests sls.ingress.route
    sls_ingress_inflow inflow bandwidth of ingress sls.ingress.route