本文原文出處:http://www.javashuo.com/article/p-bodjlnrv-ek.htmlmysql
彈性伸縮式k8s中的一大亮點功能,當負載大的時候,你能夠對應用進行擴容,提高pod的副本數來應對大量的流量,當負載小的時候能夠對應用進行縮容,以免資源浪費。也可讓應用自動的進行擴容和縮容,這一功能有用。例如當微博出現了一個話題時,這個時候人們都去訪問,此時他的服務器將沒法處理大量的流量訪問,這個時候就須要擴容,而當這個話題不在新鮮時,人們的訪問流量也就是降下來了,那麼就須要對服務器進行縮容處理,來自動適應流量需求。nginx
scale命令:擴容或縮容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod數量算法
# 語法 kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME) # 將名爲foo中的pod副本數設置爲3。 kubectl scale --replicas=3 rs/foo kubectl scale deploy/nginx --replicas=30 # 將由「foo.yaml」配置文件中指定的資源對象和名稱標識的Pod資源副本設爲3 kubectl scale --replicas=3 -f foo.yaml # 若是當前副本數爲2,則將其擴展至3。 kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 設置多個RC中Pod副本數量 kubectl scale --replicas=5 rc/foo rc/bar rc/baz
k8s提供了scale和autoscale來進行擴容和縮容。sql
如今對go-deployment進行擴容,結果如圖shell
當訪問量減小了就進行縮容 如今我不想手動的進行擴容和縮容了,我想實現讓它當訪問流量大的時候自動擴容,當訪問流量小的時候自動縮容。這個時候autoscale出現了,利用他咱們就能夠實現自動擴容和縮容。服務器
# 語法 kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags] # 使用 Deployment 「foo」設定,使用默認的自動伸縮策略,指定目標CPU使用率,使其Pod數量在2到10之間 kubectl autoscale deployment foo --min=2 --max=10 # 使用RC「foo」設定,使其Pod的數量介於1和5之間,CPU使用率維持在80% kubectl autoscale rc foo --max=5 --cpu-percent=80
到目前爲止,k8s一共提供了2個不一樣維度的AutoScaler。以下圖:架構
k8s把彈性伸縮分爲兩類:app
對應兩種伸縮策略:oop
其中最爲成熟也是最爲經常使用的伸縮策略就是HPA(水平Pod伸縮),因此下面以它爲例來重點分析,官方文檔在此:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/post
縮容擴容的基本流程爲三大步驟:
1.採集監控指標
2.聚合監控指標,判斷是否須要執行縮擴容
3.執行縮容擴容操做
HPA水平縮容擴容架構圖
HPA的監控指標
根據官方文檔的描述,HPA是使用巡檢(Control Loop)的機制來採集Pod資源使用狀況的,默認採集間隔爲15s,能夠經過Controller Manager(Master節點上的一個進程)的--horizontal-pod-autoscaler-sync-period
參數來手動控制。
目前HPA默認採集指標的實現是Heapster
,它主要採集CPU的使用率;beta版本也支持自定義的監控指標採集,但尚不穩定,不推薦使用
所以能夠簡單認爲,HPA就是經過CPU的使用率做爲監控指標的。
聚合算法
採集到CPU指標後,k8s經過下面的公式來判斷須要擴容多少個pod
desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
ceil表示向上取整,舉個實際例子,假設某個服務運行了4個Pod,當前的CPU使用率爲50%,預期的CPU使用率爲25%,那麼知足預期的實際Pod數量就是4 * (50% / 25%) = 8
個,即須要將Pod容量擴大一倍,增長4個Pod來知足需求。
固然上述的指標並非絕對精確的,首先,k8s會盡量的讓指標往指望值靠近,而不是徹底相等,其次HPA設置了一個容忍度(tolerance)的概念,容許指標在必定範圍內偏離指望值,默認是0.1,這就意味着若是你設置調度策略爲CPU預期使用率 = 50%,實際的調度策略會是小於45%或者大於55%進行縮擴容,HPA會盡力把指標控制在這個範圍內(容忍度能夠經過--horizontal-pod-autoscaler-tolerance
來調整)
須要注意的是: