全部產品
Search
文件中心

Container Service for Kubernetes:使用容器水平伸縮(HPA)

更新時間:Nov 13, 2024

如果您想基於CPU使用率、記憶體使用量率或其他自訂指標實現Pod的自動擴縮,建議您為業務容器開啟水平伸縮HPA(Horizontal Pod Autoscaler)功能。HPA能夠在業務負載急劇飆升時快速擴容多個Pod副本來緩解壓力,也可以在業務負載變小時根據實際情況適當縮容以節省資源,無需您人為幹預。HPA適用於服務波動較大、服務數量多且需要頻繁擴縮容的業務情境,例如電商服務、線上教育、金融服務等。

閱讀前提示

為了協助您更好地使用HPA功能,建議您在閱讀本文前參見Kubernetes官方文檔Pod 水平自動擴縮瞭解HPA相關的基礎原理、演算法細節、可配置的擴縮行為等等。

此外,ACK叢集提供了多種工作負載伸縮(調度層彈性)和節點伸縮(資源層彈性)方案,建議您在使用本文檔前閱讀Auto Scaling概述,瞭解不同方案的適用情境、使用限制等。

前提條件

通過Container Service控制台建立HPA應用

阿里雲Container Service已經整合了HPA。您可以通過Container Service控制台建立HPA應用。您可以在建立應用時候建立HPA,也可以為已有應用開啟HPA。推薦您為一個工作負載僅建立一個HPA。

在建立應用時建立HPA

以下以無狀態應用Deployment為例,介紹如何為已有應用開啟HPA。其他工作負載類型的步驟類似。

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面,單擊使用鏡像建立

  4. 建立頁面,按照頁面提示完成應用基本資料配置、容器配置、服務配置和伸縮配置,建立一個支援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。其他工作負載類型的步驟類似。

工作負載頁面

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面,單擊目標應用程式名稱,單擊容器伸縮頁簽,然後單擊HPA地區的建立

  4. 建立對話方塊,按照頁面提示設定伸縮的配置。

    • 名稱:HPA策略名稱稱。

    • 監控項:支援CPU和記憶體,需要和設定的所需資源類型相同。當同時指定CPU和記憶體資源類型時,HPA會在檢測到任何一個指標達到擴縮閾值後執行擴縮容操作。

    • 閾值:資源使用率的百分比,超過該使用量,容器開始擴容。有關Pod水平自動擴縮的演算法,請參見演算法細節

    • 最大容器數量:該Deployment可擴容的容器數量上限。該值需要大於最小副本數。

    • 最小容器數量:該Deployment可縮容的容器數量下限。該值需要設定為大於等於1的整數。

配置完成後,您可以在無狀態應用頁面單擊Deployment名稱,然後在Deployment詳情頁面單擊容器伸縮頁簽。在此地區,您可以查看HPA活動相關指標,包括CPU或記憶體使用量率、最大或最小副本數等,以及對HPA進行管理,包括更新HPA配置、停用HPA等。

工作負載伸縮頁面

說明

此頁面目前白名單開放中。如需使用,請提交工單申請。

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇自動調整 > 工作負載伸縮

  3. 在頁面右上方,單擊建立自動調整,選擇目標工作負載,然後在水平伸縮頁簽下勾選HPA選項,按照頁面提示配置HPA策略。

    • 伸縮策略名稱稱:HPA策略名稱稱。

    • 最小容器數量:該工作負載可縮容的容器數量下限。該值需要設定為大於等於1的整數。

    • 最大容器數量:該工作負載可擴容的容器數量上限。該值需要大於最小副本數。

    • 監控項:支援CPU和記憶體,需要和設定的所需資源類型相同。當同時指定CPU和記憶體資源類型時,HPA會在檢測到任何一個指標達到擴縮閾值後執行擴縮容操作。

    • 閾值:資源使用率的百分比,超過該使用量,容器開始擴容。有關Pod水平自動擴縮的演算法,請參見演算法細節

建立完成後,您可以在工作負載伸縮頁面查看HPA列表。在操作列,您可以查看HPA活動相關指標,包括CPU或記憶體使用量率、最大或最小副本數等,以及對HPA進行管理,包括更新HPA配置、停用HPA等。

結果驗證

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇自動調整 > 工作負載伸縮

  2. 單擊水平伸縮頁簽,然後選擇HPA,查看擴縮容狀態和工作清單。

說明

在實際使用環境中,應用會根據Pod負載進行伸縮。您也可以在測試環境中進行Pod壓測,驗證水平伸縮情況。

通過kubectl命令建立HPA應用

您也可以通過編排模板來手動建立HPA,並將其綁定到要伸縮的Deployment對象上,通過kubectl命令實現容器自動調整配置。推薦您為一個工作負載僅建立一個HPA。下文以部署支援HPA的Nginx應用為例。

  1. 建立並複製以下內容到nginx.yml中。

    重要

    實現HPA時,需為Pod設定request資源,否則HPA無法運行。您可以使用資源畫像功能對資源使用量歷史資料進行分析,擷取配置容器Request和Limit的相關建議。更多資訊,請參見資源畫像

    展開查看YAML樣本

    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
  2. 執行以下命令,建立Nginx應用。

    kubectl apply -f nginx.yml
  3. 建立並複製以下內容到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欄位下同時指定cpumemory類型的資源,而不是建立2個HPA。當HPA檢測到任何一個指標達到擴縮閾值後,便會執行擴縮容操作。

    metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
      - type: Resource
        resource:
          name: memory
          target:
            type: Utilization
            averageUtilization: 50
  4. 執行以下命令,建立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
  5. 等待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擴縮容靈敏度

常見問題

相關文檔

其他相關操作文檔

其他工作負載伸縮方案

  • 如果您的應用資源使用率存在周期性變化,需要按照類似Crontab的策略定時對Pod進行擴縮容,請參見使用容器定時水平伸縮(CronHPA)

  • 如果您的應用資源使用率存在周期性變化,但難以通過規則定義,您可以選擇AHPA,以根據業務歷史指標自動識別業務水位周期,進行Pod擴縮容,請參見AHPA概述

  • 如需基於Pod的資源使用方式自動為Pod設定資源佔用的限制,從而讓Pod獲得足夠的計算資源,請參見使用容器垂直伸縮(VPA)

  • 如需基於訊息佇列、定時策略、自訂指標等Kubernetes事件靈活自訂擴縮容策略,對Pod進行擴縮容,請參見使用事件驅動伸縮(KEDA)

搭配方案

您可以將HPA與節點自動調整功能搭配使用,在叢集節點資源不足時,實現節點的自動擴縮。更多資訊,請參見啟用節點自動調整