系列目录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