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

简介: 在高可用的k8s集群中,当Node节点挂掉,kubelet无法提供工作的时候,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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
11天前
|
XML 存储 JavaScript
DOM 节点列表(Node List)
XML DOM允许访问XML文档的每个节点,提供三种访问方法:getElementsByTagName()、循环遍历和导航节点关系。getElementsByTagName()返回一个节点列表,类似于数组,可用于获取特定标签名的节点。例如,加载"books.xml"后,`xmlDoc.getElementsByTagName("title")`会获取所有<title>元素,存储在变量x中。通过索引如x[2]可访问第三个<title>元素,注意索引从0开始。后续章节将进一步探讨节点列表(Node List)。
|
2天前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度,允许遍历和处理节点。例如,加载"books.xml"到`xmlDoc`,通过`getElementsByTagName("title")`获取所有标题节点,然后使用循环输出每个<title>元素的文本内容。
|
3天前
LabVIEW使用VI服务器的调用节点将数据传递到另一个VI 使用调用节点(Invoke Node)与通过引用调用节点(Call by Reference)调用VI时有什么差别?
LabVIEW使用VI服务器的调用节点将数据传递到另一个VI 使用调用节点(Invoke Node)与通过引用调用节点(Call by Reference)调用VI时有什么差别?
|
3天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes详解(六)——Pod对象部署和应用
在Kubernetes系列中,本文聚焦Pod对象的部署和管理。首先,通过`kubectl run`命令创建Pod,如`kubectl run pod-test --image=nginx:1.12 --port=80 --replicas=1`。接着,使用`kubectl get deployment`或`kubectl get pods`查看Pod信息,添加`-o wide`参数获取详细详情。然后,利用Pod的IP地址进行访问。最后,用`kubectl delete pods [Pod名]`删除Pod,但因Controller控制器,删除后Pod可能自动重建。了解更多细节,请参阅原文链接。
11 5
|
6天前
|
JavaScript
DOM 属性列表(命名节点图 Named Node Map)
这段内容介绍了DOM中的`attributes`属性,它返回元素节点的属性节点列表,形成一个命名节点图。这个列表自动更新,当属性增删时反映变化。示例代码展示了如何加载"books.xml",获取第一个`<book>`元素的属性列表,然后使用`getNamedItem()`方法获取"category"属性的值并显示属性数量。输出为"cooking"和"1"。
|
6天前
|
XML 数据格式
节点列表长度(Node List Length)
`NodeList`对象自动更新,其`length`属性表示列表中节点数量。例如,加载"books.xml"后,`getElementsByTagName('title').length`返回`4`。此属性可用来遍历列表,如示例所示,遍历所有`<title>`元素并打印其文本内容:Everyday Italian, Harry Potter, XQuery Kick Start, Learning XML。
|
7天前
|
XML 数据格式
节点列表长度(Node List Length)
`Node List`对象自动更新,其`length`属性表示列表中节点数量。在给定示例中,代码加载"books.xml",并利用`getElementsByTagName('title')`获取<title>元素的数量,结果为4。`length`也可用于遍历列表,如示例所示,遍历并打印所有<title>元素的文本内容:Everyday Italian, Harry Potter, XQuery Kick Start, Learning XML。
|
10天前
|
XML 数据格式
节点类型(Node Types)
该教程介绍了XML文档的根节点通过documentElement属性获取,节点信息包括nodeName(节点名)和nodeType(节点类型)。下一章将深入探讨节点属性。示例代码展示了如何遍历根节点的子节点,仅输出元素节点的名称,通过检查nodeType为1来判断是否为元素节点。
|
10天前
|
XML JavaScript 数据格式
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度,例如在XML文档中,通过`getElementsByTagName()`获取的所有`<title>`元素的数量。可以遍历这个列表,如示例所示,使用`for`循环访问并输出每个节点的文本值。在提供的实例中,代码加载"books.xml",然后获取并打印所有<title>元素的子节点值。
|
13天前
|
Kubernetes Perl 容器
在 Kubernetes 中重启 pod 的 3 种方法
【4月更文挑战第25天】
33 1
在 Kubernetes 中重启 pod 的 3 种方法