一、概述
在可用计算资源较少时,kubelet为保证节点稳定性,会主动地结束一个或多个pod以回收短缺地资源,这在处理内存和磁盘这种不可压缩资源时,驱逐pod回收资源的策略,显得尤为重要。下面来具体研究下Kubelet Eviction Policy的工作机制。
- kubelet预先监控本节点的资源使用,防止资源被耗尽,保证节点稳定性。
- kubelet会预先Fail N(>=1)个Pod,以回收出现紧缺的资源。
- kubelet在Fail一个pod时,kill掉pod内所有container,并设置pod.status.phase = Failed。
- kubelet按照事先设定好的Eviction Threshold来触发驱逐动作,实现资源回收。
1.1 驱逐信号
在源码pkg/kubelet/eviction/api/types.go
中定义了以下及几种Eviction Signals:
Eviction Signal | Description |
---|---|
memory.available | := node.status.capacity[memory] - node.stats.memory.workingSet |
nodefs.available | := node.stats.fs.available |
nodefs.inodesFree | := node.stats.fs.inodesFree |
imagefs.available | := node.stats.runtime.imagefs.available |
imagefs.inodesFree | := node.stats.runtime.imagefs.inodesFree |
allocatableMemory.available | := pod.allocatable - pod.workingSet |
pid.available | := node.MaxPID - node.NumOfRunningProcesses |
上表主要涉及三个方面,memory、file system和pid。其中kubelet值支持2种文件系统分区:
- nodefs:kubelet用来存储volume和daemon logs等
- imagesfs:容器运行时(docker等)用来保存镜像和容器的writable layer
1.2 驱逐阈值
kubelet的入参接收用户定义的eviction signal和eviction threshold的映射关系,格式如下:
[eviction-signal] [opterator] [quantity]
- 支持的signal如上表所示ÿ