多執行個體部署提升了應用的穩定性,但也可能導致資源閑置和叢集成本上升。手動調節不僅工作量大,還存在滯後性。使用 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欄位的配置。 -
已安裝壓力測試工具Apache Benchmark。
本教程將建立兩個Deployment及其對應的Service,並通過路由Ingress配置了不同的訪問路徑,實現對外的流量路由。然後,基於nginx_ingress_controller_requests指標為應用配置了HPA,並通過HPA的selector.matchLabels.service欄位對指標進行過濾,以實現隨著流量的變化為Pod擴縮容的功能。
步驟一:建立應用與服務
使用以下YAML檔案建立業務Deployment和對應的Service。
-
建立並拷貝以下內容到nginx1.yaml檔案。
執行以下命令,建立應用test-app和對應的Service。
kubectl apply -f nginx1.yaml -
建立並拷貝以下內容到nginx2.yaml檔案。
執行以下命令,建立應用sample-app和對應的Service。
kubectl apply -f nginx2.yaml
步驟二:建立路由
-
建立並拷貝以下內容到ingress.yaml檔案。
執行以下命令,部署Ingress資源。
kubectl apply -f ingress.yaml -
執行以下命令,擷取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檔案
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
-
在Helm列表,單擊ack-alibaba-cloud-metrics-adapter,在資源地區,單擊adapter-config,然後單擊頁面右上方的YAML 編輯。
-
用以下代碼中的值替換代碼中對應欄位的值,然後單擊頁面下方的確定。
關於配置項詳解,請參見基於阿里雲Prometheus指標的容器水平伸縮。
rules: - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) name: as: ${1}_per_second matches: ^(.*)_requests resources: namespaced: false seriesQuery: nginx_ingress_controller_requests
查看指標輸出
執行以下命令,查看指標輸出。
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
-
建立並拷貝以下內容到hpa.yaml檔案。
執行以下命令,對業務應用sample-app和test-app分別部署HPA。
kubectl apply -f hpa.yaml -
執行以下命令,查看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進行壓測實驗,觀察業務應用是否會隨著請求增大而擴容。
-
執行以下命令,對Host下的
/home路徑進行壓測。ab -c 50 -n 5000 test.example.com/home -
執行以下命令,查看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 -
執行以下命令,對Host的根路徑進行壓測。
ab -c 50 -n 5000 test.example.com/ -
執行以下命令,查看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的便捷性,請參見彈性最佳化之自訂鏡像。