引言
如何在资源紧缺的情况下,保证 Node 的稳定性,是 Kubelet 需要面对的一个重要的问题。尤其对于内存和磁盘这种不可压缩的资源,紧缺就相当于不稳定。
在kubelet启动作为参数或者在配置文件中配置
驱逐策略
Kubelet 能够监控资源消耗,来防止计算资源被耗尽。一旦出现资源紧缺的迹象,Kubelet 就会主动终止一或多个 Pod 的运行,以回收紧俏资源。当一个 Pod 被终止时,其中的容器会全部停止,Pod 状态会被置为 Failed。
驱逐信号
下文中提到了一些信号,kubelet 能够利用这些信号作为决策依据来触发驱逐行为。描述列中的内容来自于 Kubelet summary API。
驱逐信号 | 描述 |
---|---|
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 |
上面的每个信号都支持整数值或者百分比。百分比的分母部分就是各个信号的总量。kubelet 支持两种文件系统分区。
nodefs
:保存 kubelet 的卷和守护进程日志等。imagefs
:在容器运行时,用于保存镜像以及可写入层。
imagefs 是可选的。Kubelet 能够利用 cAdvisor 自动发现这些文件系统。Kubelet 不关注其他的文件系统。所有其他类型的配置,例如保存在独立文件系统的卷和日志,都不被支持。
因为磁盘压力已经被驱逐策略接管,因此未来将会停止对现有 垃圾收集 方式的支持。
驱逐阈(yù,音同“预”)值:
一旦超出阈值,就会触发 kubelet 进行资源回收的动作。阈值的定义方式如下:
上面的表格中列出了可用的 eviction-signal
.
仅有一个 operator
可用:<
quantity
需要符合 Kubernetes 中的描述方式。
例如如果一个 Node
有 10Gi
内存,我们希望在可用内存不足 1Gi
时进行驱逐,就可以选取下面的一种方式来定义驱逐阈值:
memory.available<10%
memory.available<1Gi
驱逐软阈值
软阈值需要和一个宽限期参数协同工作。当系统资源消耗达到软阈值时,这一状况的持续时间超过了宽限期之前,Kubelet 不会触发任何动作。如果没有定义宽限期,Kubelet 会拒绝启动。
另外还可以定义一个 Pod 结束的宽限期。如果定义了这一宽限期,那么 Kubelet 会使用pod.Spec.TerminationGracePeriodSeconds
和最大宽限期这两个值之间较小的那个(进行宽限),如果没有指定的话,kubelet 会不留宽限立即杀死 Pod。
软阈值的定义包括以下几个参数:
eviction-soft
:描述一套驱逐阈值(例如 memory.available<1.5Gi
),如果满足这一条件的持续时间超过宽限期,就会触发对 Pod 的驱逐动作。
eviction-soft-grace-period
:包含一套驱逐宽限期(例如 memory.available=1m30s
),用于定义达到软阈值之后,持续时间超过多久才进行驱逐。
eviction-max-pod-grace-period
:在因为达到软阈值之后,到驱逐一个 Pod 之前的最大宽限时间(单位是秒),
驱逐硬阈值
硬阈值没有宽限期,如果达到了硬阈值,kubelet 会立即杀掉 Pod 并进行资源回收。
硬阈值的定义:
eviction-hard
:描述一系列的驱逐阈值(比如说 memory.available<1Gi
),一旦达到这一阈值,就会触发对 Pod 的驱逐,缺省的硬阈值定义是:
–eviction-hard=memory.available<100Mi
驱逐监控频率
Housekeeping interval
参数定义一个时间间隔,Kubelet 每隔这一段就会对驱逐阈值进行评估。
housekeeping-interval
:容器检查的时间间隔。
节点状况
Kubelet 会把驱逐信号跟节点状况对应起来。
如果触发了硬阈值,或者符合软阈值的时间持续了与其对应的宽限期,Kubelet 就会认为当前节点压力太大,下面的节点状态定义描述了这种对应关系。