HPA Controller 介紹
關於Kubernetes Horizontal Pod Autoscaler(簡稱HPA)的概念和使用介紹,請參考以下官方文檔鏈接,在這裏我不再贅述。
- https://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/
- https://github.com/kubernetes/community/blob/master/contributors/design-proposals/horizontal-pod-autoscaler.md
- https://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/walkthrough/
- http://blog.kubernetes.io/2016/07/autoscaling-in-kubernetes.html
- http://markswanderingthoughts.nl/post/148836326495/building-your-own-horizontal-pod-autoscaler-for
HPA Controller 工作原理
- K8s通過HPA,基於獲取到的metrics(CPU utilization, custom metrics) value,對rc, deployment管理的pods進行自動伸縮。
截止到Kubernetes 1.6,Release特性中僅支持CPU utilization這一
resource metrics
,對custom metrics
的支持目前仍在alpha階段,請知曉。
HPA Controller週期性(默認每30s一次,可通過kube-controller-manager的flag
--horizontal-pod-autoscaler-sync-period
進行設置)的調整對應的rc, deployment中的replicas數量,使得指定的metrics value能匹配用戶指定的target utilization value。在每個HPA Controller的處理週期中,kube-controller-manager都去查詢HPA中定義的metrics的utilization。查詢方式根據metric類型不同而不同:
- 如果metric type是resource metrics,則通過resource metrics API查詢。
- 如果metric type屬於custom metrics,則通過custom metrics API查詢。
計算伸縮比例算法:
對於resource metrics,比如CPU,HPA Controller獲取HPA中指定的metrics,如果HPA中設定了target utilization,則HPA Controller會將獲取到的metrics除於對應的容器的resource request值作爲監測到的當前pod的resource utilization。如此計算完所有HPA對應的pods後,對該resource utilization values取平均值。最後將平均值除於定義的target utilization,得到伸縮的比例。
注意:如果HPA對應的某些pods中的容器沒有定義對應的resource request,則HPA不會對這些pods進行scale。
對於custome metrics,HPA Controller的伸縮算法幾乎與resource metrics一樣,不同的是:此時是根據custome metrics API查詢到的metrics value對比target metics value計算得到的,而不是通過utilization計算得到的。
HPA與rc, deployment, pod的關係如下圖所示。
- HPA通過Scale sub-resource接口,對RC和Deployment的replicas進行控制。
- HPA最終對Pod副本數的控制終歸還是通過RC和Deployment控制器。
HPA Controller有兩種方式獲取metrics:
- direct Heapster access: 用於對resource metrics的監控,需要提前在kube-system namespace中部署Heapster。
- REST client access: 用於對custom metrics的監控,需要設置kube-controller-manager的
--horizontal-pod-autoscaler-use-rest-clients
flag爲true。