kubernetes调度之资源耗尽处理配置

系列目录html

本篇将介绍如何使用kubelet处理资源耗尽的状况node

当可用的计算机资源很是低的时候,kubelet仍然要保证节点的稳定性.当处理不可压缩的计算机资源(好比内存或磁盘空间)时,这尤为重要,当这些资源被耗尽时,节点将变得不稳定spa

驱离策略

kubelet会积极的监视并阻止可用计算机资源耗尽.这种状况下,kubelet会终止一个或者多个pod来从新取回耗尽的资源,当kubelet终止一个pod时,它将会终止pod的全部容器并把PodPhase设置为Failedcode

驱离信号

kubelet支持基于下面列表中描述的驱离信号的驱离策略.每个信号值都由后面description列来描述,而且它们是基于kubelet的summary APIhtm

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存放到filesystemnot 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
相关文章
相关标签/搜索