全部產品
Search
文件中心

Container Service for Kubernetes:通過AHPA配置自訂指標以實現應用擴縮

更新時間:Jan 15, 2026

對於Web服務、訊息處理等應用,其業務負載往往與QPS、隊列長度等自訂指標直接相關,僅依賴CPU或記憶體進行擴縮容可能導致資源浪費或響應延遲。通過配置AHPA,可利用阿里雲Prometheus採集到的業務指標作為Auto Scaling的依據,更精準地匹配真實業務流量。

工作原理

image

  1. 指標暴露:應用通過HTTP端點(如/metrics)以Prometheus格式暴露業務指標,如requests_per_second

  2. 指標採集:叢集中的ARMS Prometheus Agent發現並定期抓取應用暴露的指標資料,並將其儲存在ARMS Prometheus中。

  3. 指標查詢:AHPA Controller周期性地向外部指標API發起查詢請求,以擷取自訂指標的當前值。

  4. 指標適配:該請求被轉寄給ack-alibaba-cloud-metrics-adapter。Metrics Adapter將這個查詢請求“翻譯”為PromQL查詢語句,並發送給ARMS Prometheus。

  5. 數值返回:ARMS Prometheus執行查詢後,將結果返回給Adapter。

  6. 結果上報:Metrics Adapter將結果上報給AHPA Controller。

  7. 伸縮決策:AHPA Controller根據當前指標值和預設的目標閾值計算預期Pod副本數,並調整目標Deployment的replicas數量,實現擴縮容。

準備工作

步驟一:部署應用及ServiceMonitor

首先,需要一個能夠暴露自訂指標的樣本應用,並配置參數,讓Prometheus能夠發現其相關資源。

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面,單擊使用YAML建立資源,按照頁面指引完成如下YAML的部署:部署sample-app應用、為其提供叢集內訪問的Service以及用於指標採集的ServiceMonitor

    • Deployment

      此容器在8080連接埠的/metrics路徑下暴露自訂指標requests_per_second,用於標識每秒訪問次數。

      展開查看YAML

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sample-app
        namespace: default
        labels:
          app: sample-app
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sample-app
        template:
          metadata:
            labels:
              app: sample-app
          spec:
            containers:
            - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/ahpa-external-sample:v1
              name: metrics-provider
              ports:
              - name: http
                containerPort: 8080
              env:
              - name: NAMESPACE
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.namespace
              - name: POD_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
    • Service

      為Deployment建立一個叢集內穩定的訪問地址。

      展開查看YAML

      apiVersion: v1
      kind: Service
      metadata:
        name: sample-app
        namespace: default
        labels:
          app: sample-app
      spec:
        # 選中此前部署的帶有app: sample-app標籤的Pod
        selector:
          app: sample-app
        ports:
        - name: http
          port: 8080
          targetPort: 8080
        type: ClusterIP
    • ServiceMonitor

      建立後可啟動指標採集流程。ServiceMonitor目前已預設啟用,如需檢查啟用狀態,請參見啟用功能

      展開查看YAML

      apiVersion: monitoring.coreos.com/v1
      kind: ServiceMonitor
      metadata:
        name: sample-app
        namespace: default
      spec:
        endpoints:
        - interval: 30s
          port: http
          path: /metrics
        namespaceSelector:
          any: true
        selector:
          matchLabels:
            # 通過此標籤關聯此前建立的Service
            app: sample-app

步驟二:部署Metrics Adapter

Metrics Adapter是串連AHPA與Prometheus的橋樑。部署組件後,還需配置將其串連到ARMS Prometheus執行個體。

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

  2. 單擊建立,按照頁面搜尋並部署ack-alibaba-cloud-metrics-adapter。

    • Chart 版本:推薦使用最新版本。

    • 參數配置:在Chart YAML中,在參數地區配置prometheus.urlprometheus.prometheusHeader,然後單擊確定

      • prometheus.url:阿里雲Prometheus監控的HTTP API地址(Grafana 讀取地址)。擷取方式請參見如何擷取Prometheus資料請求URL

      • prometheus.prometheusHeader

        展開查看詳細步驟

        • Prometheus V1:啟用Token驗證時,將Token直接配置到組件配置中。

          image

          ...
              prometheus:
                prometheusHeader:
                - Authorization: {Token}
          ...
        • Prometheus V2:預設已開啟基於AccessKey的鑒權。未在Prometheus控制台啟用免密訪問配置時,需將AccessKey和AccessSecret進行Base64編碼,然後填入ack-alibaba-cloud-metrics-adapter組件配置中。

          1. 產生Base64編碼字串。

            將擷取的AccessKey和AccessSecret按照 AccessKey:AccessSecret 的格式拼接,進行Base64編碼。

            echo -n 'accessKey:secretKey' | base64
          2. 配置到組件。
            將產生的完整字串按照 Basic <編碼後的字串> 的格式填入prometheusHeaderAuthorization欄位。

            ...
                prometheus:
                  prometheusHeader:
                  - Authorization: Basic YWxxxxeQ==
            ...

步驟三:為Metrics Adapter配置自訂指標

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

  2. 定位alibaba-cloud-metrics-adapter,單擊操作列的更新

  3. 將以下YAML內容複寫並覆蓋模板中對應的參數,然後單擊更新

    樣本說明中的requests_per_second需修改為實際對應的指標,對應Prometheus每秒請求數指標。

      ......
      prometheus:
        adapter:
          rules:
            custom:
            - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>})
              name:
                as: requests_per_second
              resources:
                overrides:
                  namespace:
                    resource: namespace
              seriesQuery: requests_per_second # 設定指標名稱,請確保阿里雲Prometheus中指標和此處一致。
        ......
  4. 通過Custom Metrics指標查詢方式,查看可用指標詳情。

    kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/requests_per_second"

    預期輸出:

    {"kind":"ExternalMetricValueList","apiVersion":"external.metrics.k8s.io/v1beta1","metadata":{},"items":[{"metricName":"requests_per_second","metricLabels":{},"timestamp":"2025-10-15T07:57:00Z","value":"1"}]}

步驟四:建立AHPA規則並驗證彈性效果

接下來,建立AHPA規則來自動化伸縮過程,並進行壓測驗證。

  1. 建立AHPA資源。

    使用以下YAML建立一個AHPA資源:當sample-app服務關聯的requests_per_second指標的平均值(AverageValue)超過10時,觸發擴容;低於該值則縮容。

    • 設定external.metric, 指定指標名稱以及matchLabels。指標名稱與配置自訂指標中的指標名稱保持一致。這裡指定自訂指標為requests_per_second

    • 設定目標閾值,這裡指定AverageValue10, 表示每秒請求數超過10就開始擴容。

    展開查看YAML詳細資料

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: AdvancedHorizontalPodAutoscaler
    metadata:
      name: customer-deployment
      namespace: default
    spec:
      metrics:
      - external:
          metric:
            # 與Metrics Adapter規則中name.as的值保持一致
            name: requests_per_second
            selector:
              matchLabels:
                # 通過標籤篩選指標來源
                namespace: default
                service: sample-app
          target:
            # 表示目標值是每個Pod的平均值
            type: AverageValue
            # 表示當每個Pod的平均QPS超過10時,開始擴容
            averageValue: 10
        type: External
      # 最小和最大副本數限制
      minReplicas: 0
      maxReplicas: 50
      prediction:
        quantile: 95
        scaleUpForward: 180
      scaleStrategy: observer
      # 聲明AHPA待伸縮的目標工作負載
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      instanceBounds:
      - startTime: "2023-08-01 00:00:00"
        endTime: "2033-08-01 00:00:00"
        bounds:
        - cron: "* 0-8 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 4
        - cron: "* 9-15 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 5
        - cron: "* 16-23 ? * MON-FRI"
          maxReplicas: 50
          minReplicas: 1
  2. 壓測後,查看AHPA的狀態。

    kubectl get ahpa

    預期輸出:

    NAME                  STRATEGY   PERIODICITY   REFERENCE               METRIC                TARGETS   DESIREDPODS   REPLICAS   MINPODS   MAXPODS   AGE
    customer-deployment   observer                 Deployment/sample-app   requests_per_second   16/10     2             1          1         50        102s
    • TARGETS:顯示當前指標值16,目標值為10

    • DESIREDPODS:AHPA根據當前值(16) / 目標值(10) = 2,計算出期望的副本數為2

    • REPLICAS:顯示 sample-app 的實際副本數。

      由於當前 AHPA 的 STRATEGY 為 observer,只進行計算和觀察,不執行擴縮容操作。因此,儘管DESIREDPODS為 2,但REPLICAS 仍然為 1

    也可以通過kubectl get deployment sample-app命令來確認Pod副本數的即時變化。

生產環境使用建議

維度

說明

彈性指標選擇

使用能反映真實負載的平滑指標,而非瞬時值,避免因流量毛刺(瞬間抖動)導致不必要的擴縮容。

擴縮策略配置

  • 為擴縮容行為設定明確的“安全邊界”(maxReplicasminReplicas),防止因流量攻擊或指標異常導致資源耗盡和成本失控

  • 配置縮容穩定視窗:為縮容設定比擴容更長的觀察時間,避免在流量剛剛回落就立即縮容,導致後續流量回升時再次擴容的抖動情況。

監控與警示

對AHPA運行狀態建立警示,以便及時發現潛在問題,如容量瓶頸、策略配置不合理或上遊流量異常。