本篇將介紹如何使用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
是上面表中定義的一個信號token -
operator
是一種期望的操作符,比如<
(小於號) -
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