如果您想基於CPU使用率、記憶體使用量率或其他自訂指標實現Pod的自動擴縮,建議您為業務容器開啟水平伸縮HPA(Horizontal Pod Autoscaler)功能。HPA能夠在業務負載急劇飆升時快速擴容多個Pod副本來緩解壓力,也可以在業務負載變小時根據實際情況適當縮容以節省資源,無需您人為幹預。HPA適用於服務波動較大、服務數量多且需要頻繁擴縮容的業務情境,例如電商服務、線上教育、金融服務等。
前提條件
通過Container Service控制台建立HPA應用
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情。
在叢集管理頁左側導覽列,選擇。
在無狀態頁面,單擊使用鏡像建立。
在建立頁面,按照頁面提示完成應用基本資料配置、容器配置、服務配置和伸縮配置,建立一個支援HPA的Deployment。
具體步驟及配置項說明,請參見使用鏡像建立無狀態應用。下文僅介紹主要配置項。
應用基本資料:配置應用的名稱、副本數量等。
容器配置:配置鏡像,並配置所需的CPU和記憶體資源。
重要請為應用設定所需的請求(Request)資源,否則無法進行容器自動調整。
進階配置:
在訪問設定地區,單擊服務(Service)對應的建立,配置Service。
在伸縮配置地區,勾選指標伸縮的開啟,配置伸縮的條件和參數。
指標:支援CPU和記憶體,需要和設定的所需資源類型相同。當同時指定CPU和記憶體資源類型時,HPA會在檢測到任何一個指標達到擴縮閾值後執行擴縮容操作。
觸發條件:資源使用率的百分比,超過該使用量,容器開始擴容。有關Pod水平自動擴縮的演算法,請參見演算法細節。
最大副本數:該Deployment可擴容的容器數量上限。該值需要大於最小副本數。
最小副本數:該Deployment可縮容的容器數量下限。該值需要設定為大於等於1的整數。
通過kubectl命令建立HPA應用
您也可以通過編排模板來手動建立HPA,並將其綁定到要伸縮的Deployment對象上,通過kubectl命令實現容器自動調整配置。推薦您為一個工作負載僅建立一個HPA。下文以部署支援HPA的Nginx應用為例。
建立並複製以下內容到nginx.yml中。
重要實現HPA時,需為Pod設定
request資源,否則HPA無法運行。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