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
是上面表中定义的一个信号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