DaemonSet 滚动更新:节点一台接一台宕机,根因在更新策略
场景: DaemonSet 滚动更新 CNI 配置 → DaemonSet Pod 逐节点终止重建 → 节点逐台 NotReady路径: Pod → CRI → Node → 集群 逐层排查版本: K8s v1.25上篇讲了 Pod 调度不均衡问题——nodeAffinity 配置写反导致 Pod 挤在同一台节点资源利用率一边倒。这篇我们来看另一个因配置引发的连锁反应DaemonSet 滚动更新导致节点逐个宕机。更新一个 DaemonSet 的配置发布后节点一台接一台变成 NotReady——不是硬件故障不是 kubelet 挂了是 DaemonSet controller 的 RollingUpdate 策略在每个节点上执行 terminate → 等待 Ready → 再继续下一节点。当被终止的是 CNI 网络插件 Pod如 Calico节点网络瞬间断连kubelet 的 NodeStatus 上报超时node controller 直接判 NotReady。K8s 的 RollingUpdate 只保证你的 Pod 被替换——不保证你的节点还在线上。【坐标】→ 节点逐台失联现象很直接发布一个 DaemonSet 配置更新后监控面板上节点开始一台一台变红。用kubectl get nodes -w能看到 Node 状态变化的时间线——间隔大约 1-2 分钟一台完全跟 DaemonSet 滚动更新的节奏吻合。kubectl describe node node-name查看 NotReady 节点的 ConditionConditions: Type Status LastHeartbeatTime Reason Message ---- ------ ----------------- ------ ------- Ready Unknown... NodeStatusUnknown Kubelet stopped postingnodestatus.... MemoryPressure False... DiskPressure False...关键信息Kubelet stopped posting node status——kubelet 不再上报心跳。不是 kubelet 进程挂了是它无法跟 API server 通信了。这里立即引发直觉kubelet 的网络依赖什么答案是 CNI 插件Container Network Interface它通常以 DaemonSet 形式运行在每个节点上。如果 CNI Pod 被终止了节点就失去了网络能力。— 去查 DaemonSet 状态。Pod 层kubectl get pods -n kube-system -l k8s-appcalico-node -w。DaemonSetDaemonSet——在每个节点上运行一个 Pod 的控制器常用于网络插件、监控代理等基础设施组件正在逐节点更新新 Pod 全部卡在 Init 阶段。【分层】→ 逐层排查排查路径从 Pod 内日志/Events出发逐层往下到 CRI 运行时再到 Node 层面最后看集群范围。不跳过任何一层。Pod 层DaemonSet 更新序列kubectl describe daemonset calico-node -n kube-system确认更新策略。C2 — DaemonSet controller 的 RollingUpdate 逻辑DaemonSet controller 在 RollingUpdate 模式下每次选择一个节点终止其上的旧 Pod等待新 Pod 变为 Ready然后才继续下一个节点。maxUnavailable: 1意味着同一时间最多只有一个节点的 Pod 处于不可用状态。这不是并发的——是逐节点的串行操作。当新 Pod 永远无法 Ready 时controller 卡在当前节点不再继续更新其他节点。但这里的现象是节点逐个宕机——说明新 Pod 虽然没 Ready但旧 Pod 已经被终止了节点网络已经断了。kubectl logs calico-node-def34 -n kube-system看不到日志Pod 在 Init 阶段需要用crictlCRI 命令行工具用于直接与容器运行时交互比 kubectl logs 能看到已退出容器的历史日志查已退出的 Init Container。CRI 层CNI 容器启动失败先找到节点上的容器 ID# 在 NotReady 节点上执行crictlps-a|grepcalicocrictl ps -a | grep calico输出如下CONTAINER IMAGE CREATED STATE NAME a1b2c3d4e calico-node:v3.262minutes ago Exited install-cni e5f6g7h8i calico-node:v3.261minute ago Exited calico-node两个容器都 Exited。crictl logs a1b2c3d4e看 Init Container 输出2026/07/0310:22:15[INFO]Installing CNI binaries...2026/07/0310:22:16[ERROR]Failed to create CNI config: configfile/host/etc/cni/net.d/10-calico.conflist not found根因明确新版本 Calico 的 CNI 配置文件路径变了旧配置挂载没有覆盖新路径导致 CNI 安装失败。节点上没有 CNI 配置 → kubelet 无法设置 Pod 网络 → 节点失去网络能力。Node 层kubelet 心跳断连journalctl -u kubelet -f --since 10 minutes ago查看 kubelet 日志Jul 0310:22:20 node-1 kubelet[1234]: E Failed to updatenodestatus: Posthttps://api-server:6443/api/v1/nodes/node-1/status:dial tcp10.0.0.1:6443: connect: no route tohostJul 0310:22:30 node-1 kubelet[1234]: E Failed to updatenodestatus:...C2 解释kubelet 每隔 10s--node-status-update-frequency向 API server 报告一次 Node 状态。当 CNI 不可用kubelet 无法通过网络连接 API serverNodeStatus 上报连续超时。node controllercontroller-manager 内的节点管理组件负责监控节点心跳状态在--node-monitor-grace-period默认 40s内没收到上报将 Node 标记为Unknown再过--node-monitor-period默认 5s标记为NotReady。时间线时间事件T0sDaemonSet controller 终止 node-1 的 calico-node PodT5sCNI 配置丢失节点网络断连T10skubelet 首次上报失败T40snode controller 标记 node-1 为 UnknownT50snode controller 标记 node-1 为 NotReadyT60sDaemonSet controller 继续下一个节点用maxUnavailable: 1的串行滚动集群层DaemonSet controller 的 RollingUpdate回到集群视角。DaemonSet controller 的行为是保证每个节点上有一个 Pod 运行它在滚动更新时并不知道节点的网络能力依赖它的 Pod。controller 的职责边界止于 Pod 生命周期——它检查新 Pod 是否 Ready不是检查节点是否 Ready。# DaemonSet controller 的逻辑简化for each node:terminate old Pod on node create new Pod on node wait for new Pod to become Readyif timeout:stop,dont continueelse:next node这个循环里新 Pod 的 ready 检查依赖于 kubelet 的健康检查。但 kubelet 的健康检查依赖于 CNI。CNI 依赖于 DaemonSet 自己。这是一个循环依赖——DaemonSet controller 不知道也无法知道。【路径】→ 下次先查 DaemonSet 状态遇到节点逐台宕机第一反应不是查节点——是查 DaemonSet。# 1. 看哪个 DaemonSet 在滚动更新kubectl rollout status daemonset--all-nkube-system# 2. 看更新策略kubectl describe daemonsetname-nns|grep-A5UpdateStrategy# 3. 看 DaemonSet Pod 更新序列kubectl get pods-nkube-system-lk8s-appapp-w# 4. 看 Node NotReady 时间线kubectl get nodes-owide|grepNotReady# 5. 定位节点失联时间点kubectl describenodenode-name|grep-A10Conditions判断标准如果 NotReady 节点的数量和时间跟某个 DaemonSet 的 Pod 终止节奏吻合——问题在 DaemonSet不在节点。【定位】→ 最常误判❌ 大多数人会这么查“节点 NotReady → 登录节点查 kubelet 状态 → systemctl restart kubelet → 短暂恢复 → 又挂了 → 再重启 → 重复。”浪费大量时间在节点层打转重启 kubelet 只是暂时恢复了网络连接但 CNI 问题没解决网络会再次断连。✅ 正确的排查思路遇到节点逐个宕机先做两件事检查 DaemonSet 状态kubectl rollout status daemonset --all -n kube-system——看是否某个 DaemonSet 正在更新对比时间线DaemonSet Pod 终止时间 vs Node NotReady 时间如果吻合直接定位到 DaemonSet。然后如果是 CNI 插件 DaemonSet → 节点网络依赖它更新前必须评估对节点网络的影响如果是其他基础设施 DaemonSetlog agent / monitoring agent→ 影响范围较小但同样可能引发级联问题两者的差异前者从节点现象出发Node NotReady后者从集群视角出发DaemonSet 更新 时间线交叉。不出节点层永远找不到根因。【标点】→ 修复 Check-list紧急止损直接回滚 DaemonSet 到上一个版本kubectl rollout undo daemonset/calico-node-nkube-system回滚后DaemonSet controller 重新在每个节点上创建旧版本的 Pod。CNI 恢复节点网络恢复kubelet 重新上报node controller 将 Node 状态恢复为 Ready。回滚效果对比# before: 新版本 CNI 配置路径不对volumes:-name:cni-configconfigMap:name:calico-config-v2# ❌ 新路径新版本# after: 旧版本volumes:-name:cni-configconfigMap:name:calico-config# ✅ 旧路径正常工作预防配置# 方案 AmaxUnavailable: 25%先建后删比例updateStrategy:rollingUpdate:maxUnavailable:25%# 方案 BOnDelete手动控制每台节点更新updateStrategy:type:OnDelete# 方案 C加 PodDisruptionBudgetPDB - Pod 中断预算保证最少可用的 Pod 数量apiVersion:policy/v1kind:PodDisruptionBudgetmetadata:name:calico-node-pdbnamespace:kube-systemspec:minAvailable:90%selector:matchLabels:k8s-app:calico-nodemaxUnavailable: 25%限制同时不可用的 Pod 数不会整节点断网OnDelete策略要求手动删除 Pod 才触发更新适合 CNI 等关键基础设施PDB 保证至少 90% 的节点有 CNI 可用排查 Check-list故障排查的终点不是修好了——是把排查路径写成 check-list。□ 发现节点逐台 NotReady → 先查 DaemonSet kubectl rollout status daemonset--all-nkube-system □ 确认滚动更新 kubectl describe daemonsetname-nkube-system|grep-A5UpdateStrategy □ 确认 DaemonSet Pod 终止时间线 kubectl get pods-nkube-system-lk8s-appapp-w□ 确认节点 NotReady 时间线 kubectl get nodes-owide|grepNotReady kubectl describenodenode-name|grep-A10Conditions □ 回滚止损 kubectl rollout undo daemonset/name-nkube-system □ 排查新版本配置差异 kubectl describe daemonsetname-nkube-systembefore.yaml# 对比版本间 ConfigMap / 环境变量 / 卷挂载变化□ 验证回滚后节点恢复 kubectl get nodes-wkubectl get pods-nkube-system-lk8s-appapp-w附完整命令清单# 查看 DaemonSet 滚动更新状态kubectl rollout status daemonset/calico-node-nkube-system# 查看 DaemonSet 更新策略kubectl describe daemonset/calico-node-nkube-system|grep-A5UpdateStrategy# 查看 DaemonSet Pod 状态持续监听kubectl get pods-nkube-system-lk8s-appcalico-node-w# 查看节点状态kubectl get nodes-owide kubectl describenodenode-name|grep-A10Conditions# 回滚 DaemonSetkubectl rollout undo daemonset/calico-node-nkube-system# 查看 DaemonSet 历史版本kubectl rollouthistorydaemonset/calico-node-nkube-system# 回滚到指定版本kubectl rollout undo daemonset/calico-node-nkube-system --to-revisionN# 节点上查看已退出容器CRI 层crictlps-a|grepcalico crictl logscontainer-id# 查看 kubelet 日志journalctl-ukubelet-f--since30 minutes ago下篇我们聊 DaemonSet OnDelete vs RollingUpdate 选择陷阱——什么场景该用哪种策略以及为什么你的基础设施 DaemonSet 应该用 OnDelete。

相关新闻

# TCP和UDP到底有什么区别?一篇文章彻底搞懂两种网络通信协议

# TCP和UDP到底有什么区别?一篇文章彻底搞懂两种网络通信协议

TCP和UDP到底有什么区别?一篇文章彻底搞懂两种网络通信协议 前言 在嵌入式开发、服务器开发、物联网设备以及网络通信领域,经常会遇到两个非常重要的协议: TCPUDP 很多初学者都会问: TCP和UDP到底有什么区别?为什么…

2026/8/8 10:36:24 阅读更多 →
知识蒸馏实战:从ResNet-50到ResNet-18的模型压缩与部署指南

知识蒸馏实战:从ResNet-50到ResNet-18的模型压缩与部署指南

在实际 AI 应用开发和模型部署的语境下,“蒸馏”通常指知识蒸馏(Knowledge Distillation),这是一种将大型、复杂模型(教师模型)的知识迁移到小型、轻量模型(学生模型)中的技术。其核…

2026/8/8 10:36:24 阅读更多 →
在Yank Note中集成AI:打造高效Markdown写作工作流

在Yank Note中集成AI:打造高效Markdown写作工作流

1. 项目概述:当Markdown编辑器遇上AI作为一名长期与文字和代码打交道的创作者,我一直在寻找一个能让我“沉浸式”写作,同时又能无缝整合现代AI能力的工具。传统的Markdown编辑器要么功能过于简陋,要么为了追求大而全变得异常臃肿&…

2026/8/8 10:36:24 阅读更多 →

最新新闻

2025黑苹果完整指南:从零开始打造稳定macOS系统的终极方案

2025黑苹果完整指南:从零开始打造稳定macOS系统的终极方案

2025黑苹果完整指南:从零开始打造稳定macOS系统的终极方案 【免费下载链接】Hackintosh Hackintosh long-term maintenance model EFI and installation tutorial 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintosh 对于希望在非苹果硬件上体验macOS系…

2026/8/8 11:33:06 阅读更多 →
技术人专属:从需求分析到智能集成,打造高效舒适工作空间的窗户设计指南

技术人专属:从需求分析到智能集成,打造高效舒适工作空间的窗户设计指南

最近在帮朋友做一个小型工作室的改造,发现很多开发者朋友在装修或改造自己的办公/学习空间时,对“窗户怎么设计”这个问题感到非常头疼。这看似是个装修问题,但其实和我们的工作效率、身心健康、设备安全(比如电脑防尘防晒&#x…

2026/8/8 11:33:06 阅读更多 →
G-Helper启动故障终极排查指南:从症状识别到系统级修复

G-Helper启动故障终极排查指南:从症状识别到系统级修复

G-Helper启动故障终极排查指南:从症状识别到系统级修复 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, E…

2026/8/8 11:33:06 阅读更多 →
联想游戏本性能为何总被封印?解锁硬件潜力的开源利器探索

联想游戏本性能为何总被封印?解锁硬件潜力的开源利器探索

联想游戏本性能为何总被封印?解锁硬件潜力的开源利器探索 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionToolkit 你是否…

2026/8/8 11:33:06 阅读更多 →
RC模型车电调一拖四电机连接风险与安全驱动方案详解

RC模型车电调一拖四电机连接风险与安全驱动方案详解

玩RC车,尤其是自己动手改装或组装时,最让人头疼的不是调参数,而是接错线。一个看似简单的“一拖二”电调连接,背后是电源分配、信号同步、电机转向和物理负载的复杂平衡。很多新手,甚至一些有经验的玩家,都…

2026/8/8 11:33:06 阅读更多 →
AI赋能知识管理:构建智能第二大脑的方法论与工具链实践

AI赋能知识管理:构建智能第二大脑的方法论与工具链实践

1. 项目概述:当知识管理遇上AI,会发生什么? 作为一名在知识管理和效率工具领域折腾了十多年的老博主,我亲眼见证了从纸质笔记本到云笔记,再到如今AI全面渗透的整个过程。最近几年,我自己的知识库规模膨胀到…

2026/8/8 11:32:05 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →