系列目錄html
本篇將介紹如何使用kubelet
處理資源耗盡的狀況node
當可用的計算機資源很是低的時候,kubelet仍然要保證節點的穩定性.當處理不可壓縮的計算機資源(好比內存或磁盤空間)時,這尤爲重要,當這些資源被耗盡時,節點將變得不穩定spa
kubelet會積極的監視並阻止可用計算機資源耗盡.這種狀況下,kubelet會終止一個或者多個pod來從新取回耗盡的資源,當kubelet終止一個pod時,它將會終止pod的全部容器並把PodPhase
設置爲Failed
code
kubelet支持基於下面列表中描述的驅離信號的驅離策略.每個信號值都由後面description列來描述,而且它們是基於kubelet的summary API
htm
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 |
以上的信號同時支持字面量或者百分比值.百分比值根據每一個信號的總容量來計算blog
memory.available
的值從cgroup裏衍生出來,而不是經過free -m
,這一點很重要由於free -m
在容器裏是無效的排序
kubelet僅支持如下兩種文件類型分區:token
nodefs
文件系統,kubelet用於存儲卷,守護進程log等進程
imagefs
文件系統,容器運行時用於存儲鏡像和容器的可寫層ip
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回收資源的方式不一樣
若是kubelet沒法在節點上回收到足夠的資源,則開始驅離pod.
kubelet首先會根據pod使用的資源是否超過了申請的資源,而後根據他們的優先級把要驅離的pod進行排序.
最終kubelet按照如下列出的順序對要驅離的pod進行排序:
BestEffort
或者Burstable
類型pod