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节点压力驱逐做一下源码分析。

k8s驱逐篇(2)-kubelet节点压力驱逐的更多相关文章

  1. k8s驱逐篇(3)-kubelet节点压力驱逐-源码分析篇

    kubelet节点压力驱逐-概述 kubelet监控集群节点的 CPU.内存.磁盘空间和文件系统的inode 等资源,根据kubelet启动参数中的驱逐策略配置,当这些资源中的一个或者多个达到特定的消 ...

  2. k8s驱逐篇(4)-kube-scheduler抢占调度驱逐

    介绍kube-scheduler抢占调度驱逐之前,先简单的介绍下kube-scheduler组件: kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件 ...

  3. Kubernetes调整Node节点快速驱逐pod的时间

    在高可用的k8s集群中,当Node节点挂掉,kubelet无法提供工作的时候,pod将会自动调度到其他的节点上去,而调度到节点上的时间需要我们慎重考量,因为它决定了生产的稳定性.可靠性,更快的迁移可以 ...

  4. [k8s]k8s的控制层kubelet+docker配合调度机制(k8架构)

    意外停掉一台node的kubelet,发现调度有问题,研究了下调度的细节 k8s架构 控制层- kubelet(配合节点docker工作) 数据层- kube-proxy 逻辑图: object 参考 ...

  5. docker+k8s基础篇二

    Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...

  6. k8s之list-watch机制、节点调度以及亲和性

    k8s之list-watch机制.节点调度以及亲和性 目录 k8s之list-watch机制.节点调度以及亲和性 一.list-watch机制 1. list-watch介绍 2. list-watc ...

  7. docker+k8s基础篇四

    Docker+K8s基础篇(四) pod控制器 A:pod控制器类型 ReplicaSet控制器 A:ReplicaSet控制器介绍 B:ReplicaSet控制器的使用 Deployment控制器 ...

  8. docker+k8s基础篇三

    Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...

  9. suse 12 二进制部署 Kubernetets 1.19.7 - 番外篇 - 增加node节点

    文章目录 0.前景提要 1.准备node节点环境 1.0.修改配置脚本参数 1.1.配置免密 1.2.添加hosts解析 1.3.修改主机名 1.4.更新PATH变量 1.5.安装依赖包 1.6.关闭 ...

随机推荐

  1. 【单片机】CH32V103v8t6开发板调试笔记

    一.开发板样式和资源 找官网的商务申请了一块开发板,打算试一下串口打印程序测试,发现网上关于这个板子的相关资料特别少,为方便后来人,就顺便记录一下,板子资源如下图所示. 板子芯片的引脚排布图 二.使用 ...

  2. 差分隐私(Differential Privacy)定义及其理解

    1 前置知识 本部分只对相关概念做服务于差分隐私介绍的简单介绍,并非细致全面的介绍. 1.1 随机化算法 随机化算法指,对于特定输入,该算法的输出不是固定值,而是服从某一分布. 单纯形(simplex ...

  3. Nastran的应变方向

    问题 近日使用Nastran做一个算例,在计算频响时发现:位移场是连续的,而应变场不连续.以某一频率处应变场为例,其上表面X.Y方向应变场分布如下图.此处关闭了云图的插值,所显示的为单元的应变,因此云 ...

  4. SQL server设置连接数

    SQLServer查看及设置最大连接数   很多时候自己本地开发会遇到 ,打开几个连接正常访问 之后就报错误,这时候需要调整sqlserver 最大连接数. 1. 查询最大连接数 SELECT val ...

  5. C语言学习之我见-memchr()内存查找字符函数

    memchr()内存查找字符函数:主要用于从内存中查找自己需要的字符位置. (1)函数原型: void *memchr(const void *_Buf ,int _Val,size_t _MaxCo ...

  6. JS:函数的几种写法1

    1.构造函数: var fn = new function(); 2.声明式: function fn(){}; 3.匿名函数(又称自调用函数): (function(){})(); 4.表达式: v ...

  7. 重学ES系列之模版字符串

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Vue回炉重造之封装防刷新考试倒计时组件

    <!-- 考试倒计时组件 --> <template> <div class="time"> <p>00:{{timerCount2 ...

  9. python+requests+yaml实现接口自动化用例

    前言:最近也思考了一下怎么做接口自动化,以下内容属于自己目前阶段所学习到的内容,也逐渐投入自己实际工作中,把最近的学习新得跟大家分享下,话不多说,切入正题. 对接口自动化测试用例的思考:接口测试大多测 ...

  10. Python实现循环的最快方式,for和while到底谁更强

    写在前面的一些P话: 大家都知道,效率不管是对于工作还是学习都是十分重要的.当然,Python也是需要效率的.众所周知,Python 不是一种执行效率较高的语言.此外在任何语言中,循环都是一种非常消耗 ...