Openshift HPA(Horizontal Pod Autosc
1、HPA介紹
HPA(Horizontal Pod Autoscaler)是Openshift中的一個非常重要的物件,它定義了系統如何根據收集對應的Pod的狀態(CPU/Memory)對DeploymentConfig、ReplicationController物件進行擴容與縮容。
HPA依賴於收集到的Pod資源的使用狀態,所以要使HPA生效,Openshift必須安裝好cluster metrics應用。
被監控的pod必須設定好了
spec.containers.resources.requests
屬性,HPA才能正常工作。僅支援CPU/Memory使用率的判斷,如果自定義監控項,只能使用經驗值,不能使用使用率。
-
支援物件:DeploymentConfig、ReplicationController、Deployment、Replica Set。
HPA實現Pod伸縮.JPG
2. HPA伸縮過程及演算法
HPA進行伸縮過程
收集該HPA控制下所有Pod最近的cpu使用情況(CPU utilization)
對比在擴容條件裡記錄的cpu限額(CPUUtilization)
調整例項數(必須要滿足不超過最大/最小例項數)
每隔30s做一次自動擴容的判斷
說明:
CPU utilization的計算方法是用cpu usage(最近一分鐘的平均值,透過heapster可以直接獲取到)除以cpu request(這裡cpu request就是我們在建立容器時制定的cpu使用核心數)得到一個平均值,這個平均值可以理解為:平均每個Pod CPU核心的使用佔比。
最重要的步驟為3,這裡即為HPA的演算法,計算當前需要啟動幾個Pod
HPA進行伸縮演算法
分為三種情況:
普通情況下啟動Pod數量計算方式
TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
說明:
ceil()表示取大於或等於某數的最近一個整數
例子:
我們有一個叢集例項數是3 pods,同時Pod的cpu資源的Request為1.4。cpu限額,即Target是CPU使用率為80%,當cpu的使用量CurrentPodsCPUUtilization為1.1,1.4,1.3時,要擴容成多少個呢?
ceil((1.1+1.4+1.3)/1.4/0.8)= 4
所以擴容成四個例項。
例項剛啟動時及剛完成擴容/縮容,會有一段冷卻時間
由於啟動例項時cpu的使用度會陡增,所以自動擴容會等待一段時間以收集準確的執行時監控資料。每次擴容後冷卻3分鐘才能再次進行擴容,而縮容則要等5分鐘後。這是因為自動擴容使用保守的方法,儘可能滿足pods業務的正常使用,所以擴容的優先順序要大於縮容。當前Pod Cpu使用率與目標使用率接近時,不會觸發擴容
當滿足以下條件才會真正觸發擴容/縮容:
avg(CurrentPodsConsumption) / Target >1.1 或 <0.9
這是為了避免出現頻繁的擴容縮容。
擴容條件的相對與絕對度量
例子:
我們有一個叢集例項數是3 pods,同時Pod的cpu資源的Request為1.5。cpu限額,即Target是CPU使用率為80%,當cpu的使用量CurrentPodsCPUUtilization為1.1,1.4,1.3時,會不會發生擴容,要擴容成多少個呢?
ceil((1.1+1.4+1.3)/1.5/0.8)= 4
按照我們1的說法,它再新增一個pod。但是我們再來算下當前Pod使用率與目標使用率情況。
(1.1 + 1.4 + 1.3)/3/1.5 = 0.84444 #當前Pod CPU平均使用率0.84444 / 0.8 = 1.055555 < 1.1 #當前Pod CPU平均使用率與目標CPU使用率比
綜上:1.0555 < 1.1
,當前HPA並不會發生擴容,所以最終Pod數仍然是3個。
實戰
為 dc/nginx-demo 建立一個 HPA (最小為1個pod,最多為3個pod,cpu使用率目標值為80%)
oc autoscale dc/nginx-demo--min=1 --max=3 --cpu-percent=80
檢視當前hpa狀態
[root@demo ~]# oc delete hpa hpa-resource-metrics-memory horizontalpodautoscaler "hpa-resource-metrics-memory" deleted [root@demo ~]# oc describe hpa nginx-demo Name: nginx-demo Namespace: testmysql Labels: <none> Annotations: <none> CreationTimestamp: Wed, 06 Jun 2018 10:36:57 +0800Reference: DeploymentConfig/nginx-demo Metrics: ( current / target ) resource cpu on pods (as a percentage of request): 0% (0) / 80% Min replicas: 1Max replicas: 3Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale ScalingActive True ValidMetricFound the HPA was able to succesfully calculate a replica count from cpu resource utilization (percentage of request) ScalingLimited True TooFewReplicas the desired replica count is more than the maximum replica count Events: <none>
為dc/nginx-demo建立一個HPA(最小為1個pod,最多為3個pod,memory使用率目標值50%)
與CPU使用率作為目標值不同,memory使用率不能使用oc autoscale命令來建立,只能透過yaml檔案來建立。
# hpa-memory.ymlapiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name: hpa-resource-metrics-memory spec: scaleTargetRef: apiVersion: apps.openshift.io/v1 kind: DeploymentConfig name: nginx-demo minReplicas: 1 maxReplicas: 3 metrics: - type: Resource resource: name: memory targetAverageUtilization: 50
oc create -f hpa-memory.yml
檢視當前hpa狀態
[root@demo~]# oc describe hpa hpa-resource-metrics-memory Name: hpa-resource-metrics-memory Namespace: testmysql Labels: <none> Annotations: <none> CreationTimestamp: Wed, 06 Jun 2018 10:28:59 +0800Reference: DeploymentConfig/nginx-demo Metrics: ( current / target ) resource memory on pods (as a percentage of request): 1% (1347584) / 50% Min replicas: 1Max replicas: 3Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale ScalingActive True ValidMetricFound the HPA was able to succesfully calculate a replica count from memory resource utilization (percentage of request) ScalingLimited False DesiredWithinRange the desired count is within the acceptable range Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedGetScale 5m (x6 over 8m) horizontal-pod-autoscaler no matches for apps/, Kind=DeploymentConfig Warning FailedGetScale 4m (x3 over 5m) horizontal-pod-autoscaler no matches for apps/, Kind=ReplicationController Warning FailedGetScale 3m horizontal-pod-autoscaler replicationcontrollers/scale.autoscaling "nginx-demo" not found
作者:潘曉華Michael
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/151/viewspace-2820638/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- k8s 自動伸縮 pod(HPA)K8S
- 解析 | openshift原始碼簡析之pod網路配置(下)原始碼
- 基於Kubernetes的hpa實現pod例項數量的自動伸縮
- 雲平臺將故障Pod流量下線通用思路與OpenShift操作實戰
- Openshift
- Febrac8 + OpenShift + Kubernetes (3) Install OpenShift
- openshift scc解析
- Openshift部署教程
- 基於Heapster的HPA
- 003.OpenShift網路
- 001.OpenShift介紹
- Portworx on OpenShift 原理講解
- 23-pod-Pod Preset
- pod install 與 pod update
- CocoaPods pod install/pod update更新慢
- k8s的監控+HPAK8S
- [kubernetes系列]HPA模組深度講解
- OpenShift與Docker全方位比較Docker
- 007.OpenShift管理應用部署
- 002.OpenShift安裝與部署
- 004.OpenShift命令及故障排查
- 009.OpenShift管理及監控
- 深入 Pod
- pod 示例
- 在Ubuntu上安裝OpenShift並使用Ubuntu
- Openshift叢集3.9升級到3.10
- OpenShift S2I 概念及流程
- 006.OpenShift永續性儲存
- 正確的使用pod install 和 pod update - CocoaPods
- 拋磚系列之k8s HorizontalPodAutoscaler(HPA)K8S
- Pod詳解
- Kubernetes:28---pod託管(Job:任務型pod)
- k8s實踐——HPA實踐例項K8S
- k8s HPA(HorizontalPodAutoscaler)--自動水平伸縮K8S
- k8s-hpa自動橫向擴容K8S
- 21-pod-podLifecycle
- 25-pod-Disruptions
- 22-pod-initContainerAI