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

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

tune kubernetes eviction parameter的更多相关文章

  1. kubernetes traefik multiple namespaces

    官方文档在此 https://docs.traefik.io/user-guide/kubernetes/ 官方文档在配置 RBAC 时使用了 ClusterRoleBinding, 当你想用多命名空 ...

  2. kubernetes资源优化

    kubernetes资源优化方向 系统参数限制 设置系统内核参数: vm.overcommit_memory = 0 vm.swappiness = 0 sysctl -p #生效 内核参数overc ...

  3. How to Configure the Gradient Boosting Algorithm

    How to Configure the Gradient Boosting Algorithm by Jason Brownlee on September 12, 2016 in XGBoost ...

  4. kaggle 欺诈信用卡预测——不平衡训练样本的处理方法 综合结论就是:随机森林+过采样(直接复制或者smote后,黑白比例1:3 or 1:1)效果比较好!记得在smote前一定要先做标准化!!!其实随机森林对特征是否标准化无感,但是svm和LR就非常非常关键了

    先看数据: 特征如下: Time Number of seconds elapsed between each transaction (over two days) numeric V1 No de ...

  5. Projected coordinate systems 和 wkid

    Projected coordinate systems Well-known ID Name Well-known text 2000 Anguilla_1957_British_West_Indi ...

  6. Kubernetes体系结构

      Nodes Node Status Addresses Phase Condition Capacity Info Management Node Controller Self-Registra ...

  7. calico for kubernetes

    (这一篇中很多错误,勿参考!) The reference urls: https://github.com/kubernetes/kubernetes/blob/master/docs/gettin ...

  8. How to tune SharePoint 2010 Server for better performance?

    http://social.technet.microsoft.com/wiki/contents/articles/7926.sharepoint-2010-tips-for-dealing-wit ...

  9. Kubernetes 设计概要

    英文原文:Kubernetes Design Overview Overview Kubernetes builds on top of Docker to construct a clustered ...

随机推荐

  1. MySQL通过自定义函数实现递归查询父级ID或者子级ID

    背 景: 在MySQL中如果是有限的层次,比如我们事先如果可以确定这个树的最大深度, 那么所有节点为根的树的深度均不会超过树的最大深度,则我们可以直接通过left join来实现. 但很多时候我们是无 ...

  2. 用PHP实现一个简易版文件上传功能(超详细讲解)

    1. php简化版的图片上传(没有各种验证) 1 2 3 4 <form action="" enctype="multipart/form-data" ...

  3. 剖析nsq消息队列(四) 消息的负载处理

    剖析nsq消息队列-目录 实际应用中,一部分服务集群可能会同时订阅同一个topic,并且处于同一个channel下.当nsqd有消息需要发送给订阅客户端去处理时,发给哪个客户端是需要考虑的,也就是我要 ...

  4. vue 中 keep-alive 缓存数据、离开时位置

    路由中: 页面中: 需要缓存的组件中: 因为是keep-alive  所以在初始化页面的时候 会走一次生命周期 当二次进入的时候就已经是缓存状态了 不会在走生命周期 于是它就有了自己的周期函数分别是 ...

  5. odoo12 修行基础篇之 添加字段 (一)

    本人刚刚接触odoo12,大概有2个多月的时间,这两天有点时间,就集中写下博客. 本来是打算整理成笔记,想到这段时间的开发经历,着实感觉网上有关odoo的资料太少,学习资料也不多,既然与odoo有缘, ...

  6. API规范约定

    为了高效开发,节约编写文档的成本,API服务使用Swagger来描述 一.API设计原则 控制API的粒度和数量 命名要遵循简单.可读.统一原则: 优先设计API,然后编码 二.URL设计[针对后端开 ...

  7. 2011-11-14:命令执行漏洞防御,PHP反序列化漏洞产生原因,笔记

    命令执行漏洞防御尽量不要使用系统执行命令在进入执行命令函数方法之前,变量一定要做好过滤,对敏感字符进行转义在使用动态函数之前,确保使用的函数是指定的函数之一对PHP语言来说,不能完全控制的危险函数最好 ...

  8. 【Luogu P1981】表达式求值

    点我进入原题Luogu P1981 [解题思路] 仔细分析题目,这就是一道模拟题…… 直接按照符号读入全部的数字,先算乘法,最后把全部数加起来就是结果了 记得要%10000取最后四位 [参考程序] # ...

  9. 用IDCNN和CRF做端到端的中文实体识别

    实体识别和关系抽取是例如构建知识图谱等上层自然语言处理应用的基础.实体识别可以简单理解为一个序列标注问题:给定一个句子,为句子序列中的每一个字做标注.因为同是序列标注问题,除去实体识别之外,相同的技术 ...

  10. python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...