kubernetes排程之資源耗盡處理配置
系列目錄
本篇將介紹如何使用kubelet
處理資源耗盡的情況
當可用的計算機資源非常低的時候,kubelet仍然要保證節點的穩定性.當處理不可壓縮的計算機資源(比如記憶體或磁碟空間)時,這尤其重要,當這些資源被耗盡時,節點將變得不穩定
驅離策略
kubelet會積極的監視並阻止可用計算機資源耗盡.這種情況下,kubelet會終止一個或者多個pod來重新取回耗盡的資源,當kubelet終止一個pod時,它將會終止pod的所有容器並把PodPhase
設定為Failed
驅離訊號
kubelet支援基於下面列表中描述的驅離訊號的驅離策略.每一個訊號值都由後面description列來描述,並且它們是基於kubelet的summary API
Eviction Signal | Description |
---|---|
memory.available | memory.available := node.status.capacity[memory] - node.stats.memory.workingSet |
nodefs.available | nodefs.available := node.stats.fs.available |
nodefs.inodesFree | nodefs.inodesFree := node.stats.fs.inodesFree |
imagefs.available | imagefs.available := node.stats.runtime.imagefs.available |
imagefs.inodesFree | imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree |
以上的訊號同時支援字面量或者百分比值.百分比值根據每個訊號的總容量來計算
memory.available
的值從cgroup裡衍生出來,而不是通過free -m
,這一點很重要因為free -m
在容器裡是無效的
kubelet僅支援以下兩種檔案型別分割槽:
nodefs
檔案系統,kubelet用於儲存卷,守護程序log等imagefs
檔案系統,容器執行時用於儲存映象和容器的可寫層
imagefs
是可選的,kubelet使用cAdvisor來自動發現.kubelet並不關心其它檔案系統.其它型別的配置目前kubelet也不支援,比如把儲存卷和log存放到filesystem
not OK
的
驅離閾值
kubelet支援指定驅離閾值來來觸發kubelet回收資源
每一個閾值都是以下形式的:
[eviction-signal][operator][quantity]
eviction-signal
是上面表中定義的一個訊號tokenoperator
是一種期望的操作符,比如<
(小於號)quantity
驅離閾值的量,比如1Gi,驅離閾值也可以是由%
百分號表示的百分比值
比如說一個節點有10Gi總記憶體值,並且如果可用記憶體的值如果低於1Gi的時候你想要觸發驅離,你可以以如下兩種方式中的任一來定義驅離閾值
memory.available<10%
或memory.available<1Gi
但是你不能兩者同時使用.
軟碟機離閾值
軟碟機離閾值和一個包含管理員指定的優雅時間的驅離閾值成對出現.驅離訊號發出後,在優雅時間沒有超出之前,kubelet不會回收資源.如果不指定優雅時間,kubelet會在一開始就返回錯誤
此外,如果軟碟機離閾值被滿足,operator可以指定被驅離時最大允許的pod優雅終止時間.如果指定了,kubelet使用pod.Spec.TerminationGracePeriodSeconds
和最大允許的優雅終止時間兩者中較小的一個值.如果沒有指定,kubelet會馬上殺死pod
以下標識被用於支援軟碟機離閾值
eviction-soft
描述了一系列軟碟機離閾值.eviction-soft-grace-period
描述了一系列驅離時間,(比如memory.available=1m30s
),對應在驅離發生之前,軟體驅離閾值持續的時間eviction-max-pod-grace-period
描述了當軟碟機離閾值被滿足時,最大允許的優雅終止時間(單位是秒)
硬驅離閾值
硬驅離閾值沒有優雅時段,kubelet會立馬對相關的資源採取動作.如果硬驅離閾值被滿足,kubelet會立馬殺死pod,而沒有優雅終止時段.
以下標識可以被用於配置硬驅離閾值
memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%
驅離監視時間間隔
通過housekeeping-interval
節點狀態
kubelet把一個或多個驅離訊號對映到的對應的節點狀態上
如果硬驅離閾值被滿足,或者不依賴於優雅時段的軟碟機離閾值被滿足,kubelet會報告一種狀態來反映節點處於壓力之下
以下是節點狀態和特定驅離訊號間的關係
Node Condition | Eviction Signal | Description |
---|---|---|
MemoryPressure | memory.available | Available memory on the node has satisfied an eviction threshold |
DiskPressure | nodefs.available, nodefs.inodesFree, imagefs.available, or imagefs.inodesFree | Available disk space and inodes on either the node’s root filesystem or image filesystem has satisfied an eviction threshold |
kubelet會繼續以--node-status-update-frequency
指定的值(預設為10秒)來報告更新的節點狀態
回收節點級別的資源
如果驅離閾值被滿足並且優雅時段已過,kubelet開始啟動對處於壓力的資源的回收工作直到監測到壓力訊號已經消失並且低於定義的閾值
kubelete嘗試優先回收節點級別的資源而不是驅離pod.如果監測到磁碟壓力,如果節點有容器執行時專用的imagefs
,則kubelet回收資源的方式不同
驅離pod
如果kubelet無法在節點上回收到足夠的資源,則開始驅離pod.
kubelet首先會根據pod使用的資源是否超過了申請的資源,然後根據他們的優先順序把要驅離的pod進行排序.
最終kubelet按照以下列出的順序對要驅離的pod進行排序:
BestEffort
或者Burstable
型別pod