kubernetes Horizontal Pod Autoscaling
- 自動(dòng)擴(kuò)縮ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 數(shù)量
- 度量指標(biāo)可以是:CPU指標(biāo) 和 自定義

HPA 控制過(guò)程
-
實(shí)現(xiàn)自動(dòng)擴(kuò)縮容的原理官方文檔
-
--horizontal-pod-autoscaler-sync-period=15s控制器的自動(dòng)檢測(cè)周期。 - metrics-server 提供 metrics.k8s.io API 為pod資源的使用提供支持。
- 15s/周期 -> 查詢(xún)metrics.k8s.io API -> 算法計(jì)算 -> 調(diào)用scale 調(diào)度 -> 特定的擴(kuò)縮容策略執(zhí)行。
-
-
HPA擴(kuò)縮容算法 期望副本數(shù) = ceil[當(dāng)前副本數(shù) * (度量指標(biāo) / 期望指標(biāo))]
- 擴(kuò)容
- 如果計(jì)算出的擴(kuò)縮比例接近 1.0, 將會(huì)放棄本次擴(kuò)縮, 度量指標(biāo) / 期望指標(biāo)接近1.0。
- 縮容
- 冷卻/延遲: 如果延遲(冷卻)時(shí)間設(shè)置的太短,那么副本數(shù)量有可能跟以前一樣出現(xiàn)抖動(dòng)。 默認(rèn)值是 5 分鐘(5m0s)
--horizontal-pod-autoscaler-downscale-stabilization
- 冷卻/延遲: 如果延遲(冷卻)時(shí)間設(shè)置的太短,那么副本數(shù)量有可能跟以前一樣出現(xiàn)抖動(dòng)。 默認(rèn)值是 5 分鐘(5m0s)
- 特殊處理
- 丟失度量值:縮小時(shí)假設(shè)這些 Pod 消耗了目標(biāo)值的 100%, 在需要放大時(shí)假設(shè)這些 Pod 消耗了 0% 目標(biāo)值。 這可以在一定程度上抑制擴(kuò)縮的幅度。
- 存在未就緒的pod的時(shí)候:我們保守地假設(shè)尚未就緒的 Pod 消耗了期望指標(biāo)的 0%,從而進(jìn)一步降低了擴(kuò)縮的幅度。
- 未就緒的 Pod 和缺少指標(biāo)的 Pod 考慮進(jìn)來(lái)再次計(jì)算使用率。 如果新的比率與擴(kuò)縮方向相反,或者在容忍范圍內(nèi),則跳過(guò)擴(kuò)縮。 否則,我們使用新的擴(kuò)縮比例。
- 指定了多個(gè)指標(biāo), 那么會(huì)按照每個(gè)指標(biāo)分別計(jì)算擴(kuò)縮副本數(shù),取最大值進(jìn)行擴(kuò)縮。
- 擴(kuò)容
HPA 對(duì)象定義
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
spec:
behavior:
scaleDown:
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 10
periodSeconds: 60
stabilizationWindowSeconds: 300
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
HPA對(duì)象默認(rèn)行為
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 100
periodSeconds: 15
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
metrics-server api github
為集群提供監(jiān)控性能參考是必須的。
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
遇到問(wèn)題請(qǐng)參考 issue
一個(gè)nginx的演示實(shí)例
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx
namespace: lidj
spec:
maxReplicas: 10
metrics:
- resource:
name: cpu
target:
averageUtilization: 40
type: Utilization
type: Resource
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: lidj
spec:
type: NodePort
ports:
- name: "http"
port: 80
targetPort: 80
selector:
service: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: lidj
spec:
replicas: 1
selector:
matchLabels:
service: nginx
template:
metadata:
labels:
service: nginx
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
使用壓測(cè)工具ab進(jìn)行
ab -n 100000 -c 800 http://10.22.112.223:43434
查看現(xiàn)象
[root@shifeinode5 ~]# kubectl get pods,hpa -n lidj | grep nginx
pod/nginx-866f647cbc-97qp2 0/1 ContainerCreating 0 11s
pod/nginx-866f647cbc-hf65d 0/1 ContainerCreating 0 11s
pod/nginx-866f647cbc-hq6b7 1/1 Running 0 19h
pod/nginx-866f647cbc-kp6jq 1/1 Running 0 23h
horizontalpodautoscaler.autoscaling/nginx Deployment/nginx 97%/40% 2 20 2 23h
[root@shifeinode5 ~]# kubectl get pods,hpa -n lidj | grep nginx
pod/nginx-866f647cbc-5tlft 1/1 Running 0 22s
pod/nginx-866f647cbc-97qp2 1/1 Running 0 37s
pod/nginx-866f647cbc-bfc5f 0/1 ContainerCreating 0 22s
pod/nginx-866f647cbc-chl48 0/1 ContainerCreating 0 7s
pod/nginx-866f647cbc-dl4v8 1/1 Running 0 22s
pod/nginx-866f647cbc-hf65d 1/1 Running 0 37s
pod/nginx-866f647cbc-hq6b7 1/1 Running 0 19h
pod/nginx-866f647cbc-j5275 1/1 Running 0 22s
pod/nginx-866f647cbc-kp6jq 1/1 Running 0 23h
pod/nginx-866f647cbc-v5gpc 0/1 ContainerCreating 0 7s
horizontalpodautoscaler.autoscaling/nginx Deployment/nginx 91%/40% 2 20 8 23h