• k8s驱逐篇(2)-kubelet节点压力驱逐


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

    kubelet节点压力驱逐

    kubelet监控集群节点的 CPU、内存、磁盘空间和文件系统的inode 等资源,根据kubelet启动参数中的驱逐策略配置,当这些资源中的一个或者多个达到特定的消耗水平,kubelet 可以主动地驱逐节点上一个或者多个pod,以回收资源,降低节点资源压力。

    基于kubernets v1.17.4

    1.什么时候发生驱逐

    kubelet结合以下数据项来做出驱逐决定:
    (1)驱逐信号;
    (2)驱逐策略;
    (3)驱逐监测间隔;

    1.1 驱逐信号

    节点上的memory、nodefs、pid等资源都有驱逐信号,kubelet通过将驱逐信号与驱逐策略进行比较来做出驱逐决定;

    驱逐信号列举如下:
    (1)memory.available
    (2)nodefs.available
    (3)nodefs.inodesFree
    (4)imagefs.available
    (5)imagefs.inodesFree
    (6)pid.available

    kubelet支持以下文件系统分区:
    (1)nodefs:节点的主要文件系统,用于本地磁盘卷、emptyDir、日志存储等。 例如,nodefs包含/var/lib/kubelet/
    (2)imagefs:可选文件系统,供容器运行时存储容器镜像和容器可写层。

    1.2 驱逐策略

    kubelet节点压力驱逐包括了两种,软驱逐和硬驱逐;

    软驱逐

    软驱逐机制表示,当node节点的memory、nodefs等资源达到一定的阈值后,需要持续观察一段时间(宽限期),如果期间该资源又恢复到低于阈值,则不进行pod的驱逐,若高于阈值持续了一段时间(宽限期),则触发pod的驱逐。

    kubelet软驱逐相关启动参数配置:
    (1)eviction-soft:一组软驱逐条件,如memory.available<1.5Gi,nodefs.available<500Mi, 如果驱逐条件持续时长超过对应的驱逐宽限期,则触发pod驱逐;
    (2)eviction-soft-grace-period:一组软驱逐宽限期,如memory.available=1m30s,nodefs.available=1m30s
    (3)eviction-max-pod-grace-period:pod被软驱逐时,停止pod中container的最大宽限期,默认值0,单位秒;

    硬驱逐

    硬驱逐策略没有宽限期,当达到硬驱逐条件时,kubelet会立即触发pod的驱逐,而不是优雅终止。

    kubelet硬驱逐相关启动参数配置:
    (1)eviction-hard:一组硬驱逐条件,如memory.available<1Mi,nodefs.available<1Mi,nodefs.inodesFree<1,kubelet的默认硬驱逐条件为memory.available<100Mi,nodefs.available<10%,imagefs.available<15%,nodefs.inodesFree<5%

    其他驱逐参数配置

    (1)最小驱逐回收--eviction-minimum-reclaim

    在某些情况下,驱逐pod只能回收少量的资源,这可能导致频繁满足驱逐条件而触发驱逐操作;

    为了解决上述问题,可以配置--eviction-minimum-reclaim参数,当因某个驱逐信号而触发驱逐,驱逐回收后的资源量不再满足驱逐条件后,会继续回收--eviction-minimum-reclaim参数配置的资源量;

    1.3 驱逐监测间隔

    如果某一次驱逐逻辑中没有驱逐pod,则会等待10s后再进行下一次的驱逐逻辑轮询调用;

    2.驱逐哪些pod

    2.1 内存资源

    对于因内存资源紧张而发生驱逐时,kubelet根据以下情况来确定pod的驱逐顺序:
    (1)pod的实际资源使用量是否超过其请求量,超过的优先被驱逐;
    (2)pod的优先级定义(pod.Spec.Priority),值越小越容易被驱逐;
    (3)pod实际资源使用量与其请求量的差值大小,差值越小,则越容易被驱逐;

    2.2 pid资源

    对于因pid资源紧张而发生驱逐时,kubelet根据以下情况来确定pod的驱逐顺序:
    (1)pod的优先级定义(pod.Spec.Priority),值越小越容易被驱逐;

    2.3 fs资源

    2.3.1 有专用imagefs文件系统

    对于因可用nodefs大小、nodefs inode资源紧张而发生驱逐时,kubelet根据以下情况来确定pod的驱逐顺序:
    (1)pod对于资源的实际使用(包括pod的本地卷与pod中所有容器的日志),实际使用量超过请求量的优先被驱逐;
    (2)pod对于资源的实际使用(包括pod的本地卷与pod中所有容器的日志)与其请求量之间的差值大小,差值越小,则越容易被驱逐;

    对于因可用imagefs大小、imagefs inode资源紧张而发生驱逐时,kubelet根据以下情况来确定pod的驱逐顺序:
    (1)pod容器可写层资源的实际使用,实际使用量超过请求量的优先被驱逐;
    (2)pod容器可写层资源的实际使用与其请求量之间的差值大小,差值越小,则越容易被驱逐;

    2.3.2 无专用imagefs文件系统

    对于因可用fs大小、inode资源紧张而发生驱逐时,kubelet根据以下情况来确定pod的驱逐顺序:
    (1)pod对于资源的实际使用(包括pod容器可写层、pod的本地卷与pod中所有容器的日志),实际使用量超过请求量的优先被驱逐;
    (2)pod对于资源的实际使用(包括pod容器可写层、pod的本地卷与pod中所有容器的日志)与其请求量之间的差值大小,差值越小,则越容易被驱逐;

    关于是否有专用imagefs文件系统的判断

    当nodefs(kubelet的根文件系统)与imagefs(docker镜像存储的文件系统)所在分区相同时,判断为无专用imagefs文件系统,否则判断为有专用imagefs文件系统;

    总结一下就是,nodefs是kubelet启动参数--root-dir目录所在分区,imagefs是docker安装目录所在的分区;

    3.怎么驱逐pod

    pod驱逐流程

    (1)根据kubelet启动参数配置,获取驱逐策略配置;
    (2)从cAdvisor、CRIRuntimes获取各种统计信息,如节点上各个资源的总量以及使用量情况、容器的资源声明及使用量情况等;
    (3)比对驱逐策略配置以及上述的各种资源统计信息,筛选出会触发驱逐的驱逐信号;
    (4)将上面筛选出来的驱逐信号做排序,将内存驱逐信号排在所有其他信号之前,并从排序后的结果中取出第一个驱逐信号;
    (5)主动尝试回收fs、inode资源,如果回收的资源足够,则直接return,不需要往下执行驱逐pod的逻辑;
    (6)根据最终筛选出来的那一个驱逐信号,使用对应的排序函数给pod列表进行排序;
    (7)遍历排序后的pod列表,尝试驱逐pod;

    几个注意点:
    (1)每次的驱逐流程,最多只驱逐一个pod;
    (2)一次驱逐流程完成后,如果本次流程有驱逐pod,则马上继续循环执行pod驱逐流程,如果本次驱逐流程没有驱逐pod,则等待10s后再循环执行pod驱逐流程;
    (3)驱逐pod,只是将pod.status.phase值更新为Failed,并附上驱逐reason:Evicted以及触发驱逐的详细信息,不会删除pod;而pod.status.phase值被更新为Failed后,replicaset controller会再次创建出新的pod调用到其他节点上,达到驱逐pod的效果;

    主动尝试回收fs、inode资源

    当因fs、inode资源紧张而需要驱逐pod时,会在驱逐pod之前,先尝试主动回收fs、inode资源;

    有专用imagefs文件系统

    对于因可用nodefs大小、nodefs inode资源紧张而发生驱逐时,不会触发主动回收fs、inode资源;

    对于因可用imagefs大小、imagefs inode资源紧张而发生驱逐时,会触发下列操作来主动回收fs、inode资源:
    (1)删除已停止的容器;
    (2)删除没有被使用的容器镜像;

    无专用imagefs文件系统

    对于因可用fs大小、fs inode资源紧张而发生驱逐时,会触发下列操作来主动回收fs、inode资源:
    (1)删除已停止的容器;
    (2)删除没有被使用的容器镜像;

    总结

    kubelet监控集群节点的 CPU、内存、磁盘空间和文件系统的inode 等资源,根据kubelet启动参数中的驱逐策略配置,当这些资源中的一个或者多个达到特定的消耗水平,kubelet 可以主动地驱逐节点上一个或者多个pod,以回收资源,降低节点资源压力。

    本篇文章从什么时候发生驱逐、驱逐哪些pod、怎么驱逐pod三个角度对kubelet节点压力驱逐进行了分析。

    下一篇将对kubelet节点压力驱逐做一下源码分析。

  • 相关阅读:
    JAVA设计模式6:代理模式,用于控制对目标对象的访问
    【算法训练-链表 四】【删除】:删除链表的倒数第N个节点、删除有序链表中的重复元素、删除有序链表中的重复元素II
    Spring Cloud Alibaba 整合 Nacos
    PostgreSQL - tutorial
    html_语义化标签
    Java基础接口
    前后端分离项目,vue+uni-app+php+mysql在线小说电子书阅读小程序系统设计与实现
    玩转亚马逊 AWS IoT(3): SpringBoot 2.7 集成 AWS IoT 服务
    行业洞察 | 小米发布人形机器人的AI技术
    AVR单片机开发3——定时器T0 查询方式
  • 原文地址:https://blog.csdn.net/qq_43479892/article/details/126318046