天天看點

k8s-HPA動态伸縮

一、認識HPA

參考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/

HPA全稱是Horizontal Pod Autoscaler,中文意思是POD水準自動伸縮.

可以基于 CPU 使用率自動擴縮 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 數量。

除了 CPU 使用率,記憶體占用外,也可以基于其他應程式提供的自定義度量名額來執行自動擴縮。

自定義度量參考: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/custom-metrics-api.md

Pod 自動擴縮不适用于無法擴縮的對象,比如 DaemonSet。

Pod 水準自動擴縮特性由 Kubernetes API 資源和控制器實作。資源決定了控制器的行為。

控制器會周期性的調整副本控制器或 Deployment 中的副本數量,以使得 Pod 的平均 CPU 使用率與使用者所設定的目标值比對。

二、HPA工作機制

k8s-HPA動态伸縮

Pod 水準自動擴縮器的實作是一個控制回路,由控制器管理器的 <code>--horizontal-pod-autoscaler-sync-period</code> 參數指定周期(預設值為 15 秒)。

每個周期内,控制器管理器根據每個 HorizontalPodAutoscaler 定義中指定的名額查詢資源使用率。 控制器管理器可以從資源度量名額 API(按 Pod 統計的資源用量)和自定義度量名額 API(其他名額)擷取路徑成本。

對于按 Pod 統計的資源名額(如 CPU), 控制器從資源名額 API 中擷取每一個 HorizontalPodAutoscaler 指定的 Pod 的路徑成本,如果設定了目标使用率, 控制器擷取每個 Pod 中的容器資源使用情況,并計算資源使用率。 如果設定了 target 值,将直接使用原始資料(不再計算百分比)。 接下來,控制器根據平均的資源使用率或原始值計算出擴縮的比例,進而計算出目标副本數。

需要注意的是,如果 Pod 某些容器不支援資源采集,那麼控制器将不會使用該 Pod 的 CPU 使用率。

如果 Pod 使用自定義訓示,控制器機制與資源名額類似,差別在于自定義名額隻使用 原始值,而不是使用率。

如果 Pod 使用對象名額和外部名額(每個名額描述一個對象資訊)。 這個名額将直接根據目标設定值相比較,并生成一個上面提到的擴縮比例。 在 <code>autoscaling/v2beta2</code> 版本 API 中,這個名額也可以根據 Pod 數量平分後再計算。

通常情況下,控制器将從一系列的聚合 API(<code>metrics.k8s.io</code>、<code>custom.metrics.k8s.io</code> 和 <code>external.metrics.k8s.io</code>)中擷取路徑成本。 <code>metrics.k8s.io</code> API 通常由 Metrics 伺服器(需要額外啟動)提供。

确認安裝metrics-server

三、HPA API對象

HPA的API有三個版本

APA版本

描述

autoscaling/v1

隻支援基于CPU名額的縮放

autoscaling/v2beta1

支援Resource Metrics(資源名額,如pod的CPU)和Custom Metrics(自定義名額)的縮放;

autoscaling/v2beta2

支援Resource Metrics(資源名額,如pod的CPU)和Custom Metrics(自定義名額)和ExternalMetrics(額外名額)的縮放。

四、kubectl對HPA的支援

與其他 API 資源類似,<code>kubectl</code> 以标準方式支援 HPA。

通過 <code>kubectl create</code> 指令建立一個 HPA 對象

通過 <code>kubectl get hpa</code> 指令來擷取所有 HPA 對象

通過 <code>kubectl describe hpa</code> 指令來檢視 HPA 對象的詳細資訊

通過 <code>kubectl delete hpa</code> 指令删除對象。

此外,還有個簡便的指令 <code>kubectl autoscale</code> 來建立 HPA 對象。

例如,指令 <code>kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80</code> 将會為名 為 foo 的 ReplicationSet 建立一個 HPA 對象, 目标 CPU 使用率為 <code>80%</code>,副本數量配置為 2 到 5 之間。

五、HPA示範案例

參考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

得到pod-IP為<code>10.3.104.15</code>,此IP下面測試需要用到

說明:

--cpu-percent=50表示所有Pod的平均CPU使用率維持在50%,超過就要擴容

--min=1 --max=10表示pod數量的範

用另一個終端(我這裡是master2)使用busybox鏡像産生一個測試pod,對<code>10.3.104.15</code>進行壓測

不斷查詢hpa狀态,大概一分鐘後才會看到效果

要等幾分鐘甚至更久後,就看到cpu與pod數量都回去了

換一個終端(master2),進入pod後進行dd指令測試

ctrl+c取消後,删除dd的檔案

等幾分鐘甚至更久後,就看到cpu與pod數量都回去了

寫在最後,更多功能可以自己去探索。雖然目前HPA功能還在beta版,但以後肯定會越來越成熟。

繼續閱讀