摘要:它實現了中的橫向自動擴容。目前只支持針對使用度進行動態擴容。這個就是真正控制擴容的,其結構如下其中的是一個的引用,定義了自動擴容的配置允許的最大實例數,最小實例數,以及使用配額。這也是為了避免出現頻繁的擴容縮容。
最新一版的kubernetes release中我們看到了一個令人欣喜的特性:Autoscaling。它實現了replicationcontroller中pod的橫向自動擴容。以下是摘自官方文檔的相關內容:
自動擴容將通過一個新的resource(就像之前的pod,service等等)實現。目前只支持針對cpu使用度進行動態擴容。未來的版本中,將會實現基于另一個resource:metrics(這是說未來監控數據將會有一個更統一的展示?)
主要結構1.Scale subresource
Scale subresource是一個虛擬的resource,用來記錄擴容進度。其主要結構如下:
// represents a scaling request for a resource. type Scale struct { unversioned.TypeMeta api.ObjectMeta // defines the behavior of the scale. Spec ScaleSpec // current status of the scale. Status ScaleStatus } // describes the attributes of a scale subresource type ScaleSpec struct { // desired number of instances for the scaled object. Replicas int `json:"replicas,omitempty"` } // represents the current status of a scale subresource. type ScaleStatus struct { // actual number of observed instances of the scaled object. Replicas int `json:"replicas"` // label query over pods that should match the replicas count. Selector map[string]string `json:"selector,omitempty"` }
其中ScaleSpec.Replicas表示我們預定的集群實例數目標。ScaleStatus.Replicas表示當前實例數,ScaleStatus.Selector是一個選擇器,選擇對應的pods。
2.HorizontalPodAutoscaler
這個就是真正控制擴容的resource,其結構如下:
// configuration of a horizontal pod autoscaler. type HorizontalPodAutoscaler struct { unversioned.TypeMeta api.ObjectMeta // behavior of autoscaler. Spec HorizontalPodAutoscalerSpec // current information about the autoscaler. Status HorizontalPodAutoscalerStatus } // specification of a horizontal pod autoscaler. type HorizontalPodAutoscalerSpec struct { // reference to Scale subresource; horizontal pod autoscaler will learn the current resource // consumption from its status,and will set the desired number of pods by modifying its spec. ScaleRef SubresourceReference // lower limit for the number of pods that can be set by the autoscaler, default 1. MinReplicas *int // upper limit for the number of pods that can be set by the autoscaler. // It cannot be smaller than MinReplicas. MaxReplicas int // target average CPU utilization (represented as a percentage of requested CPU) over all the pods; // if not specified it defaults to the target CPU utilization at 80% of the requested resources. CPUUtilization *CPUTargetUtilization } type CPUTargetUtilization struct { // fraction of the requested CPU that should be utilized/used, // e.g. 70 means that 70% of the requested CPU should be in use. TargetPercentage int } // current status of a horizontal pod autoscaler type HorizontalPodAutoscalerStatus struct { // most recent generation observed by this autoscaler. ObservedGeneration *int64 // last time the HorizontalPodAutoscaler scaled the number of pods; // used by the autoscaler to control how often the number of pods is changed. LastScaleTime *unversioned.Time // current number of replicas of pods managed by this autoscaler. CurrentReplicas int // desired number of replicas of pods managed by this autoscaler. DesiredReplicas int // current average CPU utilization over all pods, represented as a percentage of requested CPU, // e.g. 70 means that an average pod is using now 70% of its requested CPU. CurrentCPUUtilizationPercentage *int }
其中的ScaleRef是一個Scale subresource的引用,MinReplicas, MaxReplicas and CPUUtilization定義了自動擴容的配置(允許的最大實例數,最小實例數,以及cpu使用配額)。
3.HorizontalPodAutoscalerList
用于記錄一個namespace下的所有HorizontalPodAutoscaler。本質上是一個結構數組。
官方文檔給出的并不是算法, 而是實現步驟,整個自動擴容的流程是:
1.通過podselector找到要擴容的集群
2.收集集群最近的cpu使用情況(CPU utilization)
3.對比在擴容條件里記錄的cpu限額(CPUUtilization)
4.調整實例數(必須要滿足不超過最大/最小實例數)
5.每隔30s做一次自動擴容的判斷(這個日后應該會成為一個擴容條件的參數)
CPU utilization的計算方法是用cpu usage(最近一分鐘的平均值,通過heapster可以直接獲取到)除以cpu request(這里cpu request就是我們在創建容器時制定的cpu使用核心數)得到一個平均值,這個平均值可以理解為:平均每個CPU核心的使用占比。未來k8s會開放一個api直接獲取heapster收集到的監控數據。
真正的算法是:
A.
TargetNumOfPods = ceil(sum(CurrentPodsCPUUtilization) / Target)
ceil()表示取大于或等于某數的最近一個整數
舉個栗子:
我們有一個集群實例數是3 pods。cpu限額,即Target是每個pod分配1.1核,當cpu的使用度CurrentPodsCPUUtilization為1.1,1.4,1.3時,要擴容成多少個呢?
ceil((1.1+1.4+1.3)/1.1)= 4
所以擴容成四個實例。
B.
由于啟動實例時cpu的使用度會陡增,所以自動擴容會等待一段時間以收集準確的運行時監控數據。每次擴容/縮容后冷卻三分鐘才能再度進行擴容,而縮容則要等5分鐘后。這是因為自動擴容使用保守的方法,盡可能滿足pods業務的正常使用,所以擴容的優先級要大于縮容。
C.
當滿足:
avg(CurrentPodsConsumption) / Target >1.1 或 <0.9
時才會觸發進行擴容/縮容。這也是為了避免出現頻繁的擴容縮容。
為了方便使用,建議采用相對(relative)的度量標準(如 90%的cpu資源)而不是絕對的標準(如0.6個cpu核心)來描述擴容條件。否則,當用戶修改pods的請求資源時還需要去修改這些絕對值。比如:我們創建一個集群時,podtemplate中的resource里填入了cpu為1,即最多分配一個cpu核心給該pod,如果在擴容條件中采用絕對標準,我們必須填一個小于1的數,否則這個條件根本不會被觸發。而當我們要修改分配的資源為0.8個核心時,又必須要修改擴容條件以確保其小于0.8。這就很麻煩了。
kubectl中的支持以及待支持為了方便使用,在kubectl的cmd命令中加入了 creating/updating/deleting/listing 命令用來操作HorizontalPodAutoscaler
未來可能會加入像kubectl autoscale這樣的命令,對一個已經在跑的集群實時進行動態擴容。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32423.html
摘要:月日,首期沙龍海量運維實踐大曝光在騰訊大廈圓滿舉行。織云高效的實踐是,它是以運維標準化為基石,以為核心的自動化運維平臺。 作者丨周小軍,騰訊SNG資深運維工程師,負責社交產品分布式存儲的運維及團隊管理工作。對互聯網網站架構、數據中心、云計算及自動化運維等領域有深入研究和理解。 12月16日,首期沙龍海量運維實踐大曝光在騰訊大廈圓滿舉行。沙龍出品人騰訊運維技術總監、復旦大學客座講師、De...
摘要:彈性伸縮是指在業務需求增長時自動增加計算資源虛擬機以保證計算能力,在業務需求下降時自動減少計算資源以節省成本同時可結合負載均衡及健康檢查機制,滿足請求量波動和業務量穩定的場景。彈性伸縮(Auto Scaling)是指在業務需求增長時自動增加計算資源(虛擬機)以保證計算能力,在業務需求下降時自動減少計算資源以節省成本;同時可結合負載均衡及健康檢查機制,滿足請求量波動和業務量穩定的場景。用戶可通...
摘要:全面支持后端服務的高可用調整優化后端服務組件個中等級別以上的修復云幫社區版迎來了年月升級版本,我們優化了云幫的安裝部署流程,全面支持后端服務的高可用,改進了相關提示信息文案,完善了平臺日志模塊,升級了部分核心組件版本。 全面支持后端服務的高可用、調整優化后端服務組件、4個中等級別以上的bug修復、云幫社區版迎來了2017年5月升級版本,我們優化了云幫的安裝部署流程,全面支持后端服務的高...
摘要:本文中,我們將描述系統的架構開發演進過程,以及背后的驅動原因。應用管理層提供基本的部署和路由,包括自愈能力彈性擴容服務發現負載均衡和流量路由。 帶你了解Kubernetes架構的設計意圖、Kubernetes系統的架構開發演進過程,以及背后的驅動原因。 showImg(https://segmentfault.com/img/remote/1460000016446636?w=1280...
閱讀 1571·2021-09-24 10:38
閱讀 1498·2021-09-22 15:15
閱讀 3059·2021-09-09 09:33
閱讀 905·2019-08-30 11:08
閱讀 638·2019-08-30 10:52
閱讀 1253·2019-08-30 10:52
閱讀 2344·2019-08-28 18:01
閱讀 520·2019-08-28 17:55