K8s?HPA(自動(dòng)伸縮)解讀
HPA簡(jiǎn)介
提示:Kubernetes官方HPA說明文檔 https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale
在 Kubernetes 中,HPA(Horizontal Pod Autoscaler)自動(dòng)伸縮工作負(fù)載資源 (例如Deployment、StatefulSet等), 目的是自動(dòng)伸縮工作負(fù)載以滿足需求。水平擴(kuò)展意味著對(duì)增加的負(fù)載的響應(yīng)是部署更多的pod。這與垂直擴(kuò)展不同,垂直擴(kuò)展對(duì)于Kubernetes來說意味著將更多的資源(例如:內(nèi)存或CPU)分配給已經(jīng)為工作負(fù)載運(yùn)行的pod。如果負(fù)載減少,并且pod的數(shù)量高于配置的最小值,則HPA會(huì)指示工作負(fù)載資源(Deployment、StatefulSet或其他類似資源)縮減。
在新版的Kubernetes中系統(tǒng)資源的采集均使用Metrics Server,可以通過Metrics采集節(jié)點(diǎn)和Pod的內(nèi)存、磁盤、CPU和網(wǎng)絡(luò)的使用率。HPA通過Metrics采集Pod資源的內(nèi)存、CPU等使用情況,如果發(fā)現(xiàn)某個(gè)Pod資源硬件資源負(fù)載過高或過低,會(huì)自動(dòng)伸縮Pod資源,以達(dá)到Pod硬件資源的負(fù)載均衡。
一、HPA接口類型
- v1 # 穩(wěn)定版自動(dòng)水平伸縮,只支持CPU指標(biāo)
- v2beta1 # 支持CPU、內(nèi)存和自定義指標(biāo)
- v2beta2 # 支持CPU、內(nèi)存、自定義指標(biāo)Custom和額外指標(biāo)ExternalMetrics
### 查看K8s集群是否已安裝部署Metrics Server root@k8s-master01:~# kubectl get pods -n kube-system -o wide| grep metrics-server metrics-server-5f9cfc9f9-7kkf4 1/1 Running 2 (4d5h ago) 4d23h 172.30.122.133 k8s-master02 <none> <none> ### 查看K8s集群所支持的HPA接口類型 root@k8s-master01:~# kubectl api-resources | grep HorizontalPodAutoscaler horizontalpodautoscalers hpa autoscaling/v2 true HorizontalPodAutoscaler
二、基于CPU使用率創(chuàng)建HPA
- 注意:水平pod自動(dòng)縮放無法縮放的對(duì)象,例如:守護(hù)進(jìn)程類的工作負(fù)載DaemonSet
- 注意:K8s集群必須安裝部署Metrics Server才可以使用HPA功能
- 注意:HPA是根據(jù)Delpoyment工作負(fù)載.spec.resources.requests參數(shù)實(shí)現(xiàn)自動(dòng)伸縮
1、Deployment resources參數(shù)說明
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy
name: nginx-deploy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
run: nginx-pod
template:
metadata:
name: nginx
labels:
run: nginx-pod
spec:
containers:
- name: nginx01
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources: # 配置Pod資源請(qǐng)求和資源限制
requests: # 配置Pod資源請(qǐng)求
cpu: 10m # 配置CPU資源請(qǐng)求10m(毫核),1顆物理CPU等于1000m
memory: 64Mi # 配置內(nèi)存資源請(qǐng)求64M
limits: # 配置Pod資源限制
cpu: 100m # 配置CPU資源限制100m(毫核) ,1顆物理CPU等于1000m
memory: 128Mi # 配置內(nèi)存資源限制128M
2、創(chuàng)建Deployment
cat > /data/yaml/hpa/deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy
name: nginx-deploy
namespace: default
spec:
replicas: 1
selector:
matchLabels:
run: nginx-pod
template:
metadata:
name: nginx
labels:
run: nginx-pod
spec:
containers:
- name: nginx01
image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
requests:
cpu: 10m
memory: 64Mi
limits:
cpu: 100m
memory: 128Mi
EOF
kubectl create -f /data/yaml/hpa/deployment.yaml
kubectl get pods -n default -owide
kubectl get deploy -n default
3、創(chuàng)建Service暴露 Nginx服務(wù)80端口
### 創(chuàng)建Service kubectl get deploy -n default kubectl expose deploy nginx-deploy --port=80 kubectl get service -n default –owide ### 訪問Nginx 80端口 curl 10.96.249.147
4、查看當(dāng)前Pod資源使用率
kubectl top pods -n default
5、HPA參數(shù)說明
apiVersion: autoscaling/v2 # 填寫API資源版本號(hào),通過kubectl api-resources | grep HorizontalPodAutoscaler命令查詢API資源版本號(hào)
kind: HorizontalPodAutoscaler # 指定資源類型,HorizontalPodAutoscaler資源類型是HorizontalPodAutoscaler
metadata: # 包含HorizontalPodAutoscaler的元數(shù)據(jù)
name: nginx-deploy-hpa # 自定義HorizontalPodAutoscaler的名稱
namespace: default # 指定HPA運(yùn)行的命名空間,與Deployment命名空間相同,默認(rèn)default
spec:
scaleTargetRef: # 指定HPA要監(jiān)控的目標(biāo),包括API版本、類型(如Deployment)、名稱
apiVersion: apps/v1 # 指定要監(jiān)控目標(biāo)的Deployment API資源版本號(hào)
kind: Deployment # 指定要監(jiān)控目標(biāo)的Deployment資源類型
name: nginx-deploy # 指定要監(jiān)控目標(biāo)Deployment的名稱
minReplicas: 1 # Pod副本的最小數(shù)量
maxReplicas: 10 # Pod副本的最大數(shù)量
metrics: # 定義觸發(fā)Pod數(shù)量調(diào)整的指標(biāo)
- type: Resource # 指標(biāo)類型,如Resource(資源使用率)或Pods(基于Pods的數(shù)量)
resource:
name: cpu # 資源名稱,如cpu或memory
target:
type: Utilization # 目標(biāo)類型,如Unilization(利用率)或AverageValue(平均值)
averageUtilization: 50 # 目標(biāo)利用率百分比(例如 50表示50%)
# averageValue: 100Mi # 目標(biāo)平均值(例如100Mi表示100MB)
6、創(chuàng)建HPA(根據(jù)CPU使用率)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deploy-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
EOF
kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default
7、創(chuàng)建HPA(根據(jù)CPU平均值)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deploy-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: AverageValue
averageValue: 50m
EOF
kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default
8、創(chuàng)建HPA(根據(jù)Memory使用率)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deploy-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy
minReplicas: 1
maxReplicas: 5
metrics:
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 50
EOF
kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default
9、創(chuàng)建HPA(根據(jù)Memory平均值)
cat > /data/yaml/hpa/horizontalpodautoscaler.yaml << 'EOF'
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deploy-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: memory
target:
type: AverageValue
averageValue: 6Mi
EOF
kubectl create -f /data/yaml/hpa/horizontalpodautoscaler.yaml
kubectl get hpa -n default
10、模擬壓力測(cè)試Nginx容器
### 當(dāng)前只運(yùn)行了一個(gè)Pod root@k8s-master01:~# kubectl get pod -n default NAME READY STATUS RESTARTS AGE nginx-deploy-6998946c5b-g2h8c 1/1 Running 0 64m ### 查看Deployment Service root@k8s-master01:~# kubectl get service -n default | grep nginx-deploy nginx-deploy ClusterIP 10.96.249.147 <none> 80/TCP 37m ### 模擬壓力測(cè)試Nginx容器 while true; do wget -q -O- http://10.96.249.147 > /dev/null; done ### 打開另一個(gè)窗口查看Pod CPU資源使用率和自動(dòng)伸縮 for i in `seq 100`;do sleep 2;kubectl top pods;kubectl get pods -n default;echo;done
11、使用kubectl autoscale命令創(chuàng)建HPA
--cpu-percent=50 # 指定 Deployment 目標(biāo) CPU 使用率百分比 --min=1 # 指定 Deployment 應(yīng)具有的最小副本數(shù)。即使 CPU 利用率很低,水平 Pod 自動(dòng)縮放器也不會(huì)將 Deployment 縮小到此數(shù)值以下 --max=5 # 指定 Deployment 應(yīng)具有的最大副本數(shù)。如果 CPU 利用率非常高,水平 Pod 自動(dòng)縮放器也不會(huì)將 Deployment 擴(kuò)展到此數(shù)值以上 kubectl autoscale deploy nginx-deploy --cpu-percent=50 --min=1 --max=5 kubectl get hpa -n default
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Kubernetes中使用PersistentVolume掛載云盤方式
這篇文章主要介紹了Kubernetes中使用PersistentVolume掛載云盤方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
k8s容器狀態(tài)Terminating無法刪除的問題及解決
這篇文章主要介紹了k8s容器狀態(tài)Terminating無法刪除的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
k8s部署并測(cè)試ingress-nginx的詳細(xì)過程
這篇文章主要介紹了k8s部署并測(cè)試ingress-nginx的詳細(xì)過程,本文通過一個(gè)demo示例給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04
K8s中Pod處于Pending狀態(tài)的八種原因分析
文章詳細(xì)介紹了Pod處于Pending狀態(tài)的八種常見原因,并提供了相應(yīng)的排查和解決方法,這些原因包括資源不足、調(diào)度約束、存儲(chǔ)依賴、鏡像問題、配額限制、網(wǎng)絡(luò)暗礁、系統(tǒng)級(jí)異常以及冷門陷阱,每種原因都附帶了具體的診斷方法和解決建議,感興趣的朋友一起看看吧2025-02-02
Kubernetes教程之Windows?HostProcess?運(yùn)行容器化負(fù)載
這篇文章主要介紹了Kubernetes?Windows?HostProcess?運(yùn)行容器化負(fù)載,本篇內(nèi)容還是比較多的,總共包含了?Windows?HostProcess的創(chuàng)建、為?Windows?Pod?和容器配置?GMSA?和?Windows?的?Pod?和容器配置?RunAsUserName三大功能模塊,需要的朋友可以參考下2022-07-07
CentOS?8.2?k8s?基礎(chǔ)環(huán)境配置
這篇文章主要介紹了CentOS?8.2?k8s?基礎(chǔ)環(huán)境配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
K8s?ConfigMaps與Secret實(shí)現(xiàn)配置分離過程
本文介紹Kubernetes中ConfigMaps和Secret的創(chuàng)建方式及應(yīng)用,涵蓋文件、literal、YAML方法,強(qiáng)調(diào)命名空間匹配與鍵名大小寫一致性,Secret類型如Opaque、dockerconfigjson用于加密配置,熱更新需注意envFrom等參數(shù)限制2025-08-08
k8s:pod has unbound PersistentVolumeClaims問題及
部署redis-ha時(shí),Pod因PVC未綁定報(bào)錯(cuò),原因在于value.yaml中storageClassName為空,且未啟用DefaultDefaultStorageClass,解決方法是手動(dòng)指定PVC的StorageClassName為現(xiàn)有存儲(chǔ)類,確保PV分配成功2025-07-07
Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法
這篇文章主要為大家介紹了Kubernetes中創(chuàng)建命名空間實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11

