如果您想基于CPU使用率、內存使用率或其他自定義指標實現Pod的自動擴縮,建議您為業務容器開啟水平伸縮HPA(Horizontal Pod Autoscaler)功能。HPA能夠在業務負載急劇飆升時快速擴容多個Pod副本來緩解壓力,也可以在業務負載變小時根據實際情況適當縮容以節省資源,無需您人為干預。HPA適用于服務波動較大、服務數量多且需要頻繁擴縮容的業務場景,例如電商服務、線上教育、金融服務等。
閱讀前提示
為了幫助您更好地使用HPA功能,建議您在閱讀本文前參見Kubernetes官方文檔Pod 水平自動擴縮了解HPA相關的基礎原理、算法細節、可配置的擴縮行為等等。
此外,ACK集群提供了多種工作負載伸縮(調度層彈性)和節點伸縮(資源層彈性)方案,建議您在使用本文檔前閱讀彈性伸縮概述,了解不同方案的適用場景、使用限制等。
前提條件
已創建ACK托管集群、ACK專有集群。具體操作,請參見創建集群。
如您使用kubectl命令來實現HPA,還需已通過kubectl連接Kubernetes集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
通過容器服務控制臺創建HPA應用
阿里云容器服務已經集成了HPA。您可以通過容器服務控制臺創建HPA應用。您可以在新建應用時候創建HPA,也可以為已有應用開啟HPA。推薦您為一個工作負載僅創建一個HPA。
在創建應用時創建HPA
以下以無狀態應用Deployment為例,介紹如何為已有應用開啟HPA。其他工作負載類型的步驟類似。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在無狀態頁面,單擊使用鏡像創建。
在創建頁面,按照頁面提示完成應用基本信息配置、容器配置、服務配置和伸縮配置,創建一個支持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。其他工作負載類型的步驟類似。
工作負載頁面
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在無狀態頁面,單擊目標應用名稱,單擊容器伸縮頁簽,然后單擊HPA區域的創建。
在創建對話框,按照頁面提示設置伸縮的配置。
名稱:HPA策略名稱。
監控項:支持CPU和內存,需要和設置的所需資源類型相同。當同時指定CPU和內存資源類型時,HPA會在檢測到任何一個指標達到擴縮閾值后執行擴縮容操作。
閾值:資源使用率的百分比,超過該使用量,容器開始擴容。有關Pod水平自動擴縮的算法,請參見算法細節。
最大容器數量:該Deployment可擴容的容器數量上限。該值需要大于最小副本數。
最小容器數量:該Deployment可縮容的容器數量下限。該值需要設置為大于等于1的整數。
配置完成后,您可以在無狀態應用頁面單擊Deployment名稱,然后在Deployment詳情頁面單擊容器伸縮頁簽。在此區域,您可以查看HPA活動相關指標,包括CPU或內存使用率、最大或最小副本數等,以及對HPA進行管理,包括更新HPA配置、停用HPA等。
工作負載伸縮頁面
此頁面目前白名單開放中。如需使用,請提交工單申請。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇
。在頁面右上角,單擊創建自動伸縮,選擇目標工作負載,然后在水平伸縮頁簽下勾選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的相關建議。更多信息,請參見資源畫像。apiVersion: apps/v1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 # 替換為實際的<image_name:tags>。 ports: - containerPort: 80 resources: requests: # 必須設置,否則HPA無法運行。 cpu: 500m
執行以下命令,創建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進行擴縮容,請參見事件驅動彈性。
搭配方案
您可以將HPA與節點自動伸縮功能搭配使用,在集群節點資源不足時,實現節點的自動擴縮。更多信息,請參見啟用節點自動伸縮。