Highlight

本文会介绍kubernetes中关于集群驱逐的相关参数, 合理设置驱逐速率的考虑因素, 但是不会涉及node层面资源的驱逐阈值的设置。

Basic

在kubernetes中, 如果一个node出现故障, 例如节点宕机或与节点网络异常, controller manager中的node controller会检测到心跳超时后会将node状态置为ConditionUnknown, 等待一段时间后开始驱逐该node上面的pod, 默认是40s认为心跳超时, 等待5min后开始驱逐pod, 可以设置--node-monitor-grace-period参数指定NodeController判定心跳超时的时间,默认为40s, 通过设置参数 --pod-eviction-timeout指定node异常多久后开始驱逐pod, 默认是5min,--node-monitor-period 为心跳检查间隔,即node controller会在该间隔内检查心跳node状态,默认是5s。
kubelet 会经过--node-status-update-frequency上报node信息, 默认是10s, 在1.13版本之前, node status 的更新就是心跳, 1.13引入了新的node lease机制,这是专门为心跳引入的机制, 可以有效降低master的负载,为了与现在的行为保证一致,现在的lease renew 间隔为10s,且目前该值hard code 在代码中。

在一个集群中, 可能会出现所有的node都无法连接master, 例如master节点网络故障, kubernetes充分考虑到了这种情况, 会有一些异常处理措施。 默认情况下, 集群状态正常, node controller 驱逐的速率为--node-eviction-rate, 默认是0.1, 即kubernetes最快每10s中驱逐一个node上的pod。 但是当一个大集群中有一定比例的node都not ready后, 此时kubernete会认为是master节点出现了故障, 会减慢该驱逐速率, 采用二级驱逐速率, 其中大集群是通过--large-cluster-size-threshold参数控制,默认是50, 集群不健康的比例是通过--unhealthy-zone-threshold 控制, 默认是0.55, 二级驱逐速率是通过--secondary-node-eviction-rate控制,默认是0.001, 也就是说默认情况下: 当集群规模大于50个node时, 集群中只要有55%的node不健康, 就会认为master出现了故障, 会将驱逐速率从0.1降为0.001; 如果集群规模小于50个node, 集群中出现55%的node不健康,就会停止驱逐。

Tune eviction parameter

这几个参数都是异常重要的,在必要时候免于危难, 尤其是在大集群情况下。 通常情况下, master无法连接的概率较小, 相对于网络分区等这种故障,比较常见的是master前面的LB出现故障, 一般我们会部署多个master节点来实现failover,然后在前面设置一个共同的入口LB, 所有kubelet连接LB。 社区中有不少issue是关于LB无法连接的问题的。 还有一种情况是当一个集群中部分node不可用之后, 大量pod漂移可能会导致故障扩散,也就是集群雪崩。合理的设置这几个参数可以保证在最坏情况下都不至于出现大量pod漂移的问题。

这几个参数都是互相关联的, 设置的时候需要综合考虑,并且需要结合集群的现有状况。比如上述这些参数默认是指kubernetes部署在多zone环境下, 一个zone挂掉之后可以驱逐pod到另外一个健康的zone中,但是如果我们是一个的单机房,单集群的话, 就没办法实现跨zone 容错, 此时我们应该设置--secondary-node-eviction-rate为0,也就是说,一个大集群中有大量node不可用时,我们就停止驱逐, 防止故障扩散。

--unhealthy-zone-threshold 的选择需要根据集群buffer来设置, 比如说一个集群已经将近饱和,所有的资源已经快分配完了,集群buffer最多可以容纳50个pod, 此时如果还设置--unhealthy-zone-threshold为默认值的话, 极端情况下, 当集群不可用时间过长, 会导致kubernetes驱逐大概一半的pod,这是因为集群buffer已满, 新创建的pod已经无法容纳了, 此时驱逐也没有用。
一般情况下, 我们集群的buffer < 15%, 所以该参数设置为 <10%,虽然buffer为15%, 但是考虑到集群资源的碎片等问题, 15%的buffer不能全部分配出去, 所以该值最好小于10%。 当然这个值根据不同的集群资源情况和上面--secondary-node-eviction-rate的速率合理取舍。

--pod-eviction-timeout的设置更多的是根据业务类型来取舍, 如果设置的太短,可能会因为一些网络抖动导致一些不必要的驱逐, 如果设置的太长, 会导致业务在短时间内无法恢复到指定实例数。官方默认的5min感觉一般情况下是无需改变。

还有一种情况是,集群在大小集群之间摇摆, 比如说, 对于默认的--large-cluster-size-threshold的值为50, 当集群node数刚好在50和51之间时摇摆时,需要考虑两种情况分别作用的影响。

可以看到所有的这些参数都是建立在集群不可用时间的基础上, 只有故障快速恢复才是王道, 当你集群可用性是0.9999, 四个九时, 年不可用时间约为50分钟, 以默认的二级驱逐速率0.001来说, 相当于才驱逐了30个node, 一般情况下, 对于稍大点的集群来说, 还不算什么问题。 故障发生的时候, 真是分秒必争啊。

当选择了合适的参数之后, 可以通过一些虚拟的简单进行测试一下, 社区有一些virtual kubeletkubemark都可以用来创建虚拟node来模拟大规模集群,具体使用细节此处不做深究, 感兴趣的读者请自行探索。

Reference

kubernetes document: Nodes

欢迎交流, 我会积极回复的 ☺

转载于:https://www.cnblogs.com/gaorong/p/10823536.html

tune kubernetes eviction parameter相关推荐

  1. Kubernetes Eviction Manager工作机制分析

    2019独角兽企业重金招聘Python工程师标准>>> 研究过Kubernetes Resource QoS的同学,肯定会有一个疑问:QoS中会通过Pod QoS和OOM Kille ...

  2. 深度解析Kubernetes Pod Disruption Budgets(PDB)

    2019独角兽企业重金招聘Python工程师标准>>> Author: xidianwangtao@gmail.com PDB的应用场景 大概在Kubernetes 1.4新增了Po ...

  3. Matlab + Gurobi入门

    本文将结合官方文档和其他相关介绍,对Matlab + Gurobi的使用做一个完全零基础的入门介绍(我也是小白,这也是对自己学习的一个记录) 一.Gurobi优化器快速入门指导 - Windows 1 ...

  4. Koordinator 1.0 正式发布:业界首个生产可用、面向规模场景的开源混部系统

    作者:Koordinator 团队 Koordinator 从 2022 年 4 月发布以来,迄今一共迭代发布了 8 个版本.项目经历的大半年发展过程中,Koordinator 社区吸纳了包括阿里巴巴 ...

  5. onload--Parameter Reference

    Parameter List The parameter list details the following: •The environment variable used to set the p ...

  6. NLP基础——python的jieba用于词类分割用法总结(1)

    import jiebaseg_listDef = jieba.cut("我在学习自然语言处理") seg_listAll = jieba.cut("我在学习自然语言处理 ...

  7. solaris的ndd指令(相当于linux的sysctl命令)

    solaris的ndd指令 2011-05-15 10:43:34 分类: Linux ndd ndd - get and set driver configuration parameters SY ...

  8. Jenkins 连接K8S

    jenknis 机器添加kubectl 命令的方式 mkdir /root/.kube -p## 复制k8s的Master下的 /root/.kube/config 到被安全机器上去即可 chmod ...

  9. 记一次 Kubernetes 集群 Pod Eviction 问题排查过程

    声明: 本博客欢迎转发,但请保留原作者信息! 新浪微博:@Lingxian_kong; 微信公众号:飞翔的尘埃; 内容系本人学习.研究和总结,如有雷同,实属荣幸! 现象:一个普通的 k8s 集群,3 ...

最新文章

  1. Jmeter接口测试进阶
  2. 让XP远程桌面支持多用户
  3. SpringSecurity分布式整合之分布式认证流程说明
  4. mapreduce 聚合_MapReduce:处理数据密集型文本处理–局部聚合第二部分
  5. Python2、3字典比较函数
  6. C#中的深度学习:ML.NET中具有预训练模型的硬币识别
  7. python中delete怎么用_python删除np.deletePython基础教程05 - 缩进和选择
  8. 《ASP.NET 本质论》源码下载
  9. 基于HTTP的QQ协议(转)
  10. fiddler模拟服务器响应,fiddler模拟返回响应数据
  11. InDesign 软件教程,如何自定义工作区?
  12. 东线报接口 全网一手线报全网(京东,淘宝,天猫)最全优惠信息
  13. LaTeX下载安装-1
  14. 高效能人士的七个习惯(一)由内而外全面造就自己
  15. grep -E 即 egrep 匹配多个
  16. 淘宝上卖云控系统靠谱吗?
  17. 未来: 从Uber到Suber
  18. 算法概念【PPT整理】
  19. sublime 4 设置文件编码 GBK
  20. 屏幕录像软件,完美无水印版

热门文章

  1. 蓝桥杯 基础练习 芯片测试
  2. [golang]如何看懂调用堆栈
  3. 用WPF实现在ListView中的鼠标悬停Tooltip显示
  4. SSH应用之BBS之路-1、项目构设之数据库设计
  5. Java十进制转二、八、十六进制方法
  6. 【第4篇】Python爬虫实战-抓取B站弹幕视频
  7. Guava的介绍与使用示例
  8. 单向链表和双向链表区别_双向链表
  9. ios java环境变量_iOS 环境变量配置(DebugReleaseTest)
  10. mysql内存态_MySQL · 社区动态 · MySQL内存分配支持NUMA