k8s node NotReady后会发生什么?

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.mzph.cn/web/13907.shtml

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

相关文章

新零售数据中台:构建零售业高效率、智能化的数据处理平台_光点科技

随着互联网技术的快速发展和移动支付、大数据等技术的广泛应用&#xff0c;零售行业已经逐渐从传统零售向新零售模式转变。在这个变革的时代背景下&#xff0c;新零售数据中台应运而生&#xff0c;它作为零售行业数据资源的整合与智能分析的核心载体&#xff0c;成为推动零售行…

10最佳iPhone数据恢复软件评论

您还在寻找最好的iPhone数据恢复软件吗&#xff1f; 似乎我们在iPhone上放置了越来越多与日常生活和工作有关的重要事情。照片可以保持珍贵的时刻&#xff0c;联系人可以保持联系&#xff0c;录音&#xff0c;备忘录和日历可以作为提醒&#xff0c;视频和歌曲可以娱乐&#xf…

xml篇---提取VOC格式的坐标,并按照cameraID进行排序(二)

xml篇—提取VOC格式的坐标&#xff0c;并按照cameraID进行排序&#xff08;二&#xff09; import os import xml.etree.ElementTree as ETdef parse_xml(xml_file):tree ET.parse(xml_file)root tree.getroot()objects {}for obj in root.findall(object):name obj.find(…

【DevOps】深入浅出:Jenkins 性能监控全解析

目录 一、监控指标&#xff1a;把握系统健康状况 1、资源利用率&#xff1a; 2、 任务执行效率&#xff1a; 3、系统稳定性&#xff1a; 二、监控工具&#xff1a;选择合适的利器 1、Jenkins 内置监控 1.1、Jenkins Performance Plugin&#xff1a;系统性能指标的直观展…

Android Webview加载pdf文件无法缩放问题

WebView设置开启页面缩放&#xff1a; settings webView.getSettings(); settings.setSupportZoom(true); settings.setJavaScriptEnabled(true); settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setBuiltInZoomControls(true); sett…

CDN管理平台安装说明

CDN管理平台安装说明 系统需求 操作系统&#xff1a;Linux CPU不少于1核心 可用内存不少于1G 可用硬盘空间不小于10G 对于每日千万访问以上的CDN系统推荐配置如下&#xff1a; CPU不少于8核心 可用内存不少于8G 可用硬盘空间不小于200G 准备工作 在安装GoEdge之前&#xff0…

kubernetes(k8s) v1.30.1 创建本地镜像仓库 使用本地docker镜像仓库部署服务 Discuz X3.5 容器搭建论坛

1 master11创建本地镜像仓库 [rootmaster11 ~]# docker run -d -p 5000:5000 --restartalways --name registry registry:2 Unable to find image registry:2 locally 2: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df…

Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明

Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明 目录 Python 机器学习 基础 之 数据表示与特征工程 【分类变量】的简单说明 一、简单介绍 二、数据表示与特征工程 数据表示 特征工程 三、分类变量 1、One-Hot编码&#xff08;虚拟变量&#xff09…

漫谈企业信息化安全-综述

一、前言 一直以来想写一些文章&#xff0c;谈一谈企业信息化过程中的安全问题及对策。 随着信息技术的不断发展和普及&#xff0c;特别是今年来移动办公、云服务等等新的工作模式和新的信息技术的应用&#xff0c;企业信息化已经成为提升竞争力、促进创新和发展的重要途径。…

C++ | Leetcode C++题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* sortedArrayToBST(vector<int>& nums) {return helper(nums, 0, nums.size() - 1);}TreeNode* helper(vector<int>& nums, int left, int right) {if (left > right) {return nu…

算法学习:快速排序

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f680; 引言&#x1f4cc; 快速排序算法核心思想1. 选择基准值&#xff08;Pivot&#xff09;2. 分区操作&#xff08;Partitioning&#xff09;3. 递归排序子序列 &#x1f4cc; JavaScript 实现1. 快速排序主函数2…

基于Perfetto 解读一帧的生产消费流程 Android >= S Qualcomm

广告 首先帮我朋友打个广告 我们一起在运营一个视频号 感兴趣的可以帮忙点击右边这个小铃铛 铃铛 序 1.这个流程里面的东西如果展开其实是有很多的 内容其实还是比较浅显的 sf处就不贴源码了 关一个Vsync就有的解释 当然笔者在流程上先形成一个思维闭环 2.如有小伙伴需要 笔…

Java方法的递归

Java方法的递归 前言一、递归的概念示例代码示例 二、递归执行过程分析代码示例执行过程图 三、递归练习代码示例按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)递归求 1 2 3 ... 10写一个递归方法&#xff0c;输入一个非负整数&#xff0c;返回组成它的数字之和. …

go语言的一些常见踩坑问题

开始之前&#xff0c;介绍一下​最近很火的开源技术&#xff0c;低代码。 作为一种软件开发技术逐渐进入了人们的视角里&#xff0c;它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式&#xff0c;以更少的编码&#xff0c;更快速地构建和交付应用软件&#…

【无重复字符的最长子串】python,滑动窗口+哈希表

滑动窗口哈希表 哈希表 seen 统计&#xff1a; 指针 j遍历字符 s&#xff0c;哈希表统计字符 s[j]最后一次出现的索引 。 更新左指针 i &#xff1a; 根据上轮左指针 i 和 seen[s[j]]&#xff0c;每轮更新左边界 i &#xff0c;保证区间 [i1,j] 内无重复字符且最大。 更新结…

JVM学习-垃圾回收器(一)

垃圾回收器 按线程数分类 串行垃圾回收器 串行回收是在同一时间段内只允许有一个CPU用于执行垃圾回收操作&#xff0c;此时工作线程被暂停&#xff0c;直至垃圾收集工作结束 在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合&#xff0c;串行回收器的性能表…

http和https的区别,怎么免费实现https(内涵教学)

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息&#xff0c;HTTP协议以明文方式发送内容&#xff0c;不提供任何方式的数据加密&#xff0c;如果攻击者截取了Web浏览器和网站服务器之间的传输报文&#xff0c;就可以直接读懂其中的信息&#xff0c;因此&…

etcd 和 MongoDB 的混沌(故障注入)测试方法

最近在对一些自建的数据库 driver/client 基础库的健壮性做混沌&#xff08;故障&#xff09;测试, 去验证了解业务的故障处理机制和恢复时长. 主要涉及到了 MongoDB 和 etcd 这两个基础组件. 本文会介绍下相关的测试方法. MongoDB 中的故障测试 MongoDB 是比较世界上热门的文…

AI网络爬虫:批量爬取电视猫上面的《庆余年》分集剧情

电视猫上面有《庆余年》分集剧情&#xff0c;如何批量爬取下来呢&#xff1f; 先找到每集的链接地址&#xff0c;都在这个class"epipage clear"的div标签里面的li标签下面的a标签里面&#xff1a; <a href"/drama/Yy0wHDA/episode">1</a> 这个…

短视频矩阵系统4年独立开发正规代发布接口源码搭建部署开发

1. 短视频矩阵源码技术开发要求及实现流程&#xff1a; 短视频矩阵源码开发要求具备视频录制、编辑、剪辑、分享等基本功能&#xff0c;支持实时滤镜、特效、音乐等个性化编辑&#xff0c;能够实现高效的视频渲染和处理。开发流程主要包括需求分析、技术选型、设计架构、编码实…