Horizontal Pod Autoscaler是K8s提供的一種可以自動伸縮(Auto Scaling)的工具, 它可以從資源指標API和自定義指標API中獲取指標數據再依照Pod的負載進行Deployment的伸縮擴展, 目的是為了讓觀察到的CPU利用率和用戶期望的目標相近;HPA是一個control loop的實現, 預設的週期為30秒, 可由controller-manager的 horizontal-pod-autoscaler-sync-period來定義。
HPA Controller 透過metrics-server請求查看核心指標, 像是CPU和Memory的資源相關數據, 也透過k9s-prometheus-adapter等自定義API指標來取得相關的指標數據。
HPA YAML由 apiVersion
, kind
, metadata
, spec
組成
spec包含以下字段:
* minReplicas
: 自動伸縮仍須保有的最小Pod數
* maxReplicas
: 自動伸縮可以擴展的的最大Pod數
* scaleTargetRef
: 要縮放的目標, 目標的spec只少會包含apiVersopn
, kind
, spec
* metrics
<[]object>: 用來計算所需Pod數的指標列表
* external
: 引用不屬於任何對象的全局指標
* object
: 引用描述cluster中單一對象的特定指標
* pods
: 引用當前被自動伸縮的Pod對象的特定指標
* resource
: 引用資源指標, 即當前被自動伸縮的Pod對象容器中的requests 和 limits 定義的指標
* type
: 指標的類型, 可選Objects
, Pods
或 Resource
部署YAML
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: myapp
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
targetAverageUtilization: 50
- type: Resource
resource:
name: memory
targetAverageValue: 50Mi
查看結果
-> % kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
myapp Deployment/myapp <unknown>/50Mi, <unknown>/50% 2 10 0 13s
為了避免忽大忽小的流量造成Pod會重複開關,HPA在異動Pod的時候都很慢。
中秋連假,吃肉喝酒之前要記得先準備好文章再喝醉喔!