一、引導語
如果把整個雲環境比作一片海洋,kubernetes是管理成千上萬艘船隻的掌舵人,它管理的船員(容器)可能上千萬,每個船員都不一樣,總有幾個調皮搗蛋的,那麼kubernetes是怎麼管理這些容器的,如果一臺宿主機上某個容器突然資源佔用過高,kubernetes應該如何分配保證上面的核心應用可用,服務降級防止雪崩。帶着這些問題,咱們來一起看一下kubernetes是如何實現資源管理的。
二、Kubernetes中的Node Allocatable
1)概述
一個kubernetes集羣,默認情況下pod是使用節點中的全部資源,如果沒有給node分配足夠的資源,會出現這些pod與系統守護進程或kubelet進程等資源爭搶的問題,導致整個node節點資源短缺或不可用的情況。
在kubernetes中把資源分爲allocatable(宿主機上pods資源)、eviction-threshold(節點驅逐閾值)、system-reserved(節點資源預留值)、kube-reserved(kubernetes守護進程如kubelet等),node allocatable是kubernetes API中資源對象的一種,調度器會根據每個節點上node allocatable的使用情況分配pod,調度器不會超額申請過多的資源。結構圖如下所示:
一個集羣中某個節點的pod可分配量公式如下:
Allocatable = Node Capacity - (kube-reserved) - (system-reserved) - (eviction-threshold)
可以看到一個節點的pods可用資源需要排除kubernetes爲系統預留資源、kubelet守護進程、驅逐閾值這三部分的資源,剩下的就是這個節點真正可以爲pod所分配的資源。
2)pod的QoS
Kubernetes爲每個節點分配了可用資源,那麼每個pod的級別是相同的嗎?答案是否定的,kubernetes爲pod會分配不同級別的角色,像一個國王會分一等公民、二等公民、自由人,如果發生饑荒,比如資源短缺,kubernetes會先把資源分配給最優先的公民,保證它可用。Kubernetes中pod的級別具體劃分爲:Guaranteed、Burstable、BestEffort三種。
Guaranteed(一等公民):這類pod是有保證的,也是最優先的,在資源不足的情況下,kubernetes優先保證guaranteed格式的pod,驅逐低優先格式的pod保證高優先級的pod。
對於QoS 類爲Guaranteed的Pod:
·Pod 中的每個容器必須指定內存請求和內存限制,並且兩者要相等。
·Pod 中的每個容器必須指定 CPU 請求和 CPU 限制,並且兩者要相等。
上面的配置是包含一個容器的Pod配置文件。容器設置了內存請求和內存限制,值都是200MiB. 容器設置了CPU請求和CPU限制,值都是700 milliCPU
Burstable(二等公民):這類pod可能是比較常見的,它的級別高於BestEffort但低於Guaranteed.它儘量的節省資源同時也保證在資源不足的時候可以優先存活。
對於 QoS 類爲 Burstable的 Pod:
·Pod 不符合 Guaranteed QoS 類的標準。
·Pod 中至少一個容器具有內存或 CPU 請求。
上面的配置內存的limits和requests值不同。limit爲容器使用資源的最大值,request爲容器使用資源的最小值。
BestEffort(自由民):這類pod是級別最低的,它的定義是不對內存或者cpu做任何限制,在資源充足的情況下儘可能的使用資源,如果在資源不足的情況下,這類pod會優先被驅逐,保證其他高級別的pod存活。
可以在yaml中查看一臺宿主機上的某個pod的qos級別:
三、Cgroup原理與對Node Allocatable深入解析
1)cgroup概述
cgroup是control groups的縮寫,它是linux內核的特性,主要的作用是限制、計算和隔離進程的資源使用,包括cpu、內存、磁盤io、網絡等方面。
cgroup提供虛擬文件系統作爲進行分組管理和各個子系統設置的用戶接口,首先先了解一些cgourp的概念。
Task任務,在cgroup中task任務代表一個系統進程
Control group控制族羣,control group控制組主要是通過標準對進程的劃分,達到對進程的限定。
Hierarchy層級,control group可以通過hierarchy組成一個層級樹,下層cgourp繼承父節點的屬性。
Subsystem子系統,指定資源,比如cpu、內存等的資源調度控制器,負責cgourp下的資源控制功能。
如下圖所示,cpu和內存兩個子系統都有各自的層級結構,同時又通過task任務調用取得相互的聯繫。
圖片引用地址:
https://www.ibm.com/developerworks/cn/linux/1506_cgroup/img001.png
2)kubernetes上node節點的cgroup層級
在kubernetes中可以指定cgroup driver,支持'cgroupfs', 'systemd'這兩種驅動類型 ,默認是cgroupfs,可以在kubelet中通過——cgroup-driver參數進行更改。
在centos7中由之前的init系統過度到systemd系統,在系統的開機啓動後,會默認把systemd掛載到/sys/fs/cgroup中,可以通過systemd-cgls來查看系統的cgroup層級結構。
如下所示,一臺node節點的croup層級結構:
可以在上面的cgroup層級結構來回顧第一章節的kubernetes中Node Allocatable概念,可以看到:
·BestEffort、Burstable、Guaranteed(沒有命名)的父級cgroup爲kubepods cgroup
·kubepods和system.slice cgroup同級,並列在系統cgroup之下
·每個pod下也有屬於自己的cgroup和層級結構
可以使用systemd-cgtop命令來查看每個cgroup的資源佔用情況。
查看node節點中配置參數如下:
——enforce-node-allocatable=pods,kube-reserved,system-reserved
——kube-reserved-cgroup=/system.slice/kubelet.service
——system-reserved-cgroup=/system.slice
可以通過如下結構圖來說明kubernetes中Node Allocatable的croup關係
通過kubernetes使用cgroup對資源的限制,把一個node節點上哪些資源給system使用,哪些資源給kubelet等kubernetes組件使用,最後的資源給node節點上運行的pod.並且kubernetes會劃分pod不同的優先級,保證在資源不足的情況下可以讓核心pod穩定運行,通過驅逐優先級低的pod來保證node節點資源充足。
四、實驗驗證
1)技術中臺5.0.1資源限制
實驗環境iuap技術中臺版本 5.0.1
主節點172.20.58.115,資源池節點 172.20.58.229(內存32G)
在iuap技術中臺資源池裏可以看到172.20.58.229節點的資源使用情況
內存一共可以使用30.7G
查看kubelet參數設置
——kube-reserved=cpu=200m,memory=500Mi
——system-reserved=cpu=3000m,memory=8096Mi
——eviction-hard=memory.available<7000Mi
從參數中計算pod真實可用資源爲:32000Mi - 500Mi - 8096Mi - 7000Mi = 16404 Mi
也就是kubernetes中真正可以給pods分配的資源爲:系統內存總體內存 減去kubelet組件預留 、減去system預留、減去驅逐預留 ,約等於16G
使用kubectl describe也可以查看對應信息 真正給pod預留資源爲16G內存
可以看出,kubernetes通過Cgourp限制系統的資源使用情況,這也是容器的特性之一。