一、kubernetes中的資源分類
Kubernetes根據資源能否伸縮進行分類,划分為可壓縮資源和不可以壓縮資源2種
1、可壓縮資源:可壓縮資源不足時,Pod 只會“飢餓”,但不會退出,例如:CPU
2、不可壓縮資源:當不可壓縮資源不足時,Pod 就會因為 OOM(Out-Of-Memory)被內核殺掉,例如:內存和磁盤
二、QoS模型
1、POD的服務質量模型有3種,分別是Guaranteed、Burstable和BestEffort。
1)Guaranteed
POD中的所有容器都必須同時設置了內存和CPU的requests和limit,且兩者的值相同
注:只設置了limits時,Kubernetes 會自動為requests設置與 limits 相同的值,此時也是屬於Guaranteed
2)Burstable
如果滿足下面條件,將會指定 Pod 的 QoS 類為 Burstable:
- Pod 不符合 Guaranteed QoS 類的標准。
- Pod 中至少一個容器具有內存或 CPU 請求。
3)BestEffort:Pod 中的所有容器必須都沒有設置CPU和內存的requests 和 limits
2、QoS模型的優先級
從低到高:Best-Effort pods < Burstable pods < Guaranteed pods
3、不同的QoS模型,其oom_score_adj的取值不一樣
kubelet基於pod的QoS模型為每個容器設置一個oom_score_adj值
1)Guaranteed:-998
2)BestEffort:1000
3)Burstable:2-999
三、驅逐
1、驅逐信號
k8s中有5種驅逐信號,分別如下:
- memory.available:可用內存
- nodefs.available:可用磁盤空間
- nodefs.inodesFree:可用磁盤inode
- imagefs.available:可用鏡像空間
- imagefs.inodesFree:可用鏡像inode
2、驅逐閾值
當節點上的剩余資源低於驅逐閾值時,將出發POD的驅逐操作,驅逐閾值分為軟驅逐閾值和硬驅逐閾值。
1)軟驅逐閾值
軟驅逐閾值使用一對由驅逐閾值和管理員必須指定的寬限期組成的配置對。
在超過寬限期前,kubelet不會采取任何動作回收和驅逐信號關聯的資源
--eviction-soft=
--eviction-soft-grace-period
--eviction-max-pod-grace-period
2)硬驅逐閾值
硬驅逐閾值沒有寬限期,一旦察覺,kubelet將立即采取行動回收關聯的短缺資源
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
默認硬驅逐閾值
memory.available<100Mi nodefs.available<10% nodefs.inodesFree<5% imagefs.available<15%
3、最小驅逐回收
kubelet將嘗試至少回收驅逐閾值之下 minimum-reclaim 數量的資源
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi --eviction-minimum-reclaim="memory.available=500Mi,nodefs.available=500Mi,imagefs.available=2Gi"`
如果 memory.available 驅逐閾值被觸發,kubelet 將保證 memory.available 至少為 500Mi。
對於 nodefs.available,kubelet 將保證 nodefs.available 至少為 1.5Gi。
對於 imagefs.available,kubelet 將保證 imagefs.available 至少為 102Gi, 直到不再有相關資源報告壓力為止。
所有資源的默認 eviction-minimum-reclaim 值為 0
4、驅逐監控時間間隔
housekeeping-interval 是容器管理時間間隔,kubelet 根據其配置的整理時間間隔計算驅逐閾值
四、節點
1、節點狀態
kubelet 會將一個或多個驅逐信號映射到對應的節點狀態。如果滿足硬驅逐閾值,或者滿足獨立於其關聯寬限期的軟驅逐閾值時,kubelet將報告節點處於壓力下的狀態
- MemoryPressure狀態:對應閾值信號memory.available,此狀態新的BestEffort Pod不會被調度到該節點
- DiskPressure狀態:對應閾值信號nodefs.available, nodefs.inodesFree, imagefs.available, 或 imagefs.inodesFree,此狀態沒有新的Pod會被調度到該節點
kubelet 將以 --node-status-update-frequency 指定的頻率連續報告節點狀態更新,其默認值為 10s。
2、節點狀態震盪
eviction-pressure-transition-period 是 kubelet 從壓力狀態中退出之前必須等待的時長。
kubelet 將確保在設定的時間段內沒有發現和指定壓力條件相對應的驅逐閾值被滿足時,才會將狀態變回 false。
五、資源回收
kubernetes對於節點上的資源回收可以總結為3總方式
1)容器資源使用超過limit限制
如果pod進程因使用超過預先設定的limites而非Node資源緊張情況,系統傾向於在其原所在的機器上重啟該container或本機或其他重新創建一個pod, 即自動遷移服務。
2)節點資源使用超過驅逐閾值
當 Kubernetes 所管理的宿主機上不可壓縮資源短缺時,就有可能觸發驅逐。
驅逐發生的時候,kubelet 具體會挑選哪些 Pod 進行刪除操作,就需要參考這些 Pod 的 QoS 類別了。
首當其沖的,自然是 BestEffort 類別的 Pod。
其次,是屬於 Burstable 類別、並且發生“飢餓”的資源使用量已經超出了 requests 的 Pod。
最后,才是 Guaranteed 類別。並且,Kubernetes 會保證只有當 Guaranteed 類別的 Pod 的資源使用量超過了其 limits 的限制,或者宿主機本身正處於 Memory Pressure 狀態時,Guaranteed 的 Pod 才可能被選中進行 Eviction 操作。
當然,對於同 QoS 類別的 Pod 來說,Kubernetes 還會根據 Pod 的優先級來進行進一步地排序和選擇
3)觸發OOM
如果 kubelet 在節點經歷系統 OOM 之前無法回收內存,oom_killer 將基於它在節點上 使用的內存百分比算出一個 oom_score,並加上 oom_score_adj 得到容器的有效 oom_score,然后結束得分最高的容器。
每個容器的oom_score_adj值,是根據POD的QoS模型進行設置的。