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)文章
K8S節(jié)點(diǎn)本地存儲(chǔ)被撐爆問題徹底解決方法
這篇文章主要為大家介紹了K8S節(jié)點(diǎn)本地存儲(chǔ)被撐爆問題徹底解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
k8s整合istio配置gateway入口、配置集群內(nèi)部服務(wù)調(diào)用管理(最新推薦)
這篇文章主要介紹了k8s整合istio配置gateway入口、配置集群內(nèi)部服務(wù)調(diào)用管理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
Kubernetes調(diào)度機(jī)制與策略實(shí)驗(yàn)詳解
本文通過實(shí)際操作,詳細(xì)介紹了Kubernetes調(diào)度機(jī)制的核心原理和常用調(diào)度策略的配置方法,包括節(jié)點(diǎn)選擇、親和性與反親和性、污點(diǎn)與容忍等,實(shí)驗(yàn)環(huán)境為Kubernetes集群,并通過一系列步驟驗(yàn)證了這些調(diào)度策略的實(shí)際應(yīng)用2025-12-12
RFO SIG之openEuler AWS AMI 制作詳解
這篇文章主要為大家介紹了RFO SIG之openEuler AWS AMI 制作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
k8s編排之Deployment知識(shí)點(diǎn)詳解
這篇文章主要為大家介紹了k8s編排之Deployment知識(shí)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Kubernetes如何限制不同團(tuán)隊(duì)只能訪問各自namespace實(shí)現(xiàn)
這篇文章主要為大家介紹了Kubernetes如何限制不同團(tuán)隊(duì)只能訪問各自namespace實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04

