Kubernetes调整Node节点快速驱逐pod的时间
在高可用的k8s集群中,当Node节点挂掉,kubelet无法提供工作的时候,pod将会自动调度到其他的节点上去,而调度到节点上的时间需要我们慎重考量,因为它决定了生产的稳定性、可靠性,更快的迁移可以减少我们业务的影响性,但是有可能会对集群造成一定的压力,从而造成集群崩溃。
Kubelet 状态更新的基本流程:
- 1.kubelet 自身会定期更新状态到 apiserver,通过参数--node-status-update-frequency指定上报频率,默认是 10s 上报一次。
- 2.kube-controller-manager 会每隔--node-monitor-period时间去检查 kubelet 的状态,默认是 5s。
- 3.当 node 失联一段时间后,kubernetes 判定 node 为 notready 状态,这段时长通过--node-monitor-grace-period参数配置,默认 40s。
- 4.当 node 失联一段时间后,kubernetes 判定 node 为 unhealthy 状态,这段时长通过--node-startup-grace-period参数配置,默认 1m0s。
- 5.当 node 失联一段时间后,kubernetes 开始删除原 node 上的 pod,这段时长是通过--pod-eviction-timeout参数配置,默认 5m0s。
kube-controller-manager 和 kubelet 是异步工作的,这意味着延迟可能包括任何的网络延迟、apiserver 的延迟、etcd 延迟,一个节点上的负载引起的延迟等等。因此,如果--node-status-update-frequency设置为5s,那么实际上 etcd 中的数据变化会需要 6-7s,甚至更长时间。
配置
对于这些参数的配置,需要根据不通的集群规模场景来进行配置。
社区默认的配置
| 参数 | 值 |
|---|---|
| –node-status-update-frequency | 10s |
| –node-monitor-period | 5s |
| –node-monitor-grace-period | 40s |
| –pod-eviction-timeout | 5m |
快速更新和快速响应
| 参数 | 值 |
|---|---|
| –node-status-update-frequency | 4s |
| –node-monitor-period | 2s |
| –node-monitor-grace-period | 20s |
| –pod-eviction-timeout | 30s |
在这种情况下,Pod 将在 50s 被驱逐,因为该节点在 20s 后被视为Down掉了,--pod-eviction-timeout在 30s 之后发生,但是,这种情况会给 etcd 产生很大的开销,因为每个节点都会尝试每 2s 更新一次状态。
如果环境有1000个节点,那么每分钟将有15000次节点更新操作,这可能需要大型 etcd 容器甚至是 etcd 的专用节点。
如果计算尝试次数,则除法将给出5,但实际上每次尝试的 nodeStatusUpdateRetry 尝试将从3到5。 由于所有组件的延迟,尝试总次数将在15到25之间变化。
中等更新和平均响应
| 参数 | 值 |
|---|---|
| –node-status-update-frequency | 20s |
| –node-monitor-period | 5s |
| –node-monitor-grace-period | 2m |
| –pod-eviction-timeout | 1m |
这种场景下会 20s 更新一次 node 状态,controller manager 认为 node 状态不正常之前,会有 2m60⁄205=30 次的 node 状态更新,Node 状态为 down 之后 1m,就会触发驱逐操作。
如果有 1000 个节点,1分钟之内就会有 60s/20s*1000=3000 次的节点状态更新操作。
低更新和慢响应
| 参数 | 值 |
|---|---|
| –node-status-update-frequency | 1m |
| –node-monitor-period | 5s |
| –node-monitor-grace-period | 5m |
| –pod-eviction-timeout | 1m |
Kubelet 将会 1m 更新一次节点的状态,在认为不健康之后会有 5m/1m*5=25 次重试更新的机会。Node为不健康的时候,1m 之后 pod开始被驱逐。
可以有不同的组合,例如快速更新和慢反应以满足特定情况。
也会有特殊情况,例如使用statefulset部署的有状态应用宿主机宕机后应用高可用问题,参考文档 https://www.infoq.cn/article/aMsCvWzhR1It5CxpDWXK
参考文档:
https://github.com/kubernetes-sigs/kubespray/blob/master/docs/kubernetes-reliability.md
https://github.com/kubernetes/community/blob/master/contributors/design-proposals/node/kubelet-eviction.md
https://www.qikqiak.com/post/kubelet-sync-node-status/
https://www.infoq.cn/article/aMsCvWzhR1It5CxpDWXK
Kubernetes调整Node节点快速驱逐pod的时间的更多相关文章
- kubernetes之node 宕机,pod驱离问题解决
背景: 当node宕机时,希望该node节点上的pod能够快速疏散到其他节点,并提供服务.测试发现,要等待5分钟,上面的pod才会疏散. 网上介绍通过修改 /etc/kubernetes/manife ...
- kubernetes之node资源紧缺时pod驱逐机制
在系统硬件资源紧缺的情况下保证node的稳定性, 是kubelet需要解决的一个重要问题 1.驱逐策略 kubelet持续监控主机的资源使用情况, 一旦出现资源紧缺的迹象, kubelet就会主动终止 ...
- k8s kubernetes给node节点添加标签和删除node节点标签
node节点IP 192.168.1.205 给节点添加标签的命令 添加label语法 kubectl label nodes <node-name> <label-key>= ...
- k8s,coredns内部测试node节点上的pod的calico是否正常的一个小技巧
最近由于master整个挂掉,导致相关一些基础服务瘫掉,修复中测试有些节点网络又出现不通的情况正常的启动相关一些服务后,测试一些节点,比较费劲,还有进入pod,以及还有可能涉及命名空间操作这里可以这样 ...
- Kubernetes容器集群管理环境 - Node节点的移除与加入
一.如何从Kubernetes集群中移除Node比如从集群中移除k8s-node03这个Node节点,做法如下: 1)先在master节点查看Node情况 [root@k8s-master01 ~]# ...
- kubernetes中node心跳处理逻辑分析
最近在查看一个kubernetes集群中node not ready的奇怪现象,顺便阅读了一下kubernetes kube-controller-manager中管理node健康状态的组件node ...
- Kubernetes学习之路(四)之Node节点二进制部署
K8S Node节点部署 1.部署kubelet (1)二进制包准备 [root@linux-node1 ~]# cd /usr/local/src/kubernetes/server/bin/ [r ...
- 二进制安装 kubernetes 1.12(四) - 部署 Node 节点组件
在 master 上操作 vi /etc/profile export PATH=/opt/kubernetes/bin:$PATH source /etc/profile 将 kubelet-boo ...
- Kubernetes集群部署之五node节点部署
Node节点是Kubernetes集群中的工作负载节点.每个node都会被master分配一些工作负载,每个node节点都运行以下关键服务进程.Kubelet :负责pod对应的容器的创建.启停等任务 ...
随机推荐
- AddressSanitizer —— ASAN分析内存错误
简介 AddressSanitizer 是一个性能非常好的C/C++ 内存错误探测工具. 它由编译器的插桩模块和替换了malloc函数的运行时库组成. 这个工具可以探测如下这些类型的错误: 对堆.栈和 ...
- 第 12 章 JVM执行引擎
目录 第 12 章 执行引擎 1.执行引擎概述 1.1.执行引擎概述 1.2.执行引擎工作过程 2.Java 代码编译和执行过程 2.1.解释执行和即时编译 2.2.解释器和编译器 3.机器码 指令 ...
- Java 面向对象概述
本文部分摘自 On Java 8 面向对象编程 在提及面向对象时,不得不提到另一个概念:抽象.编程的最终目的是为了解决某个问题,问题的复杂度直接取决于抽象的类型和质量.早期的汇编语言通过对底层机器作轻 ...
- EF生成模型时Disigner中无信息
原博文 http://blog.sina.com.cn/s/blog_a1b63a730101ezs4.html 说明 DbContext是对ObjectContext的简化封装.原来的ObjectC ...
- matplotlib学习日记(三)------简单统计图
(一)函数bar()---------绘制柱状图 import matplotlib as mpl import matplotlib.pyplot as plt mpl.rcParams[" ...
- Minor GC 和 Full GC的时机
一.对象何时能够进入老年代 GC年龄判定 每进行一次GC过程,存活的对象的GC年龄都会+1:当对象逃过15次GC,年龄达到15岁时,即可进入老年代 可以通过-XX:MaxTenuringThreshl ...
- 为什么会有kafka消息系统?小问题藏着大细节!
前言:老刘今天写这篇文章首先想对一些复制粘贴的博客表达不满:其次是想用通俗易懂的话解释消息系统:最后欢迎各位英雄好汉.女中豪杰前来battle. 1. 为什么有消息系统? 1.1 背景 今天复习kaf ...
- 阿里云Ubuntu配置安装MQTT服务器
先来说说mqtt协议: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽.不可靠的网络的进行远程 ...
- docker配置mysql实现主从同步问题
主从同步遇到 Got fatal error 1236 from master when reading data from binary log: 'Could not find first log ...
- MySQL不会丢失数据的秘密,就藏在它的 7种日志里
本文收录在 GitHub 地址 https://github.com/chengxy-nds/Springboot-Notebook 进入正题前先简单看看MySQL的逻辑架构,相信我用的着. MySQ ...