1. 程式人生 > >Horizontal Pod Autoscaler (HPA) 根據資源橫向擴充套件

Horizontal Pod Autoscaler (HPA) 根據資源橫向擴充套件

Horizo​​ntal Pod Autoscaler根據觀察到的CPU利用率自動調整複製控制器,部署或副本集中的容器數量(或者,通過 自定義指標 支援,根據其他一些應用程式提供的指標)。請注意,Horizo​​ntal Pod Autoscaling不適用於無法縮放的物件,例如DaemonSet。

Horizo​​ntal Pod Autoscaler實現為Kubernetes API資源和控制器。資源確定控制器的行為。控制器會定期調整複製控制器或部署中的副本數,以使觀察到的平均CPU利用率與使用者指定的目標相匹配。

Horizontal Pod Autoscaling僅適用於Deployment和ReplicaSet,在V1版本中僅支援根據Pod的CPU利用率擴所容,在v1alpha版本中,支援根據記憶體和使用者自定義的metric擴縮容。

Horizontal Pod Autoscaling由API server和controller共同實現。

在這裡插入圖片描述

應用的資源使用率通常都有高峰和低谷的時候,如何削峰填谷,提高叢集的整體資源利用率,讓service中的Pod個數自動調整呢?這就有賴於Horizontal Pod Autoscaling了,顧名思義,使Pod水平自動縮放。這個Object(跟Pod、Deployment一樣都是API resource)也是最能體現kubernetes之於傳統運維價值的地方,不再需要手動擴容了,終於實現自動化了,還可以自定義指標,沒準未來還可以通過人工智慧自動進化呢!

HPA屬於Kubernetes中的autoscaling

SIG(Special Interest Group),其下有兩個feature:

Kubernetes自1.2版本引入HPA機制,到1.6版本之前一直是通過kubelet來獲取監控指標來判斷是否需要擴縮容,1.6版本之後必須通過API server、Heapseter或者kube-aggregator來獲取監控指標。

對於1.6以前版本中開啟自定義HPA請參考

Kubernetes autoscaling based on custom metrics without using a host port,對於1.7及以上版本請參考Configure Kubernetes Autoscaling With Custom Metrics in Kubernetes 1.7 - Bitnami

HPA解析

Horizontal Pod Autoscaling僅適用於Deployment和ReplicaSet,在V1版本中僅支援根據Pod的CPU利用率擴所容,在v1alpha版本中,支援根據記憶體和使用者自定義的metric擴縮容。

如果你不想看下面的文章可以直接看下面的示例圖,元件互動、元件的配置、命令示例,都畫在圖上了。

Horizontal Pod Autoscaling由API server和controller共同實現。

Metrics支援

在不同版本的API中,HPA autoscale時可以根據以下指標來判斷:

  • autoscaling/v1

    • CPU
  • autoscaling/v1alpha1

    • 記憶體

    • 自定義metrics

      • kubernetes1.6起支援自定義metrics,但是必須在kube-controller-manager中配置如下兩項:
        - --horizontal-pod-autoscaler-use-rest-clients=true
        - --api-server指向kube-aggregator,也可以使用heapster來實現,通過在啟動heapster的時候指定--api-server=true。檢視kubernetes metrics
    • 多種metrics組合
      - HPA會根據每個metric的值計算出scale的值,並將最大的那個值作為擴容的最終結果。

使用kubectl管理

Horizontal Pod Autoscaling作為API resource也可以像Pod、Deployment一樣使用kubeclt命令管理,使用方法跟它們一樣,資源名稱為hpa

kubectl create hpa
kubectl get hpa
kubectl describe hpa
kubectl delete hpa

有一點不同的是,可以直接使用kubectl autoscale直接通過命令列的方式建立Horizontal Pod Autoscaler。

用法如下:

kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS
[--cpu-percent=CPU] [flags] [options]

舉個例子:

kubectl autoscale deployment foo --min=2 --max=5 --cpu-percent=80

為Deployment foo建立 一個autoscaler,當Pod的CPU利用率達到80%的時候,RC的replica數在2到5之間。

注意 :如果為ReplicaSet建立HPA的話,無法使用rolling update,但是對於Deployment來說是可以的,因為Deployment在執行rolling update的時候會自動建立新的ReplicationController。

什麼是 Horizontal Pod Autoscaling?

利用 Horizontal Pod Autoscaling,kubernetes 能夠根據監測到的 CPU 利用率(或者在 alpha 版本中支援的應用提供的 metric)自動的擴容 replication controller,deployment 和 replica set。

Horizontal Pod Autoscaler 作為 kubernetes API resource 和 controller 的實現。Resource 確定 controller 的行為。Controller 會根據監測到使用者指定的目標的 CPU 利用率週期性得調整 replication controller 或 deployment 的 replica 數量。

Horizontal Pod Autoscaler 如何工作?

Horizontal Pod Autoscaler 由一個控制迴圈實現,迴圈週期由 controller manager 中的 --horizontal-pod-autoscaler-sync-period 標誌指定(預設是 30 秒)。

在每個週期內,controller manager 會查詢 HorizontalPodAutoscaler 中定義的 metric 的資源利用率。Controller manager 從 resource metric API(每個 pod 的 resource metric)或者自定義 metric API(所有的metric)中獲取 metric。

  • 每個 Pod 的 resource metric(例如 CPU),controller 通過 resource metric API 獲取 HorizontalPodAutoscaler 中定義的每個 Pod 中的 metric。然後,如果設定了目標利用率,controller 計算利用的值與每個 Pod 的容器裡的 resource request 值的百分比。如果設定了目標原始值,將直接使用該原始 metric 值。然後 controller 計算所有目標 Pod 的利用率或原始值(取決於所指定的目標型別)的平均值,產生一個用於縮放所需 replica 數量的比率。 請注意,如果某些 Pod 的容器沒有設定相關的 resource request ,則不會定義 Pod 的 CPU 利用率,並且 Aucoscaler 也不會對該 metric 採取任何操作。
  • 對於每個 Pod 自定義的 metric,controller 功能類似於每個 Pod 的 resource metric,只是它使用原始值而不是利用率值。
  • 對於 object metric,獲取單個度量(描述有問題的物件),並與目標值進行比較,以產生如上所述的比率。

HorizontalPodAutoscaler 控制器可以以兩種不同的方式獲取 metric :直接的 Heapster 訪問和 REST 客戶端訪問。

當使用直接的 Heapster 訪問時,HorizontalPodAutoscaler 直接通過 API 伺服器的服務代理子資源查詢 Heapster。需要在叢集上部署 Heapster 並在 kube-system namespace 中執行。

Autoscaler 訪問相應的 replication controller,deployment 或 replica set 來縮放子資源。

Scale 是一個允許您動態設定副本數並檢查其當前狀態的介面。

API Object

Horizontal Pod Autoscaler 是 kubernetes 的 autoscaling API 組中的 API 資源。當前的穩定版本中,只支援 CPU 自動擴縮容,可以在autoscaling/v1 API 版本中找到。

在 alpha 版本中支援根據記憶體和自定義 metric 擴縮容,可以在autoscaling/v2alpha1 中找到。autoscaling/v2alpha1 中引入的新欄位在autoscaling/v1 中是做為 annotation 而儲存的。

在 kubectl 中支援 Horizontal Pod Autoscaling

Horizontal Pod Autoscaler 和其他的所有 API 資源一樣,通過 kubectl 以標準的方式支援。

我們可以使用kubectl create命令建立一個新的 autoscaler。

我們可以使用kubectl get hpa列出所有的 autoscaler,使用kubectl describe hpa獲取其詳細資訊。

最後我們可以使用kubectl delete hpa刪除 autoscaler。

另外,可以使用kubectl autoscale命令,很輕易的就可以建立一個 Horizontal Pod Autoscaler。

例如,執行kubectl autoscale rc foo —min=2 —max=5 —cpu-percent=80命令將為 replication controller foo 建立一個 autoscaler,目標的 CPU 利用率是80%,replica 的數量介於 2 和 5 之間。

滾動更新期間的自動擴縮容

目前在Kubernetes中,可以通過直接管理 replication controller 或使用 deployment 物件來執行 滾動更新,該 deployment 物件為您管理基礎 replication controller。

Horizontal Pod Autoscaler 僅支援後一種方法:Horizontal Pod Autoscaler 被繫結到 deployment 物件,它設定 deployment 物件的大小,deployment 負責設定底層 replication controller 的大小。

Horizontal Pod Autoscaler 不能使用直接操作 replication controller 進行滾動更新,即不能將 Horizontal Pod Autoscaler 繫結到 replication controller,並進行滾動更新(例如使用kubectl rolling-update)。

這不行的原因是,當滾動更新建立一個新的 replication controller 時,Horizontal Pod Autoscaler 將不會繫結到新的 replication controller 上。

支援多個 metric

Kubernetes 1.6 中增加了支援基於多個 metric 的擴縮容。您可以使用autoscaling/v2alpha1 API 版本來為 Horizontal Pod Autoscaler 指定多個 metric。然後 Horizontal Pod Autoscaler controller 將權衡每一個 metric,並根據該 metric 提議一個新的 scale。在所有提議裡最大的那個 scale 將作為最終的 scale。

支援自定義 metric

注意: Kubernetes 1.2 根據特定於應用程式的 metric ,通過使用特殊註釋的方式,增加了對縮放的 alpha 支援。

在 Kubernetes 1.6中刪除了對這些註釋的支援,有利於autoscaling/v2alpha1 API。 雖然舊的收集自定義 metric 的舊方法仍然可用,但是這些 metric 將不可供 Horizontal Pod Autoscaler 使用,並且用於指定要縮放的自定義 metric 的以前的註釋也不在受 Horizontal Pod Autoscaler 認可。

Kubernetes 1.6增加了在 Horizontal Pod Autoscale r中使用自定義 metric 的支援。

您可以為autoscaling/v2alpha1 API 中使用的 Horizontal Pod Autoscaler 新增自定義 metric 。

Kubernetes 然後查詢新的自定義 metric API 來獲取相應自定義 metric 的值。

前提條件

為了在 Horizontal Pod Autoscaler 中使用自定義 metric,您必須在您叢集的 controller manager 中將 --horizontal-pod-autoscaler-use-rest-clients 標誌設定為 true。然後,您必須通過將 controller manager 的目標 API server 設定為 API server aggregator(使用--apiserver標誌),配置您的 controller manager 通過 API server aggregator 與API server 通訊。 Resource metric API和自定義 metric API 也必須向 API server aggregator 註冊,並且必須由叢集上執行的 API server 提供。

您可以使用 Heapster 實現 resource metric API,方法是將 --api-server 標誌設定為 true 並執行 Heapster。 單獨的元件必須提供自定義 metric API(有關自定義metric API的更多資訊,可從 k8s.io/metrics repository 獲得)。

示例

HPA預設情況下包括在Kubernetes,並且被實現為一個控制迴路,由控制器管理器的控制的期間--horizontal-pod-autoscaler-sync-period的標誌,其預設值是30秒。控制器管理器根據每個Horizo​​ntalPodAutoscaler定義中指定的度量標準查詢資源利用率。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  labels:
    app: face-search-vip
  name: face-search-vip
  namespace: cloudai-2
spec:
  minReplicas: 2
  maxReplicas: 4
  metrics:
  - type: Resource
    resource:
      name: cpu            # alpha版本中支援自定義度量和記憶體,memory。其指標是從Horizo​​ntalPodAutoscaler定位的每個pod的資源指標API獲取的
      targetAverageUtilization: 200    # targetAverageValue定義絕對值    targetAverageUtilization定義百分比
  - type: Resource
    resource:
      name: memory
      targetAverageValue: 2000Mi
  
  scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: face-search-vip-deployment

參考

官方文件:https://k8smeetup.github.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#