如果您想基於CPU使用率、記憶體使用量率或其他自訂指標實現Pod的自動擴縮,建議您為業務容器開啟水平伸縮HPA(Horizontal Pod Autoscaler)功能。HPA能夠在業務負載急劇飆升時快速擴容多個Pod副本來緩解壓力,也可以在業務負載變小時根據實際情況適當縮容以節省資源,無需您人為幹預。HPA適用於服務波動較大、服務數量多且需要頻繁擴縮容的業務情境,例如電商服務、線上教育、金融服務等。
閱讀前提示
為了協助您更好地使用HPA功能,建議您在閱讀本文前參見Kubernetes官方文檔Pod 水平自動擴縮瞭解HPA相關的基礎原理、演算法細節、可配置的擴縮行為等等。
此外,ACK叢集提供了多種工作負載伸縮(調度層彈性)和節點伸縮(資源層彈性)方案,建議您在使用本文檔前閱讀Auto Scaling概述,瞭解不同方案的適用情境、使用限制等。
前提條件
已建立ACK託管叢集、ACK專有叢集。具體操作,請參見建立叢集。
如您使用kubectl命令來實現HPA,還需已通過kubectl串連Kubernetes叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
通過Container Service控制台建立HPA應用
阿里雲Container Service已經整合了HPA。您可以通過Container Service控制台建立HPA應用。您可以在建立應用時候建立HPA,也可以為已有應用開啟HPA。推薦您為一個工作負載僅建立一個HPA。
在建立應用時建立HPA
以下以無狀態應用Deployment為例,介紹如何為已有應用開啟HPA。其他工作負載類型的步驟類似。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在無狀態頁面,單擊使用鏡像建立。
在建立頁面,按照頁面提示完成應用基本資料配置、容器配置、服務配置和伸縮配置,建立一個支援HPA的Deployment。
具體步驟及配置項說明,請參見建立無狀態工作負載Deployment。下文僅介紹主要配置項。
應用基本資料:配置應用的名稱、副本數量等。
容器配置:配置鏡像,並配置所需的CPU和記憶體資源。
您可以使用資源畫像功能對資源使用量歷史資料進行分析,擷取配置容器Request和Limit的相關建議。更多資訊,請參見資源畫像。
重要請為應用設定所需的請求(Request)資源,否則無法進行容器自動調整。
進階配置:
在訪問設定地區,單擊服務(Service)對應的建立,配置Service。
在伸縮配置地區,勾選指標伸縮的開啟,配置伸縮的條件和參數。
指標:支援CPU和記憶體,需要和設定的所需資源類型相同。當同時指定CPU和記憶體資源類型時,HPA會在檢測到任何一個指標達到擴縮閾值後執行擴縮容操作。
觸發條件:資源使用率的百分比,超過該使用量,容器開始擴容。有關Pod水平自動擴縮的演算法,請參見演算法細節。
最大副本數:該Deployment可擴容的容器數量上限。該值需要大於最小副本數。
最小副本數:該Deployment可縮容的容器數量下限。該值需要設定為大於等於1的整數。
建立完成後,您可以在無狀態頁面查看建立的Deployment。單擊Deployment名稱,然後在Deployment詳情頁面單擊容器伸縮頁簽。在此地區,您可以查看HPA活動相關指標,包括CPU或記憶體使用量率、最大或最小副本數等,以及對HPA進行管理,包括更新HPA配置、停用HPA等。
為已有應用建立HPA
以下以無狀態應用Deployment為例,介紹如何為已有應用開啟HPA。其他工作負載類型的步驟類似。
工作負載頁面
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在無狀態頁面,單擊目標應用程式名稱,單擊容器伸縮頁簽,然後單擊HPA地區的建立。
在建立對話方塊,按照頁面提示設定伸縮的配置。
名稱:HPA策略名稱稱。
監控項:支援CPU和記憶體,需要和設定的所需資源類型相同。當同時指定CPU和記憶體資源類型時,HPA會在檢測到任何一個指標達到擴縮閾值後執行擴縮容操作。
閾值:資源使用率的百分比,超過該使用量,容器開始擴容。有關Pod水平自動擴縮的演算法,請參見演算法細節。
最大容器數量:該Deployment可擴容的容器數量上限。該值需要大於最小副本數。
最小容器數量:該Deployment可縮容的容器數量下限。該值需要設定為大於等於1的整數。
配置完成後,您可以在無狀態應用頁面單擊Deployment名稱,然後在Deployment詳情頁面單擊容器伸縮頁簽。在此地區,您可以查看HPA活動相關指標,包括CPU或記憶體使用量率、最大或最小副本數等,以及對HPA進行管理,包括更新HPA配置、停用HPA等。
工作負載伸縮頁面
此頁面目前白名單開放中。如需使用,請提交工單申請。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。在頁面右上方,單擊建立自動調整,選擇目標工作負載,然後在水平伸縮頁簽下勾選HPA選項,按照頁面提示配置HPA策略。
伸縮策略名稱稱:HPA策略名稱稱。
最小容器數量:該工作負載可縮容的容器數量下限。該值需要設定為大於等於1的整數。
最大容器數量:該工作負載可擴容的容器數量上限。該值需要大於最小副本數。
監控項:支援CPU和記憶體,需要和設定的所需資源類型相同。當同時指定CPU和記憶體資源類型時,HPA會在檢測到任何一個指標達到擴縮閾值後執行擴縮容操作。
閾值:資源使用率的百分比,超過該使用量,容器開始擴容。有關Pod水平自動擴縮的演算法,請參見演算法細節。
建立完成後,您可以在工作負載伸縮頁面查看HPA列表。在操作列,您可以查看HPA活動相關指標,包括CPU或記憶體使用量率、最大或最小副本數等,以及對HPA進行管理,包括更新HPA配置、停用HPA等。
結果驗證
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。單擊水平伸縮頁簽,然後選擇HPA,查看擴縮容狀態和工作清單。
在實際使用環境中,應用會根據Pod負載進行伸縮。您也可以在測試環境中進行Pod壓測,驗證水平伸縮情況。
通過kubectl命令建立HPA應用
您也可以通過編排模板來手動建立HPA,並將其綁定到要伸縮的Deployment對象上,通過kubectl命令實現容器自動調整配置。推薦您為一個工作負載僅建立一個HPA。下文以部署支援HPA的Nginx應用為例。
建立並複製以下內容到nginx.yml中。
重要實現HPA時,需為Pod設定
request
資源,否則HPA無法運行。您可以使用資源畫像功能對資源使用量歷史資料進行分析,擷取配置容器Request和Limit的相關建議。更多資訊,請參見資源畫像。執行以下命令,建立Nginx應用。
kubectl apply -f nginx.yml
建立並複製以下內容到hpa.yml中,用於建立HPA。
通過
scaleTargetRef
設定當前HPA綁定的對象。本例中綁定名為nginx
的Deployment,在確保所有Pod中容器的平均CPU使用率達到50%時觸發擴縮操作。1.24及以上
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 # Deployment可縮容的容器數量下限,需設定為大於等於1的整數。 maxReplicas: 10 # 該Deployment可擴容的容器數量上限,需大於minReplicas。 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 # 目標資源的平均使用率,即資源使用量的平均值與其請求量之間的比例。
1.24以下
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx minReplicas: 1 # 需要為大於等於1的整數。 maxReplicas: 10 # 需要大於最小副本數。 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
如果需要同時指定CPU和記憶體指標,您可以在
metrics
欄位下同時指定cpu
和memory
類型的資源,而不是建立2個HPA。當HPA檢測到任何一個指標達到擴縮閾值後,便會執行擴縮容操作。metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 50
執行以下命令,建立HPA。
kubectl apply -f hpa.yml
此時,執行
kubectl describe hpa <HPA名稱>
(本樣本的HPA名稱為nginx-hpa.yml),預期輸出的警告資訊如下,表明HPA仍在部署中。您可以執行kubectl get hpa
命令查看HPA的狀態。Warning FailedGetResourceMetric 2m (x6 over 4m) horizontal-pod-autoscaler missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7 Warning FailedComputeMetricsReplicas 2m (x6 over 4m) horizontal-pod-autoscaler failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5
等待HPA建立成功且Pod達到伸縮條件後(本樣本為Nginx的Pod CPU使用率超過50%),再次執行
kubectl describe hpa <HPA的名稱>
命令,查看水平伸縮情況。預期輸出如下,表明HPA正常運行。
Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 5m6s horizontal-pod-autoscaler New size: 1; reason: All metrics below target
相關操作
如果預設的擴縮容行為無法滿足業務需求,您可以通過behavior
欄位更細粒度地配置縮容(scaleDown
)和擴容(scaleUp
)行為。更多資訊,請參見配置擴縮行為。
behavior
支援的典型情境包括但不僅限於:
在流量急劇上升時實現快速擴容。
在負載波動頻繁的情境下實現快速擴容和緩慢縮容。
對狀態敏感的應用實現禁止縮容。
在資源有限或成本敏感的情境中,通過穩定視窗
stabilizationWindowSeconds
來限制擴容的速度,減少因短暫波動導致的頻繁調整。
關於behavior
配置說明以及配置樣本,請參見調節HPA擴縮容靈敏度。
常見問題
相關文檔
其他相關操作文檔
關於如何在Kubernetes提供External Metrics支援的情況下,基於阿里雲組件的指標實現容器水平伸縮(HPA),請參見基於阿里雲組件指標的容器水平伸縮。
關於如何將阿里雲Prometheus指標轉換成HPA可用的指標,實現容器水平伸縮(HPA),請參見基於阿里雲Prometheus指標的容器水平伸縮。
關於使用HPA過程中遇到的問題,您可以先參見節點自動調整FAQ進行自助排查。
如果您需要實現CronHPA與HPA的協同,請參見實現CronHPA與HPA的協同。
其他工作負載伸縮方案
如果您的應用資源使用率存在周期性變化,需要按照類似Crontab的策略定時對Pod進行擴縮容,請參見使用容器定時水平伸縮(CronHPA)。
如果您的應用資源使用率存在周期性變化,但難以通過規則定義,您可以選擇AHPA,以根據業務歷史指標自動識別業務水位周期,進行Pod擴縮容,請參見AHPA概述。
如需基於Pod的資源使用方式自動為Pod設定資源佔用的限制,從而讓Pod獲得足夠的計算資源,請參見使用容器垂直伸縮(VPA)。
如需基於訊息佇列、定時策略、自訂指標等Kubernetes事件靈活自訂擴縮容策略,對Pod進行擴縮容,請參見使用事件驅動伸縮(KEDA)。
搭配方案
您可以將HPA與節點自動調整功能搭配使用,在叢集節點資源不足時,實現節點的自動擴縮。更多資訊,請參見啟用節點自動調整。