赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. ACK Serverless集群
  4. 操作指南
  5. 弹性伸缩
  6. 基于阿里云组件指标的容器水平伸缩

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

  • 弹性伸缩
  • 发布于 2025-04-18
  • 0 次阅读
文档编辑
文档编辑

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

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

步骤一:部署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_qps与sls_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对应Service的Port名称。例如,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,其中value为QPS值。

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

请参见以下流程解决。

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

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

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

  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>。

    • namespace为Ingress所在的命名空间。

    • svc是Ingress对应的Service名称。

    • port是Ingress对应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日志格式时,由于集群中首次开启日志服务部署AliyunLogConfig的CRD只针对ACK默认Ingress Controller中的日志格式生效,若您修改过Ingress Controller的访问日志格式,请修改CRD配置中的正则表达式提取processor_regex部分。具体操作,请参见通过DaemonSet-CRD方式采集容器日志。

相关文档

  • 基于阿里云Prometheus指标的容器水平伸缩

  • 基于Nginx Ingress流量指标的多应用水平伸缩

相关文章

HPA常见问题与诊断 2025-04-18 14:49

本文介绍使用节点自动伸缩功能时可能遇到的常见问题及解决方案。

使用容器定时水平伸缩(CronHPA) 2025-04-18 14:49

如果您的应用资源使用率存在周期性变化,需要按照类似Crontab的策略定时对Pod进行扩缩容,您可以使用容器定时水平伸缩CronHPA(CronHorizontal Pod Autoscaler)实现Pod的定时扩缩容。CronHPA适用于业务流量有明显高峰时段、应用程序需要在特定时间执行任务等场景

使用容器水平伸缩(HPA) 2025-04-18 14:49

如果您想基于CPU使用率、内存使用率或其他自定义指标实现Pod的自动扩缩,建议您为业务容器开启水平伸缩HPA(Horizontal Pod Autoscaler)功能。HPA能够在业务负载急剧飙升时快速扩容多个Pod副本来缓解压力,也可以在业务负载变小时根据实际情况适当缩容以节省资源,无需您人为干预

基于阿里云Prometheus指标的容器水平伸缩 2025-04-18 14:49

HPA默认支持基于CPU和内存指标实现自动伸缩,可能无法满足更为复杂的运维场景。如果您需要将Prometheus收集的Custom Metrics与External Metrics转换为HPA可用的弹性伸缩指标,您可以参见本文获取监控数据并实现对应的伸缩配置,为应用提供更灵活、便捷的扩缩机制。 前提

基于阿里云组件指标的容器水平伸缩 2025-04-18 14:49

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

容器垂直伸缩(VPA) 2025-04-18 14:49

通过在ACK Serverless集群上部署安装VPA(vertical-pod-autoscaler),ACK Serverless可以提供垂直的容器伸缩的功能。VPA会基于Pod的资源使用情况自动为集群设置资源占用的限制,从而让集群将Pod调度到有足够资源的最佳节点上。VPA也会保持最初容器定义

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号