全部產品
Search
文件中心

Container Service for Kubernetes:基於Nginx Ingress流量指標的多應用Auto Scaling

更新時間:Mar 21, 2026

多執行個體部署提升了應用的穩定性,但也可能導致資源閑置和叢集成本上升。手動調節不僅工作量大,還存在滯後性。使用 Nginx Ingress 對多個應用實施 HPA,可以根據負載動態調整 Pod 副本數量,在確保應用穩定性和響應速度的同時,最佳化資源使用並降低成本。本文將介紹如何通過 Nginx Ingress 實現多應用 HPA。

Ingress 可將外部請求轉寄至叢集內的 Service,再由 Service 轉寄至 Pod 處理用戶端請求。生產環境中可以基於請求量配置自動擴縮容,通過註冊nginx_ingress_controller_requests指標來暴露請求量,基於 Nginx Ingress Controller 內建的指標實現 HPA。ACK 叢集的 Nginx Ingress Controller 在社區版基礎上進行了功能增強,使用更便捷。

前提條件

通過Nginx Ingress對多個應用進行HPA前,需要將阿里雲Prometheus指標轉換成HPA可用的指標,需完成如下準備工作。

  • 已部署阿里雲Prometheus監控組件,請參見接入與配置阿里雲Prometheus監控

  • 部署ack-alibaba-cloud-metrics-adapter組件並完成組件的prometheus.url欄位的配置。

    展開查看如何配置prometheus.url

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

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

    3. Helm頁面的操作列,單擊ack-alibaba-cloud-metrics-adapter對應的更新

    4. 更新發布面板,配置alibabaCloudMetricsAdapter. prometheus. url欄位,值為擷取的Prometheus資料請求URL,然後單擊確定

      關於如何擷取Prometheus資料請求URL,請參見如何擷取 Prometheus 資料請求 URL
      關於設定檔的詳細說明,請參見ack-alibaba-cloud-metrics-adapter組件設定檔詳解
  • 已安裝壓力測試工具Apache Benchmark。

    展開查看樣本命令

    • macOS:使用 Homebrew安裝

      brew install httpd
    • Windows:訪問Apache Lounge,下載 Windows 版本的 Apache,使用cmd命令列執行cd進入解壓後的bin目錄,運行ab.exe啟動程式。

    • Ubuntu或Debian:

      sudo apt update
      sudo apt install apache2-utils
    • CentOS 8或RHEL:

      sudo yum install httpd-tools

    安裝完成後,可執行ab -V驗證是否安裝成功。

本教程將建立兩個Deployment及其對應的Service,並通過路由Ingress配置了不同的訪問路徑,實現對外的流量路由。然後,基於nginx_ingress_controller_requests指標為應用配置了HPA,並通過HPA的selector.matchLabels.service欄位對指標進行過濾,以實現隨著流量的變化為Pod擴縮容的功能。

步驟一:建立應用與服務

使用以下YAML檔案建立業務Deployment和對應的Service。

  1. 建立並拷貝以下內容到nginx1.yaml檔案。

    展開查看YAML樣本

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-app
      namespace: default
      labels:
        app: test-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test-app
      template:
        metadata:
          labels:
            app: test-app
        spec:
          containers:
          - image: registry-cn-hangzhou.ack.aliyuncs.com/acs/sample-app:v1-b070784-aliyun
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: test-app
      namespace: default
      labels:
        app: test-app
    spec:
      ports:
        - port: 8080
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: test-app
      type: ClusterIP

    執行以下命令,建立應用test-app和對應的Service。

    kubectl apply -f nginx1.yaml
  2. 建立並拷貝以下內容到nginx2.yaml檔案。

    展開查看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/sample-app:v1-b070784-aliyun
            name: metrics-provider
            ports:
            - name: http
              containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      ports:
        - port: 80
          name: http
          protocol: TCP
          targetPort: 8080
      selector:
        app: sample-app
      type: ClusterIP

    執行以下命令,建立應用sample-app和對應的Service。

    kubectl apply -f nginx2.yaml

步驟二:建立路由

  1. 建立並拷貝以下內容到ingress.yaml檔案。

    展開查看YAML樣本

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: test-ingress
      namespace: default
    spec:
      ingressClassName: nginx
      rules:
        - host: test.example.com
          http:
            paths:
              - backend:
                  service:
                    name: sample-app
                    port:
                      number: 80
                path: /
                pathType: ImplementationSpecific
              - backend:
                  service:
                    name: test-app
                    port:
                      number: 8080
                path: /home
                pathType: ImplementationSpecific
    • host:指定服務訪問網域名稱。本樣本使用test.example.com

    • path:指定訪問的URL路徑。請求到來之後會根據路由規則匹配相應的Service,然後通過Service訪問相應的Pod。

    • backend:由Service名稱和Service連接埠組成,指定當前path轉寄的Service。

    執行以下命令,部署Ingress資源。

    kubectl apply -f ingress.yaml
  2. 執行以下命令,擷取Ingress資源。

    kubectl get ingress -o wide

    預期輸出:

    NAME           CLASS   HOSTS              ADDRESS       PORTS   AGE                                                  
    test-ingress   nginx   test.example.com   10.XX.XX.10   80      55s

    部署成功後,可以通過//home兩個路徑分別訪問Host地址。Nginx Ingress Controller會根據上方配置分別訪問sample-app和test-app。通過阿里雲Prometheus查詢指標nginx_ingress_controller_requests,可以擷取各應用的請求情況。

步驟三:將Prometheus指標轉換為HPA可用指標

修改adapter-config檔案

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

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

  3. 在Helm列表,單擊ack-alibaba-cloud-metrics-adapter,在資源地區,單擊adapter-config,然後單擊頁面右上方的YAML 編輯

  4. 用以下代碼中的值替換代碼中對應欄位的值,然後單擊頁面下方的確定

    關於配置項詳解,請參見基於阿里雲Prometheus指標的容器水平伸縮
    rules:
    - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m]))
      name:
        as: ${1}_per_second
        matches: ^(.*)_requests
      resources:
        namespaced: false  
      seriesQuery: nginx_ingress_controller_requests

    image

查看指標輸出

執行以下命令,查看指標輸出。

kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .

查詢指標結果如下:

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "nginx_ingress_controller_per_second",
      "metricLabels": {},
      "timestamp": "2025-07-25T07:56:04Z",
      "value": "0"
    }
  ]
}

步驟四:建立HPA

  1. 建立並拷貝以下內容到hpa.yaml檔案。

    展開查看YAML樣本

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: sample-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: sample-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    # 可以通過這個欄位對指標進行過濾,這裡設定的欄位會傳入adapter.config中的<<.LabelMatchers>>標籤。
                  service: sample-app
    # External指標類型下只支援Value和AverageValue類型的目標值。
            target:
              type: AverageValue
              averageValue: 30
    ---
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: test-hpa
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: test-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
            metric:
              name: nginx_ingress_controller_per_second
              selector:
                matchLabels:
    # 可以通過這個欄位對指標進行過濾,這裡設定的欄位會傳入adapter.config中的<<.LabelMatchers>>標籤。
                  service: test-app
    # External指標類型下只支援Value和AverageValue類型的目標值。
            target:
              type: AverageValue
              averageValue: 30

    執行以下命令,對業務應用sample-app和test-app分別部署HPA。

    kubectl apply -f hpa.yaml
  2. 執行以下命令,查看HPA部署情況。

    kubectl get hpa

    預期輸出:

    NAME         REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   0/30 (avg)   1         10        1          74s
    test-hpa     Deployment/test-app     0/30 (avg)   1         10        1          59m

步驟五:結果驗證

HPA部署成功後,使用工具Apache Benchmark進行壓測實驗,觀察業務應用是否會隨著請求增大而擴容。

  1. 執行以下命令,對Host下的/home路徑進行壓測。

    ab -c 50 -n 5000 test.example.com/home
  2. 執行以下命令,查看HPA情況。

    kubectl get hpa

    預期輸出:

    NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   0/30 (avg)        1         10        1          22m
    test-hpa     Deployment/test-app     22096m/30 (avg)   1         10        3          80m
  3. 執行以下命令,對Host的根路徑進行壓測。

    ab -c 50 -n 5000 test.example.com/
  4. 執行以下命令,查看HPA情況。

    kubectl get hpa

    預期輸出:

    NAME         REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    sample-hpa   Deployment/sample-app   27778m/30 (avg)   1         10        2          38m
    test-hpa     Deployment/test-app     0/30 (avg)        1         10        1          96m

    從上述結果可以看到,業務應用在請求量增大超過閾值的情況下成功擴容。

相關文檔

  • 多可用性區域均衡是資料類型業務在高可用情境下常用的部署方式。當業務壓力增大時,有多可用性區域均衡調度策略的應用希望能夠自動擴容出多個可用性區域的執行個體來滿足叢集的調度水位。詳細資料,請參見實現多可用性區域同時快速彈性擴容

  • 構建自訂動作系統鏡像以提高複雜情境下Auto Scaling的便捷性,請參見彈性最佳化之自訂鏡像