kubernetes之QoS資源管理

一、引導語

  如果把整個雲環境比作一片海洋,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限制系統的資源使用情況,這也是容器的特性之一。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章