基于阿里云组件指标的容器水平伸缩

更新时间:2025-03-06 08:18:34

应对业务突发流量时,更精准的扩缩容能够提高响应速度,并进一步提升集群资源利用效率。本文介绍如何利用Kubernetes的外部指标接口(External Metrics)集成重要业务指标(例如HTTP请求率、Ingress QPS等),实现更自动化的伸缩策略。

本文将通过以下步骤,以创建名为NginxDeployment、ServiceIngress为例,配置HPA自动伸缩,实现基于日志服务(SLS)中IngressQPS指标对容器进行水平伸缩。

步骤一:部署ack-alibaba-cloud-metrics-adapter组件

ack-alibaba-cloud-metrics-adapter组件允许 Kubernetes 通过 External Metrics API 获取阿里云产品(如 ECS、SLB、RDS 等)的监控数据,可以增强集群的监控和自动伸缩能力。

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

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

  3. Helm页面,单击创建,完成基本信息配置,然后选中ack-alibaba-cloud-metrics-adapter,单击下一步

  4. 参数配置页面,选择Chart 版本,然后单击确定

步骤二:创建应用与服务

  1. 创建nginx-test.yaml文件。

    展开查看YAML示例

    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
  2. 执行以下命令,创建应用Deployment和对应的Service。

    kubectl apply -f nginx-test.yaml

步骤三:创建路由

  1. 在集群管理页左侧导航栏中,选择网络 > 路由,并在路由页面左上方,单击创建Ingress

  2. 创建面板中填写相关信息,然后单击确定。完成创建后,系统会自动跳转至路由页面。

  3. 在操作列名称下,单击生成的Ingress名称,查看路由规则信息。关于Ingress更多详情,请参见Ingress管理

步骤四:配置HPA

您可以在HPA中配置SLS Project中伸缩使用的两个指标,例如sls_ingress_qpssls_ingress_latency_p9999

  • sls_ingress_qps:为AverageValue,表示QPS要除以Pod的数目进行判断。

  • sls_ingress_latency_p9999:为Value,表示无需除以Pod的数目。

  1. 创建并复制以下内容到ingress-hpa.yaml中。

    展开查看YAML示例

    apiVersion: autoscaling/v2
    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.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:true
            target:
              type: Value
              # sls_ingress_latency_p9999>10ms 即值超过10ms时,HPA会自动增加nginx-deployment-basic的Pod数量。
              value: 10

    HPA的配置涉及的参数如下。

    参数名

    是否必填

    描述

    参数名

    是否必填

    描述

    sls.ingress.route

    参数的格式为:<namespace>-<svc>-<port>,其中<namespace>Ingress所在的命名空间,<svc>Ingress对应的Service名称,<port>Ingress对应ServicePort名称。例如,default-nginx-80

    sls.logstore

    日志服务的日志库名称。集群中默认sls.logstore值为nginx-ingress

    sls.project

    日志服务的Project名称。集群中默认sls.project值为k8s-log-集群ID.

    sls.internal.endpoint

    设置通过内网还是外网访问日志服务,默认为true

    • true:通过内网访问SLS。

    • false:通过外网访问SLS。

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

    kubectl apply -f ingress-hpa.yml

步骤五:结果验证

  1. 配置好HPA后,执行以下命令进行压测。

    ab -t 300 -c 10 <ingress配置的域名> # 使用Apache Benchmark对Ingress暴露的服务设置并发为10,时间为300秒的压测。
  2. 验证指标伸缩状态。

    1. 在控制台左侧导航栏单击集群,并在集群列表页面,选择目标集群操作列的更多 > 通过CloudShell管理集群

    2. 执行以下命令检查伸缩状态。

      kubectl get hpa ingress-hpa

      预期输出:

      NAME            REFERENCE                              TARGETS           MINPODS    MAXPODS    REPLICAPS   AGE
      ingress-hpa     Depolyment/nginx-deployment-basic      21/10 (avg)       2          10         10          7m49s

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

常见问题

如何通过命令行获取QPS指标 sls_ingress_qps

可以通过以下命令行查询数据。以请求指标sls_ingress_qps为例。

kubectl get --raw  /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress

其中, {{SLS_Project}}是此ACK集群对应的SLS Project名称。若未自定义配置,默认为k8s-log-{{ClusterId}}{{ClusterId}}为此集群的ID。

若返回结果为:

Error from server: {
    "httpCode": 400,
    "errorCode": "ParameterInvalid",
    "errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is  in your log,please wrap : with quotation mark \"",
    "requestID": "xxxxxxx"
}

表明此指标无数据,可能是未配置使用ALB Ingress,但使用了sls_alb_ingress_qps指标进行数据查询。

若返回结果类似为:

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "sls_ingress_qps",
      "timestamp": "2025-02-26T16:45:00Z", 
      "value": "50",   # QPS的值
      "metricLabels": {
        "sls.project": "your-sls-project-name",
        "sls.logstore": "nginx-ingress"
      }
    }
  ]
}

表明已查到Kubernetes 外部指标QPS,其中valueQPS值。

如果执行kubectl get hpa后发现target一栏为<unknown>怎么办?

请参见以下流程解决。

  1. 执行kubectl describe hpa <hpa_name>,确认HPA失效的原因。

    • 如果Conditions字段提示AbleToScaleFalse,请确认Deployment是否正常部署。

    • 如果Conditions字段提示ScalingActiveFalse,请继续下一步。

  2. 执行kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"。如果返回为Error from server (NotFound): the server could not find the requested resource,请确认alibaba-cloud-metrics-adapter的启动状态。

    如果确认alibaba-cloud-metrics-adapter状态正常,请确认HPA指标是否是Ingress相关指标。如果是Ingress相关指标,您需要提前部署日志服务组件。更多信息,请参见Nginx Ingress访问日志分析与监控

  3. 确认HPA指标填写正确。sls.ingress.route的值格式为<namespace>-<svc>-<port>

    • namespaceIngress所在的命名空间。

    • svcIngress对应的Service名称。

    • portIngress对应Service的端口名称。

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

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

指标名称

描述

附加参数

指标名称

描述

附加参数

sls_ingress_qps

指定的IngressRoute每秒查询率

sls.ingress.route

sls_alb_ingress_qps

ALB数据的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

如果自定义了Nginx Ingress日志格式,如何进行适配操作?

本文介绍的使用SLS Ingress指标进行容器水平伸缩,需要您开启并正确配置集群中Nginx Ingress日志接入阿里云日志服务。

在创建集群时,日志服务是默认开启的。当您保持默认值不变,集群创建成功后,您可以在阿里云日志服务SLS控制台查看Nginx Ingress的访问日志分析报表和监控Nginx Ingress实时状态。

在创建集群时,若您手动关闭了日志服务,集群创建完成后,如果想要使用SLS Ingress指标进行容器水平伸缩,您需要重新开启或配置日志服务。详细信息,请参见Nginx Ingress访问日志分析与监控

当您需要自定义Nginx Ingress日志格式时,由于集群中首次开启日志服务部署AliyunLogConfigCRD只针对ACK默认Ingress Controller中的日志格式生效,若您修改过Ingress Controller的访问日志格式,请修改CRD配置中的正则表达式提取processor_regex部分。具体操作,请参见通过DaemonSet-CRD方式采集容器日志

相关文档

  • 本页导读 (1)
  • 步骤一:部署ack-alibaba-cloud-metrics-adapter组件
  • 步骤二:创建应用与服务
  • 步骤三:创建路由
  • 步骤四:配置HPA
  • 步骤五:结果验证
  • 常见问题
  • 如何通过命令行获取QPS指标 sls_ingress_qps?
  • 如果执行kubectl get hpa后发现target一栏为<unknown>怎么办?
  • 如何查找HPA支持的指标名称?
  • 如果自定义了Nginx Ingress日志格式,如何进行适配操作?
  • 相关文档