k8s node NotReady后会发生什么?

news2024/11/24 17:31:47

K8s 是一种强大的容器编排和管理平台,能够高效地调度、管理和监控容器化应用程序;其本身使用声明式语义管理着集群内所有资源模型、应用程序、存储、网络等多种资源,Node 本身又属于 K8s 计算资源,上面承载运行着各种类型的应用程序,当Node NotReady 后运行在其上面各种 Workload 类型的 Pod 都会受到影响,脱离了 K8s 生命周期的管理后将会变的不可控无法提供服务,为保障该 Node 上 Pod 的可用性及可控性,K8s 会对这个 Node 上的 Pod 进行网络、存储、副本保持等控制;因 K8s 自身 controller manager 较多加上集群管理及运维的复杂度,增加了 Node NotReady 后的理解与学习成本;本文将基于 K8s 1.24 版本对 Node NotReady 后会触发哪些行为进行详细描述。

1. 控制器探索

1.1. Node Controller

默认情况下,Kubelet 每隔 10s (--node-status-update-frequency=10s) 更新 Node 的状态(我们称之为心跳),而 kube-controller-manager 每隔 5s 检查一次 Node 的状态 (--node-monitor-period=5s)。kube-controller-manager 会在 Node 未更新状态超过 40s (--node-monitor-grace-period=40s)时 ,将其标记为 NotReady (Node Ready Condition: True on healthy, False on unhealthy and not accepting pods, Unknown on no heartbeat)。当 Node 超过 5m 未更新状态,则 kube-controller-manager 会驱逐该 Node 上的所有 Pod

Kubernetes 会自动给 Pod 添加针对 node.kubernetes.io/not-ready 和 node.kubernetes.io/unreachable 的容忍度,且配置 tolerationSeconds=300。这里需要注意的是当 Pod 对应容忍没有配置tolerationSeconds时,该容忍生效后 K8s 不会对 Pod 进行驱逐,可以通过 tolerations 配置 Pod 的容忍度,来覆盖默认的配置:

tolerations:
- key: "node.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 300
- key: "node.kubernetes.io/not-ready"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 300

Node 控制器在节点异常后,会按照默认的速率(--node-eviction-rate=0.1,即每10秒一个节点的速率)进行 Node 的驱逐。Node 控制器按照 Zone 将节点划分为不同的组,再跟进 Zone 的状态进行速率调整:

  • Normal:所有节点都 Ready,默认速率驱逐。

  • PartialDisruption:即超过33% 的节点 NotReady 的状态。当异常节点比例大于 --unhealthy-zone-threshold=0.55 时开始减慢速率:

    • 小集群(即节点数量小于 --large-cluster-size-threshold=50):停止驱逐

    • 大集群:减慢速率为 --secondary-node-eviction-rate=0.01

  • FullDisruption:所有节点都 NotReady,返回使用默认速率驱逐。但当所有 Zone 都处在 FullDisruption 时,停止驱逐。

K8s 此后的所有行为将会围绕着 Pod NotReady 和被驱逐的 Pod 进行展开;从下图中我们可以看到牵涉的组件及功能较多让人感觉着实复杂,但各个功能相互独立,管理逻辑有迹可循,以下根据各个组件功能进行详细探索,为减少本文篇幅,从总体逻辑上说明白 K8s 管理 Node 及 Pod 功能,本文只做功能描述,具体代码不再详细介绍。

1.2. Deployment Controller

Deployment 通过管理 ReplicaSet 来完成 K8s 中微服务的版本更新、扩容缩容、滚动更新、回滚等高级功能,当 Pod NotReady 后会触发对应 ReplicaSet 的副本数保持功能;而 Deployment 只会更新自身 status 相关内容。

1.3. ReplicaSet Controller

Replicaset Controller的主要功能是确保期望的 Pod 副本数量与实际运行的 Pod 副本数量一致。因此,Replicaset Controller 会重建该 Node 上 相关的 Not Ready 的 Pod 副本以替换NotReady节点上的失效副本。Node NotReady 的 Pod 仍然会保留处于 Terminating 状态,Node 恢复后 kubelet 会执行优雅删除并强制删除该 Pod。

1.4. StatefulSet Controller

Node NotReady 同样会对 StatefulSet Pod 触发 eviction 操作,用户看到的 Pod 会一直处于 Terminating 状态。此时 StatefulSet Controller 并不会创建新的 Pod;Node 恢复后 kubelet 会执行优雅删除,detach PV,然后会重建该Pod。

1.4.1. 为什么没有重建

往往应用中有一些 Pod 没法实现多副本,但是又要保证集群能够自愈,那么这种某个节点 Down 掉或者网卡坏掉等情况,就会有很大影响,要如何能够实现自愈呢?

对于这种 Unknown 状态的 Stateful Pod ,可以通过 force delete 方式去删除。关于 ForceDelete,社区是不推荐的,因为可能会对唯一的标志符(单调递增的序列号)产生影响,如果发生,对 StatefulSet 是致命的,可能会导致数据丢失(可能是应用集群脑裂,也可能是对 PV 多写导致)。

kubectl delete pods <pod> --grace-period=0 --force

但是这样删除仍然需要一些保护措施,以 Ceph RBD 存储插件为例,当执行force delete 前,根据经验,用户应该先设置 ceph osd blacklist,防止当迁移过程中网络恢复后,容器继续向 PV 写入数据将文件系统弄坏。因为 force delete 是将 PodObj 直接从 ETCD 强制清理,这样 StatefulSet Controller 将会新建新的 Pod 在其他节点, 但是故障节点的 Kubelet 清理这个旧容器需要时间,此时势必存在 2 个容器mount 了同一块 PV(故障节点Pod 对应的容器与新迁移Pod 创建的容器),但是如果此时网络恢复,那么2 个容器可能同时写入数据,后果将是严重的。

1.4.2. 社区推荐的做法

先恢复故障机器,自行完成优雅删除操作、detach PV、强制保障进程完全退出后,再由 kubuelet 将Pod进行彻底删除,最后触发 StatefulSet Controller 副本数保持功能,重建该Pod。

1.5. DaemonSet Controller

Node NotReady 对 DaemonSet 不会有影响,查询 Pod 处于 NodeLost 状态并一直保持。当 Node 恢复后该类型的Pod 会从 NodeLost 状态直接变成 Running 状态,不涉及重建。

1.6. Job Controller

Job Controller负责管理批处理任务。当NotReady节点上的Pod不可用时,Job Controller会在其他可用节点上创建新的Pod副本以完成任务。Job Controller会监控任务的进度,并确保任务在成功完成或达到重试次数限制后结束。

在 Node 重新变为 Ready 状态时,Job Controller会根据需要对Pod进行重新调度,以确保任务能够在可用资源的情况下继续执行。同时,Job Controller还会处理并发限制和任务完成后的清理工作。

2. 网络

Pod之间的网络通信在Kubernetes集群中至关重要。当 Node 变为NotReady状态时,位于该节点上的Pod可能无法与其他Pod进行通信。这可能是由于网络插件故障、网络策略限制或底层网络问题导致的。在 Node 重新变为Ready状态时,网络问题可能会得到解决,从而恢复Pod之间的通信。然而,这还取决于网络插件、配置和底层网络设施的具体情况。

2.1. Endpoints Controller

Endpoints Controller的主要职责是确保 Endpoints 对象始终与 Service 和 Pod 对象的当前状态保持一致。这是 K8s 服务发现和负载均衡功能的基础。其核心工作原理如下:

  1. 获取 Service 对象,当查询不到该 Service 对象时,删除同名 Endpoints 对象;

  2. 根据 Service 对象的.Spec.Selector,查询与 Service 对象匹配的 Pod 列表;

  3. 查询 Service 的 annotations 中是否配置了TolerateUnreadyEndpoints,代表允许为 unready 的 Pod 也创建 Endpoints,该配置将会影响 Endpoints 对象的 subsets 信息的计算;

  4. 遍历 Service 对象匹配的 Pod 列表,找出处于 Ready 状态的 Pod,并计算 Endpoints 的 subsets 信息;

  5. 获取 Service 同名 Endpoints 对象,没有则创建新的 Endpoints;将该Service匹配的Pod的 IP 地址和端口信息添加到 Endpoints 对象中。当一个 Service 的选择器发生变化,或与该 Service 关联的 Pod 的数量或状态发生变化时,Endpoints Controller会更新相应的Endpoints对象,以反映当前的 Pod IP 地址和端口信息。

上文已分析到 Node 变为 NotReady 后,Node Controller会更新该 Node 上的 Pod 为NotReady 状态,更新后 Endpoints Controller 会第一时刻感知到该变化,会把该 Pod 从对应的 Endpoints 的 IP list中摘除,以保证该 Pod 不会被其他 Pod 访问。

2.2. CoreDNS

CoreDNS就是DNS服务的一种,它会监视Kubernetes集群中的各种对象,包括Service、Endpoint、Pod等等。通过这些对象的更新,CoreDNS可以持续更新DNS记录,从而保证集群内的服务发现的正确性和实时性。

简单来说,当Service对象发生变化(例如,新创建了一个Service或者Service的端口、IP等发生了变化)时,CoreDNS就会根据这些变化更新相关的DNS记录。如果一个Pod被创建、删除或NotReady,CoreDNS也会及时地更新对应的DNS记录。

3. 存储

3.1. 本地存储

如果PV使用的是本地存储(例如,节点上的磁盘或目录),那么当节点变为NotReady状态时,位于该节点上的存储卷将无法访问。这可能导致使用这些存储卷的Pod无法正常运行。在这种情况下,Kubernetes不会对PV执行任何操作,因为本地存储卷与特定节点紧密相关。当节点重新变为Ready状态时,存储卷的访问可能会恢复正常。

3.2. 网络存储

对于网络存储(如NFS、iSCSI、Ceph等),当节点变为NotReady状态时,位于该节点上的Pod可能无法访问其存储卷。这可能是由于网络问题或者存储配置问题导致的。在这种情况下,Kubernetes不会对PV执行任何操作。当节点重新变为Ready状态并且网络问题得到解决时,Pod可能会重新获得对存储卷的访问。

3.3. 云存储

对于云存储(如AWS EBS、GCE PD、Azure Disk等),当节点变为NotReady状态时,Kubernetes可能会根据存储类(StorageClass)的配置自动将存储卷从不可用节点分离并附加到其他可用节点。这样,重新调度到其他节点的Pod可以继续访问其存储卷。请注意,这种行为取决于存储类的配置和云提供商的支持。

当Kubernetes集群中的节点变为NotReady状态时,对PV和PVC的影响主要取决于存储类型和配置。Kubernetes对PV的操作也因存储类型而异。在节点重新变为Ready状态时,存储访问可能会恢复正常,但这取决于具体情况。为了确保应用程序的高可用性,建议使用支持动态迁移和故障转移的存储解决方案。

3.4. 其他组件和功能

除了上述组件外,Kubernetes还有其他组件和功能可能会在节点变为NotReady状态时发生变化。例如:

Horizontal Pod Autoscaler(HPA):HPA负责根据资源利用率自动调整Pod副本数量。在节点变为NotReady状态时,HPA可能会在其他可用节点上创建新的Pod副本以满足负载需求。

Ingress Controller:Ingress Controller负责管理集群的入口流量。当节点变为NotReady状态时,Ingress Controller可能需要重新调度Ingress资源以确保流量能够正确路由到其他可用节点上的Pod。

Persistent Volumes(PV)和Persistent Volume Claims(PVC):当节点变为NotReady状态时,位于该节点上的存储卷可能会受到影响。这可能导致Pod无法访问其持久化存储。在节点重新变为Ready状态时,存储卷的访问可能会恢复正常。

总之,当Kubernetes集群中的节点变为NotReady状态时,各个组件会采取一系列行动来确保集群的稳定性和应用的正常运行。这包括重新调度Pod、确保服务可用性、维护网络通信和存储访问等。在节点重新变为Ready状态时,这些组件会根据需要进行相应的调整,以恢复正常运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

selenium环境安装和web自动化基础

webUI自动化背景 因为web页面经常会变化&#xff0c;所以UI自动化测试的维护成本很高。不如接口的适用面广&#xff0c;所以大部分公司会做接口自动化测试&#xff0c;但是未必会做UI自动化测试&#xff1b; UI自动化测试要做也是覆盖冒烟测试&#xff0c;不会到很高的覆盖率&a…

gpt-4o考场安排

说明 &#xff1a;经过多次交互&#xff0c;前后花了几个小时&#xff0c;总算完成了基本功能。如果做到按不同层次分配考场&#xff0c;一键出打印结果就完美了。如果不想看中间“艰苦”的过程&#xff0c;请直接跳到“最后结果”及“食用方法”。中间过程还省略了一部分交互&…

集中抄表系统是什么?

1.集中抄表系统简述 集中抄表&#xff0c;又称为智能抄表&#xff0c;是一种现代化能源管理体系技术性&#xff0c;主要运用于电力工程、水、气等公共事业的计量。它通过自动化的形式收集解决大量用户的计量数据信息&#xff0c;大大提升了数据收集的效率和精确性&#xff0c;…

基于SSM实现的新生报到系统源码+数据库+论文

项目简介 基于SSM实现的新生报到系统&#xff0c;主要分为五种用户角色&#xff0c;分别是&#xff1a; 学院管理员管理所有内容&#xff0c;涵盖了班级&#xff0c;专业&#xff0c;学院&#xff0c;学生&#xff0c;缴费以及宿舍等方面的信息&#xff0c;学院管理员可以统计…

java-查询字符串当中是否包含中文

文章目录 前言java-查询字符串当中是否包含中文 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊…

2024电工杯数学建模A题思路模型代码

最新版完整内容见文末名片 A 题&#xff1a;园区微电网风光储协调优化配置 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;为了尽量提高风光电量的 负荷占比&#xff0c;需配置较高比例的风光发电装机容量&#xff0c;但由于园区负荷与风光发电功 率时序不匹配&am…

噪声条件分数网络——NCSN原理解析

1、前言 本篇文章&#xff0c;我们讲NCSN&#xff0c;也就是噪声条件分数网络。这是宋飏老师在2019年提出的模型&#xff0c;思路与传统的生成模型大不相同&#xff0c;令人拍案叫绝&#xff01;&#xff01;&#xff01; 参考论文&#xff1a; ①Generative Modeling by Es…

IDEA设置运行内存

1.开启内存指示条​​​​​​​ 查看idea右下角​​​​​​​ 2.环境变量查看ideaVM地址&#xff0c;没有的话那就是默认的配置文件&#xff1a; idea 安装 bin 目录下 idea64.exe.vmoptions 3.去对应路径修改内存参数大小 4.重启IDEA&#xff0c;end

leetcode-主持人调度(二)-110

题目要求 思路 1.先将开始时间和结束时间拆分放到两个数组中进行排序 2.如果开始的时间小于结束时间&#xff0c;说明目前没有空闲的人&#xff0c;需要增加人&#xff0c;如果大于等于&#xff0c;说明有人刚结束了主持&#xff0c;可以进行新的主持了&#xff0c;变更到下一…

JavaEE技术之分布式事务(理论、解决方案、Seata解决分布式事务问题、Seata之原理简介、断点查看数据库表数据变化)

文章目录 JavaEE技术之分布式事务准备:1. 本地事务回顾1.1 什么是事务1.2 事务的作用1.3 事务ACID四大特性1.4 事务的并发问题1.5 MySQL事务隔离级别1.6 事务相关命令(了解)1.7 事务传播行为&#xff08;propagation behavior&#xff09;1.8 伪代码练习1.9 回滚策略1.10 超时事…

重构2:重构的原则之笔记

最近在看重构2&#xff1a;改善既有代码的设计这本书&#xff0c;对于代码重构指导非常有帮助&#xff0c;然后也是做个笔记记录下&#xff0c;以下是我阅读本书的前两章的时候整理的思维导图&#xff1a;

The Sandbox 和 Bitkub 联手增强东南亚元宇宙中心

作为去中心化游戏虚拟世界和区块链平台的先驱&#xff0c;The Sandbox 正与泰国领先的区块链网络 Bitkub Blockchain Technology Co., Ltd. 展开创新合作。双方合作的目的是将Bitkub元宇宙的影响力扩展到The Sandbox&#xff0c;建立一个元宇宙中心&#xff0c;向用户承诺从 Bi…

react使用antd警告:Warning: findDOMNode is deprecated in StrictMode.

警告信息&#xff1a; Warning: findDOMNode is deprecated in StrictMode. findDOMNode was passed an instance of DOMWrap which is inside StrictMode. Instead, add a ref directly to the element you want to reference. Learn more about using refs safely here: htt…

SerDes系列之CTLE均衡技术

CTLE&#xff08;连续时间线性均衡&#xff09;是一种施加在接收器上的线性模拟高通滤波器&#xff0c;通过衰减低频信号分量&#xff0c;以补偿奈奎斯特频率附近的衰减比例&#xff0c;从而实现信道补偿。当低频信号分量向下衰减并推入底噪范围时&#xff0c;CTLE就会失去调节…

解决Wordpress中Cravatar头像无法访问问题

一、什么是Cravatar Gravatar是WordPress母公司Automattic推出的一个公共头像服务&#xff0c;也是WordPress默认的头像服务。但因为长城防火墙的存在&#xff0c;Gravatar在中国时不时就会被墙一下&#xff0c;比如本次从2021年2月一直到8月都是不可访问状态。 在以往的时候&…

JS 实现鼠标框选(页面选择)时返回对应的 HTML 或文案内容

JS 实现鼠标框选&#xff08;页面选择&#xff09;时返回对应的 HTML 或文案内容 一、需求背景 1、项目需求 当用户进行鼠标框选选择了页面上的内容时&#xff0c;把选择的内容进行上报。 2、需求解析 虽然这需求就一句话的事&#xff0c;但是很显然&#xff0c;没那么简单…

MySQL -- 相关知识点

1.数据库相关介绍 数据库的选择通常取决于具体的应用需求&#xff0c;如性能、扩展性、数据一致性和易用性等因素。 1. 关系型数据库&#xff08;RDBMS&#xff09; MySQL&#xff1a; 广泛使用的开源数据库&#xff0c;支持大多数操作系统。强调易用性、灵活性和广泛的社区支…

代码随想录算法训练营第36期DAY37

DAY37 先二刷昨天的3道题目&#xff0c;每种方法都写&#xff1a;是否已完成&#xff1a;是。 报告&#xff1a;134加油站的朴素法没写对。原因是&#xff1a;在if中缺少了store>0的判断&#xff0c;只给出了indexi的判断。前进法没写出来。因为忘记了总油量的判断。Sum。…

基于Vue的自定义服务说明弹窗组件的设计与实现

基于Vue的自定义服务说明弹窗组件的设计与实现 摘要 随着技术的不断发展&#xff0c;前端开发面临着越来越高的复杂性和不断变化的需求。传统开发方式往往将整个系统构建为整块应用&#xff0c;这导致对系统的任何微小改动都可能触发整体的逻辑变更&#xff0c;从而增加了开发…

第二证券:见证历史!印度这一交易所市值突破5万亿美元

又一次见证前史&#xff01; 孟买证券交易所本周实现了一个重要的里程碑&#xff0c;其市值突破5万亿美元&#xff0c;总市值在不到6个月的时间里添加了1万亿美元。 据了解&#xff0c;印度股市两大交易所别离为孟买证券交易所&#xff08;BSE&#xff09; 和国家证券交易所&…