kubernetes之node资源紧缺时pod驱逐机制

在系统硬件资源紧缺的情况下保证node的稳定性, 是kubelet需要解决的一个重要问题
1.驱逐策略
kubelet持续监控主机的资源使用情况, 一旦出现资源紧缺的迹象, kubelet就会主动终止一个或多个pod的运行,以回收紧缺的资源

2.驱逐信号
kubelet根据信号作为决策依据来触发驱逐行为

- memory.available
- nodefs.available
- nodefs.inodesFree
- imagefs.available
- imagefs.inodesFree
memory : 内存,不是根据系统的free 收集,取值来自于cgroupfs,free -m命令不支持在容器中工作
nodefs: 指node自身的存储,存储daemon的运行日志等,一般指root分区/;
imagefs: 指docker daemon用于存储image和容器可写层(writable layer)的磁盘;

3.驱逐阀值:一旦超过阀值, 就会触发kubelet进行资源回收
例:memory.available<10% 可用内存不足10%时进行驱逐

软驱逐: 当系统资源消耗达到软阀值, 有一段的宽限期, kubelet不会触发驱逐动作,

--eviction-soft=memory.available<1.5GiB                驱逐阀值
-eviction-soft-grace-period=memory.available=1m30s   驱逐宽限期

硬驱逐: 没有宽限期, 达到硬阀值, 直接触发对pod的驱逐操作

--eviction-hard=memory.available<1.5GiB  

4.驱逐监控频率

--housekeeping-interval  定义一个时间间隔, kubelet每隔一个时间间隔就会对驱逐阀值进行评估

5.节点资源紧张情况下的kubelet行为
node节点回收资源: 磁盘有压力的情况下回收资源方式:删除死掉的pod, 删除无用的镜像
如果通过删除上面的方式无法回收资源, 那么会进行驱逐用户的pod策略: 根据pod服务的服务质量qos(besteffort, burstable, guaranteed)

6.节点资源紧张情况下的系统行为

调度器行为: kubelet会向master报告这个情况, 调度器不再继续向节点调度新的pod
node的oom行为: kubelet根据pod的qos为每个容器设置了一个oom_score_adj 值, 得分最高的容器会被驱逐, 与pod驱逐不同, 一个pod容器被oom杀掉, 可能被kubelet根据restartpolicy重启
kubelet无法区分daemonset类型的pod, 所以不建议把daemonset的pod设置成besteffort类型

7.驱逐策略建议

保留10%的内存给系统守护进程(内核, kubelet, kube-proxy, flanneld) 防止进程资源不够
内存使用率达到95%立即进行pod驱逐防止系统的oom
以节点内存容量10G为例子
--eviction-hard=memory.avai lable<500Mi
--system-reserved=memroy=1.5Gi

8.主动驱逐保护:PodDisruptionBudget资源对象

当节点处于维护状态(kubectl drain),会马上驱逐节点上的pod, 需求是系统应该保证应用以不低于一定数量的pod保障服务的正常运行, 系统将确保每终止一个pod后, 一定会在另一台健康的node上启动新的pod, 再继续终止下一个pod

原文地址:https://www.cnblogs.com/lovelinux199075/p/11295764.html

时间: 2024-10-08 10:22:03

kubernetes之node资源紧缺时pod驱逐机制的相关文章

十四. k8s资源需求和限制, 以及pod驱逐策略

目录 容器的资源需求和资源限制 QoS Classes分类 Guaranteed Burstable Best-Effort kubernetes之node资源紧缺时pod驱逐机制 Qos Class优先级排名 可压缩资源与不可压缩资源 存储资源不足 举例 内存资源不足 举例 Node OOM (Out Of Memory) 总结 参考链接 容器的资源需求和资源限制 requests:需求,最低保障, 保证被调度的节点上至少有的资源配额 limits:限制,硬限制, 容器可以分配到的最大资源配额

Kubernetes Harbor等资源--secret和ServiceAccount配置

Kubernetes Harbor等资源--secret和ServiceAccount配置 ![]来啦,老弟########## 用途 secret对象类型主要目的是保存和处理敏感信息/私密数据.将这些信息放在secret对象中比 直接放在pod或docker image中更安全,也更方便使用.在一个已经创建好的secrets对象有两种方式被pod对象使用,其一,在container中的volume对象里以file的形式被使用,其二,在pull images时被kubelet使用. ######

Kubernetes安全三步谈:如何监控与控制Kubernetes中的资源消耗问题

或许很多人可能认为资源消耗并非安全问题,但实际上不合理的资源消耗会让黑客有可乘之机,来攻击K8s的组件.本文将介绍如何处理资源消耗或noisy neighbor问题,包括如何管理Pods中的资源以及管理项目和资源配额等. 本文是关于Kubernetes安全系列三篇文章中的最后一篇.在第一篇文章中,我们分享了如何确保企业的Kubernetes集群免受外部攻击:第二篇文章介绍了三种保护Kubernetes免受内部威胁的方法.在本文中,我们将介绍如何处理资源消耗或noisy neighbor问题. 对

扩展Kubernetes群集节点并手动扩充Pod

如果现有的资源已经不能满足应用程序的运行需求时,我们就需要扩充AKS的节点,以满足应用的需求.对于群集节点的扩充我们有两种方式: 横向扩展:横向扩展即为在保证当前现有节点的稳定运行的前提下向群集中添加新的节点,进而增加资源. 纵向扩展:纵向扩展即调整现有的虚拟机规格,纵向扩展时节点会被仔细封锁和排除,尽量避免对正在运行的应用程序造成中断. 纵向扩展时,AKS 会一直等待,直到节点被 Kubernetes 群集标记为 Ready,然后才在这些节点上计划 Pod.今天我们要和大家演示的是使用横向扩展

《资源革命:如何抓住一百年来最大的商机》:资源紧缺是一个巨大的商机,有许多创新的解决办法。三星推荐

作者认为当今世界正处在第三次工业革命过程中,第三次工业革命最重要的变化是发展中国家讲会有25亿人口从贫困走向中产,由此会给地球的资源带来巨大的压力,作者认为这同时也是百年以来的最大的商机. 全书基本在讲解决资源紧缺的商业模式上的创新. 作者认为解决资源紧缺可以有五个原则:寻找替代产品:消除浪费:提高资源的可循环性:提高使用效率:流程虚拟化.个人感觉这五个原则还可以概括为三个方面原则:开源,节流,替代. 以下是书中的一些观点或信息: 1:以前的两次工业革命,重点在提高劳动力和资本效率:现在正在进行

VC2010打开资源视图时提示“指南必须指定类型”,.rc资源文件损坏(转)

VC: 打开资源视图时提示“指南必须指定类型 ”(Guideline……specify type) ,.rc资源文件损坏 可能是TFS导致的 使用记事本打开.rc文件,找到“DESIGNINFO”节,会看到如下的数据:    BEGIN          , 50          , 13798327    END这就是错误原因. 解决方法:1. 参考此前的源码备份版本,并修改上面的错误数据.2. 对于无法修改的,可以直接去掉中间的数字,如下: BEGIN    END

编资源bundle时图片文件变成tiff的解决方法

一般,编写SDK的时候,如果SDK还带了一些资源文件,那么最理想的是将资源文件也打包成为bundle给应用方一起使用.而在编资源bundle时,有时会发现编译好后的图片文件从png转成了tiff,这样找icon就会不正确了.解决的方法是更改编译设置COMBINE_HIDPI_IMAGES为NO. 如下图所示:

ajax请求node.js接口时出现 No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource错误

ajax请求node.js接口出现了如下的错误: XMLHttpRequest cannot load http://xxx.xxx.xx.xx:8888/getTem?cityId=110105&date=2015-03-04. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 百度了一下,原来是

Node.js入门:文件查找机制

文件查找流程图 从文件模块缓存中加载 尽管原生模块与文件模块的优先级不同,但是都不会优先于从文件模块的缓存中加载已经存在的模块. 从原生模块加载 原生模块的优先级仅次于文件模块缓存的优先级.require方法在解析文件名之后,优先检查模块是否在原生模块列表中.以http模块为例,尽管在目录下存在一个http/http.js/http.node/http.json文件,require("http")都不会从这些文件中加载,而是从原生模块中加载. 原生模块也有一个缓存区,同样也是优先从缓存