Kubernetes 节点 Not Ready 时 Pod 驱逐机制深度解析(下)
#作者:邓伟
文章目录
- 三、深度解析:源码逻辑与调优策略
- 四、常见问题与排查
- 五、最新动态与技术演进
- 总结
三、深度解析:源码逻辑与调优策略
- TaintManager 核心源码逻辑
(1)参数定义(kube-controller-manager)
// cmd/kube-controller-manager/app/options/controller_manager.go
fs.BoolVar(&o.EnableTaintManager, "enable-taint-manager", true, "If set to true enables NoExecute Taints and will evict all not-tolerating Pod running on Nodes tainted with this kind of Taints.")
默认启用,通过命令行参数控制,生产环境不建议关闭。
(2)驱逐触发逻辑
// pkg/controller/taint/taint_manager.go
func (t *TaintManager) syncNode(node *v1.Node) {// 检查节点Taintfor _, taint := range node.Spec.Taints {if taint.Effect == v1.TaintEffectNoExecute {// 查找节点上所有Podpods := t.podLister.Pods(node.Namespace).List(selector.Empty())for _, pod := range pods {// 检查Pod是否容忍该Taintif !toleration.ToleratesTaint(pod.Spec.Tolerations, taint) {// 生成驱逐事件t.evictPod(pod, node, taint)}}}}
}
核心逻辑:遍历节点 Taint,对每个NoExecute类型的 Taint,检查 Pod 是否具备 Toleration,不满足则触发驱逐。
- 生产环境调优参数
参数名称 | 作用 | 默认值 |
---|---|---|
–node-monitor-grace-period | 节点状态未更新时的容忍时间,避免短暂网络波动触发驱逐 | 40s |
–pod-eviction-timeout | Pod 驱逐超时时间(针对 Terminating 状态的 Pod) | 5m0s |
–enable-taint-manager | 启用 TaintManager(控制驱逐逻辑) | true |
–termination-grace-period Pod | 终止宽限期(可通过 Pod.spec.terminationGracePeriodSeconds 覆盖) | 30s |
–eviction-soft | 软驱逐阈值(如memory.available<100Mi) | 无 |
–eviction-hard | 硬驱逐阈值(如memory.available<250Mi) | 无 |
- 高级场景:策略优化与风险控制
(1)混合使用 Toleration 与 NodeAffinity
# Pod配置示例
tolerations:
- key: "node.kubernetes.io/not-ready"operator: "Exists"effect: "NoExecute"tolerationSeconds: 600 # 10分钟宽限期
affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100preference:matchExpressions:- key: kubernetes.io/hostnameoperator: NotInvalues: ["node01", "node02"]
通过 Toleration 允许短暂停留,通过 NodeAffinity 引导调度到其他节点。
(2)节点问题自动检测(NodeProblemDetector)
NPD 可自动检测节点硬件故障、内核错误等,并触发对应的 Taint 添加,增强驱逐机制的智能化:
# 检测磁盘故障后添加Taint
- key: disk.errorvalue: "true"effect: NoExecute
(3)驱逐风暴防御
当多个节点同时变为NotReady时,可能触发大规模驱逐,导致集群震荡。解决方案:
- 启用节点分区容忍(–experimental-zone-migration,需谨慎评估)
- 限制单节点驱逐并发数(通过自定义控制器实现)
- 结合 HPA 动态调整副本数,避免资源过载
四、常见问题与排查
- Pod 未被驱逐的可能原因
- Toleration 配置错误:Pod 未正确设置node.kubernetes.io/not-ready的 Toleration
- TaintManager 未启用:检查kube-controller-manager的–enable-taint-manager参数
- 节点状态未正确更新:通过kubectl describe node确认Ready状态是否为False或Unknown
- 驱逐宽限期未到:若设置了tolerationSeconds,需等待宽限期结束
- 驱逐策略冲突处理
当 TaintManager 驱逐与 Kubelet 资源压力驱逐同时触发时,可能导致 Pod 重复驱逐。解决方案:
- 优先通过 Toleration 配置明确驱逐优先级
- 调整资源压力驱逐阈值(–eviction-soft/–eviction-hard)
- 使用PodDisruptionBudget限制驱逐并发数
- 驱逐后服务恢复验证
驱逐完成后,需验证以下内容:
- 新 Pod 是否成功调度到健康节点
- 服务是否保持连续性(通过负载均衡器检查)
- 持久化数据是否完整(如 PVC 挂载验证)
五、最新动态与技术演进
- Kubernetes 1.25 + 新特性
- PodSecurity Admission 稳定化:替代已废弃的 PodSecurityPolicy,强化 Pod 安全策略
- 不可重试的 Job 故障:针对基础设施故障(如驱逐)设置策略,避免无效重试
- 多 ClusterCIDR 支持:灵活扩展集群网络范围,优化 IP 资源利用率
- 未来发展方向
- 智能驱逐决策:结合机器学习预测节点故障,提前迁移 Pod
- 分层驱逐策略:针对不同业务优先级,制定差异化的驱逐规则
- 边缘节点支持:优化边缘场景下的节点状态同步与驱逐机制
总结
Kubernetes 通过 Taint/Toleration 与 TaintManager 的协同,实现了节点NotReady时的自动化 Pod 驱逐。理解这一机制的核心在于掌握:
- NodeCondition 与 Taint 的映射关系
- NoExecute 类型 Taint 的驱逐语义
- TaintManager 的触发条件与源码逻辑
在生产环境中,需结合业务场景配置合理的 Toleration 策略,调优控制平面参数,并通过监控系统(如 Prometheus+Grafana)实时追踪节点状态与 Pod 驱逐事件,确保集群在节点故障时能够优雅迁移服务,最大化服务可用性。
通过深入理解 Kubernetes 的驱逐机制,运维人员可以更高效地处理节点故障,开发团队也能针对性地设计容错性更强的应用部署方案,共同构建稳定可靠的云原生基础设施。
相关文章:
Kubernetes 节点 Not Ready 时 Pod 驱逐机制深度解析(下)
#作者:邓伟 文章目录 三、深度解析:源码逻辑与调优策略四、常见问题与排查五、最新动态与技术演进总结 三、深度解析:源码逻辑与调优策略 TaintManager 核心源码逻辑 (1)参数定义(kube-controller-manage…...

SIEMENS PLC程序解读 -BLKMOV (指定长度数据批量传输)
1、程序代码 2、程序解读 这段西门子 PLC 程序(程序段 10)实现了基于条件的数据块移动功能,具体解释如下: 条件触点: %M0.1 Always<>(TRUE)(注释为 AT<>1):当 M0.1 的值…...

初识HashMap
HashMap:无序,不重复,无索引 HashMap小练习: import java.text.ParseException; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Consumer;import static java.lang.Math.abs;public cla…...

隧道高清晰广播如何提升行车安全体验?
在隧道中行驶时,驾驶员常面临回声干扰、语音模糊、信息过载等问题,传统广播系统可能不仅未能提供有效信息,反而因噪音增加驾驶压力。高清晰广播通过数字降噪、动态音效优化等技术,显著改善驾驶员的听觉体验,进而提升行…...

从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用
文章目录 文章目标技术选型工程搭建1. 初始化项目2. 安装开发依赖3. 项目结构4. 配置文件tsconfig.json.eslintrc.jseslint.config.prettierrc.jsrollup.config.cjs创建 .gitignore文件 设置 Git 钩子创建示例工具函数8. 版本管理和发布9 工具函数测试方案1. 安装测试依赖2. 配…...
使用 Oracle 数据库进行基于 JSON 的应用程序开发
本文为“JSON-based Application Development with Oracle Database (and MongoDB compatibility)”翻译阅读笔记。 副标题为:版本 19c 和 21c,本地和云,自治JSON 数据库以及适用于 MongoDB 的 Oracle 数据库 API,版本为2022年2月…...
Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用
目录 一、背景与重要性二、CSS选择器基础与分类2.1 什么是选择器?2.2 选择器分类与语法 三、核心选择器详解与实战案例3.1 基础选择器:精准定位元素3.2 组合选择器:元素关系控制3.3 伪类与伪元素:动态与虚拟元素3…...

Cadence学习笔记之---原理图设计基本操作
目录 01 | 引 言 02 | 环境描述 03 | 原理图工具介绍 04 | 原理图设计基本操作 05 | 生成页间引用 06 | 元件自动编号 07 | 结 尾 01 | 引 言 书接上回,在前文中讲述了怎样制作常用的库元件,如电阻、二极管,IC器件,以及怎…...
从零开始学习人工智能Day5-Python3 模块
二、Python3基础语法学习 三、Python3 基本数据类型 四、Python3 数据类型转换 五、Python3 运算符 六、python基本数据类型(续) 七、Python3 控制语句 八、Python推导式 九、Python3 函数 十、Python3 数据结构 十一、Python3 模块 Python 中的模块(…...

进行性核上性麻痹饮食指南:科学膳食助力对抗疾病
进行性核上性麻痹是一种进展性神经退行性疾病,常导致患者出现吞咽困难、运动障碍等症状。科学合理的饮食不仅能为患者提供必要的营养支持,还能降低并发症风险,改善生活质量。 蛋白质是维持身体机能的关键,患者应注重优质蛋白的摄取…...
vue滑块组件设计与实现
vue滑块组件设计与实现 设计一个滑块组件的思想主要包括以下几个方面:用户交互、状态管理、样式设计和事件处理。以下是详细的设计思想: 1. 用户交互 滑块组件的核心是用户能够通过拖动滑块来选择一个值。因此,设计时需要考虑以下几点&…...

opencv函数展示4
一、形态学操作函数 1.基本形态学操作 (1)cv2.getStructuringElement() (2)cv2.erode() (3)cv2.dilate() 2.高级形态学操作 (1)cv2.morphologyEx() 二、直方图处理函数 1.直方图…...

附赠二张图,阐述我对大模型的生态发展、技术架构认识。
文章精炼,用两张图说明大模型发展业态方向,以及大模型主体技术架构。(目前还需要进一步验证我的Thought && ideas,等待机会吧.........) 图一:探究大模型三个层次应用方向,浅层次入门简…...

OpenCv高阶(九)——背景建模
目录 一、背景建模的核心目标与核心挑战 1. 核心目标 2. 核心挑战 二、背景建模模型 1、帧差法原理 2. 概率模型(Parametric Models) (1)高斯混合模型(Gaussian Mixture Model, GMM) (…...

leetcode - 字符串
字符串 466. 统计重复个数 题目 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如,str ["abc", 3] "abcabcabc" 。 如果可以从 s2( )中删除某些字符使其变为 s1,则称字符串 s1( )可以从字符串 s2 获得。 例如…...

【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理
1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解,键盘、显示器等都是文件,因为我们说过“Linux下,一切皆文件”,当然我们现在对于这句话的理解是片面的;狭义上理解,文件在磁盘上,磁盘是一…...

Freertos--统计所有任务栈信息以及CPU占比和钩子函数
一、概念 在 FreeRTOS 中统计任务栈信息和 CPU 占比是为了分析栈使用情况防止溢出、优化性能识别高负载任务、合理分配资源避免内存浪费、调试系统排查阻塞或优先级问题,有助于提升效率、确保稳定性、快速定位问题并防止崩溃,比如在你的蜂鸣器任务中可以…...

京东商品详情API接口调用技术指南
本文基于京东宙斯开放平台(JD Open API)的 jingdong.ware.product.detail.search.get 接口,提供商品详情数据获取的完整技术方案,包含参数说明、代码实现及实战避坑指南。 一、接口功能与权限 核心能力 获取商品SKU的完整信…...

基于Java(JSP)+MySQL实现深度学习的音乐推荐系统
基于深度学习的音乐推荐系统简述 本文简要介绍我做的基于深度学习的音乐推荐系统。主要从需求分析与设计实现的角度来进行介绍。 需求分析 基于深度学习的音乐推荐系统旨在以个性化音乐推荐模型为基础,使用B/S架构的形式实现。个性化推荐模型使用了 随机梯度下降…...

Linux:进程间通信---匿名管道
文章目录 1. 进程间通信1.1 什么是进程间通信?1.2 为什么进程要进行进程间通信?1.3 怎么实现进程间通信? 2. 匿名管道2.1 匿名管道的原理2.2 匿名管道的系统接口2.3 匿名管道的使用2.4 匿名管道的运用场景 序:在上一篇文章中我们知…...
C++ 类及函数原型详解
一、引言 在C 编程中,类(Class)是面向对象编程的核心概念之一,它是一种用户自定义的数据类型,封装了数据和操作数据的函数(成员函数)。函数原型则为函数的声明提供了必要的信息,让编…...

深度学习小记(包括pytorch 还有一些神经网络架构)
这个是用来增加深度学习的知识面或者就是记录一些常用的命令,会不断的更新 import torchvision.transforms as transforms toPIL transforms.ToPILImage()#可以把tensor转换为Image类型的 imgtoPIL(img) #利用save就可以保存下来 img.save("/opt/data/private/stable_si…...
声音分离人声和配乐base,vocals,drums -从头设计数字生命第6课, demucs——仙盟创梦IDE
demucs -n htdemucs --two-stemsvocals 未来之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未来之窗.mp3 伴奏提取人声分离技术具有多方面的重大意义,主要体现在以下几个领域: 音乐创作与制作 创作便利…...
深度探索多模态数据:从声音到图像的奇妙世界
深度探索多模态数据:从声音到图像的奇妙世界 在多模态深度学习的旅程中,我们不仅要了解不同数据形式的融合策略,还需要熟悉各种数据类型的特性。今天,我们将探索两种常见但极具价值的模态:音频数据和医学CT扫描。 音…...

【数据可视化-32】全球住房市场分析(2015-2024 年)数据集可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
JAVA---面向对象(下)
重生之我开始补知识第三集 1.标准 JavaBean 要求: 1)类名需要见名知意 2)成员变量使用private修饰 3)至少提供两个构造方法 a.无参构造方法 b.带全部参数的构造方法 4)成员方法 a.提供每一个成员变量对应的 …...
FPGA(现场可编程门阵列)笔记
*编程语言 - [Verilog]:硬件描述语言,语法风格类似于C语言,用于数字电路的设计。 - [SystemVerilog]:扩展自Verilog,增加了面向对象编程等特性,语法更接近于C,适用于复杂系统设计。 - [VHDL]:另一种硬件描述语言&…...

DAX Studio将PowerBI与EXCEL连接
DAX Studio将PowerBI与EXCEL连接 具体步骤如下: 第一步:先打开一个PowerBI的文件,在外部工具栏里打开DAXStudio,如图: 第二步:DAXStudio界面,点击Advanced选项卡-->Analyze in Excel&#…...

使用spring boot vue 上传mp4转码为dash并播放
1.前端实现 <template><div class"video-upload"><el-uploadclass"upload-demo"action"/api/upload":before-upload"beforeUpload":on-success"handleSuccess":on-error"handleError":show-file-…...

深入理解指针 (1)
1.内存和地址 1.1内存 1.1.1内存的使用和管理 (1)内存划分为一个个的内存单元,每个内存单元的大小是1个字节,一个内存单元可以存放8个bit。 (2)每个内存单元有一个编号,内存单元的编号在计…...