全部產品
Search
文件中心

Container Service for Kubernetes:基於阿里雲組件指標的容器水平伸縮

更新時間:Jan 09, 2026

應對業務突發流量時,更精準的擴縮容能夠提高響應速度,並進一步提升叢集資源利用效率。本文介紹如何利用Kubernetes的外部指標介面(External Metrics)整合重要業務指標(例如HTTP請求率、Ingress QPS等),實現更自動化的伸縮策略。

本文將通過以下步驟,以建立名為Nginx的Deployment、Service和Ingress為例,配置HPA自動調整,實現基於Log Service(SLS)中Ingress的QPS指標對容器進行水平伸縮。

步驟一:部署ack-alibaba-cloud-metrics-adapter組件

ack-alibaba-cloud-metrics-adapter組件允許 Kubernetes 通過 External Metrics API 擷取阿里雲產品(如 ECS、SLB、RDS 等)的監控資料,可以增強叢集的監控和自動調整能力。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

  3. Helm頁面,單擊建立,完成基本資料配置,然後選中ack-alibaba-cloud-metrics-adapter,單擊下一步

  4. 參數配置頁面,選擇Chart 版本,然後單擊確定

說明

ack-alibaba-cloud-metrics-adapter 組件當前暫不支援平滑升級,需要卸載後再安裝最新版本。

步驟二:建立應用與服務

  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對應Service的Port名稱。例如,default-nginx-80

    sls.logstore

    Log Service的日誌庫名稱。叢集中預設sls.logstore值為nginx-ingress

    sls.project

    Log Service的Project名稱。叢集中預設sls.project值為k8s-log-叢集ID.

    sls.internal.endpoint

    設定通過內網還是外網訪問Log Service,預設為true

    • true:通過內網訪問SLS。

    • false:通過外網訪問SLS。

  2. 執行以下命令,建立HPA。

    kubectl apply -f ingress-hpa.yaml

步驟五:結果驗證

  1. 配置好HPA後,執行以下命令進行壓測。

    ab -t 300 -c 10 <ingress配置的網域名稱> # 使用Apache Benchmark對Ingress暴露的服務設定並發為10,時間為300秒的壓測。
  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欄位提示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相關指標,您需要提前部署Log Service組件。更多資訊,請參見採集與分析 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日誌接入阿里雲Log Service。

  • 建立叢集時,Log Service預設開啟。當您保持預設值不變,叢集建立成功後,您可以在Log Service控制台查看Nginx Ingress的訪問日誌分析報表和監控Nginx Ingress即時狀態。

  • 在建立叢集時,若您手動關閉了Log Service,叢集建立完成後,如果想要使用SLS Ingress指標進行容器水平伸縮,請重新開啟或配置Log Service。詳細資料,請參見採集與分析 Nginx Ingress 訪問日誌

  • 當您需要自訂Nginx Ingress日誌格式時,由於叢集中初次開啟Log Service部署AliyunLogConfig的CRD只針對ACK預設Ingress Controller中的日誌格式生效,若您修改過Ingress Controller的訪問日誌格式,請修改CRD配置中的Regex提取processor_regex部分。具體操作,請參見通過DaemonSet-CRD方式採集容器日誌

Failed to pull alibaba-cloud-metrics-adapter image

問題現象

升級ack-alibaba-cloud-metrics-adapter組件到1.3.7版本時拉取鏡像報錯,報錯內容如下:

Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun"。

問題原因

ack-alibaba-cloud-metrics-adapter 組件當前暫不支援直接更新。

解決方案

按照以下流程升級組件。

  1. 備份當前組件配置。

  2. 卸載舊版本組件。

  3. 使用備份配置安裝最新版本組件。

重要

組件卸載重裝過程中,相關的HPA會因為監控資料擷取停止而暫停擴縮行為。

相關文檔