Kubernetes (一)POD驱逐
一、kubernetes中的资源分类
Kubernetes根据资源能否伸缩进行分类,划分为可压缩资源和不可以压缩资源2种
1、可压缩资源:可压缩资源不足时,Pod 只会“饥饿”,但不会退出,例如:CPU
2、不可压缩资源:当不可压缩资源不足时,Pod 就会因为 OOM(Out-Of-Memory)被内核杀掉,例如:内存和磁盘
二、QoS模型
1、POD的服务质量模型有3种,分别是Guaranteed、Burstable和BestEffort。
1)Guaranteed
POD中的所有容器都必须同时设置了内存和CPU的requests和limit,且两者的值相同
注:只设置了limits时,Kubernetes 会自动为requests设置与 limits 相同的值,此时也是属于Guaranteed
2)Burstable
如果满足下面条件,将会指定 Pod 的 QoS 类为 Burstable:
- Pod 不符合 Guaranteed QoS 类的标准。
- Pod 中至少一个容器具有内存或 CPU 请求。
3)BestEffort:Pod 中的所有容器必须都没有设置CPU和内存的requests 和 limits
2、QoS模型的优先级
从低到高:Best-Effort pods < Burstable pods < Guaranteed pods
3、不同的QoS模型,其oom_score_adj的取值不一样
kubelet基于pod的QoS模型为每个容器设置一个oom_score_adj值
1)Guaranteed:-998
2)BestEffort:1000
3)Burstable:2-999
三、驱逐
1、驱逐信号
k8s中有5种驱逐信号,分别如下:
- memory.available:可用内存
- nodefs.available:可用磁盘空间
- nodefs.inodesFree:可用磁盘inode
- imagefs.available:可用镜像空间
- imagefs.inodesFree:可用镜像inode
2、驱逐阈值
当节点上的剩余资源低于驱逐阈值时,将出发POD的驱逐操作,驱逐阈值分为软驱逐阈值和硬驱逐阈值。
1)软驱逐阈值
软驱逐阈值使用一对由驱逐阈值和管理员必须指定的宽限期组成的配置对。
在超过宽限期前,kubelet不会采取任何动作回收和驱逐信号关联的资源
--eviction-soft=
--eviction-soft-grace-period
--eviction-max-pod-grace-period
2)硬驱逐阈值
硬驱逐阈值没有宽限期,一旦察觉,kubelet将立即采取行动回收关联的短缺资源
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
默认硬驱逐阈值
memory.available<100Mi nodefs.available<10% nodefs.inodesFree<5% imagefs.available<15%
3、最小驱逐回收
kubelet将尝试至少回收驱逐阈值之下 minimum-reclaim 数量的资源
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi --eviction-minimum-reclaim="memory.available=500Mi,nodefs.available=500Mi,imagefs.available=2Gi"`
如果 memory.available 驱逐阈值被触发,kubelet 将保证 memory.available 至少为 500Mi。
对于 nodefs.available,kubelet 将保证 nodefs.available 至少为 1.5Gi。
对于 imagefs.available,kubelet 将保证 imagefs.available 至少为 102Gi, 直到不再有相关资源报告压力为止。
所有资源的默认 eviction-minimum-reclaim 值为 0
4、驱逐监控时间间隔
housekeeping-interval 是容器管理时间间隔,kubelet 根据其配置的整理时间间隔计算驱逐阈值
四、节点
1、节点状态
kubelet 会将一个或多个驱逐信号映射到对应的节点状态。如果满足硬驱逐阈值,或者满足独立于其关联宽限期的软驱逐阈值时,kubelet将报告节点处于压力下的状态
- MemoryPressure状态:对应阈值信号memory.available,此状态新的BestEffort Pod不会被调度到该节点
- DiskPressure状态:对应阈值信号nodefs.available, nodefs.inodesFree, imagefs.available, 或 imagefs.inodesFree,此状态没有新的Pod会被调度到该节点
kubelet 将以 --node-status-update-frequency 指定的频率连续报告节点状态更新,其默认值为 10s。
2、节点状态震荡
eviction-pressure-transition-period 是 kubelet 从压力状态中退出之前必须等待的时长。
kubelet 将确保在设定的时间段内没有发现和指定压力条件相对应的驱逐阈值被满足时,才会将状态变回 false。
五、资源回收
kubernetes对于节点上的资源回收可以总结为3总方式
1)容器资源使用超过limit限制
如果pod进程因使用超过预先设定的limites而非Node资源紧张情况,系统倾向于在其原所在的机器上重启该container或本机或其他重新创建一个pod, 即自动迁移服务。
2)节点资源使用超过驱逐阈值
当 Kubernetes 所管理的宿主机上不可压缩资源短缺时,就有可能触发驱逐。
驱逐发生的时候,kubelet 具体会挑选哪些 Pod 进行删除操作,就需要参考这些 Pod 的 QoS 类别了。
首当其冲的,自然是 BestEffort 类别的 Pod。
其次,是属于 Burstable 类别、并且发生“饥饿”的资源使用量已经超出了 requests 的 Pod。
最后,才是 Guaranteed 类别。并且,Kubernetes 会保证只有当 Guaranteed 类别的 Pod 的资源使用量超过了其 limits 的限制,或者宿主机本身正处于 Memory Pressure 状态时,Guaranteed 的 Pod 才可能被选中进行 Eviction 操作。
当然,对于同 QoS 类别的 Pod 来说,Kubernetes 还会根据 Pod 的优先级来进行进一步地排序和选择
3)触发OOM
如果 kubelet 在节点经历系统 OOM 之前无法回收内存,oom_killer 将基于它在节点上 使用的内存百分比算出一个 oom_score,并加上 oom_score_adj 得到容器的有效 oom_score,然后结束得分最高的容器。
每个容器的oom_score_adj值,是根据POD的QoS模型进行设置的。