总结
Eviction与OOM
1、eviction是指kubelet对该节点上的Pod进行驱逐,OOM是指cgroup对进程进行kill
2、kubelet对Pod进行驱逐时,是根据--eviction-hard
参数;比如该参数如果设置了memory.available<20%
,那么当主机的内存使用率达到80%时,kubelet便会对Pod进行驱逐。但是,--eviction-hard=memory.available<20%
不会对/sys/fs/cgroup/memory/kubepods/memory.limit_in_bytes
的值产生影响,因为kubepods/memory.limit_in_bytes = capacity - kube-reserved - system-reserved
,换句话说,Pod的内存使用量总和是可以超过80%的,且不会被OOM-kill,只会被eviction。
3、kubernetes对Pod的驱逐机制如下:(1)首先驱逐没有设置资源限制的Pod(2)然后驱逐资源上限和资源下限不一样的Pod(3)最后驱逐资源上限等资源下限的Pod (4)注意,这里说的资源,是指Pod中设置的cpu与内存
imagefs与nodefs
1、imagefs为docker安装目录所在分区,nodefs为kubelet的参数--root-dir
指定目录所在的分区
2、Pod使用的inode可以超过阈值,当节点的inode使用率达到阈值时,kubernetes会对pod进行驱逐,直到inode使用率低于阈值为止。由于单个Pod不能设置inode的使用量,所以驱逐Pod的时候,不是根据Pod的inode使用量来驱逐。
建议的参数配置
说明:--system-reserved
参数中不能设置百分比,所以上面的cpu=xx
中的xx要用绝对值表示。一般为系统预留20%的cpu,比如总CPU为10,则xx为2。
上面配置的效果:
1、当主机上总的内存使用率达到80%时,kubelet开始对Pod进行驱逐(不是OOM-Kill)
2、当主机上imagefs与nodefs的使用率达到80%时,kubelet开始对Pod进行驱逐
3、当主机上所有Pod的cpu使用率之和达到80%时,cgroup会对某个Pod中的进程进行Kill(不是驱逐),至于kill哪一个进程,机制还不清楚
Last updated
Was this helpful?