清晨六点,城市还没完全醒来,但你住的那栋老居民楼已经热闹起来——工人们正小心翼翼地更换楼里的老旧水管。楼里的住户照常洗漱、做饭、上班,只是偶尔会听到墙内传来敲击声。物业早就贴出了通知:这周末要分批次更换水管,每层楼停水不超过二十分钟,谁家马桶坏了马上有人来修,实在不行还有备份水箱顶上。这正是 Kubernetes 集群升级的日常——它是一座“永不关门的城市”,里面的每个服务都像住户,而运维团队就是那支物业维修队。你要翻新这座城市的基础设施(升级节点、更换容器运行时、更新控制平面),却不能让任何一个居民(服务)感知到明显的停水停电。这就是 Kubernetes 集群升级与维护策略:在住户无感的前提下,安全、平滑、可回滚地完成整座城市的基础设施翻新。
掌握集群升级与维护策略,是云原生运维工程师从“会部署”走向“能担责”的分水岭——它直接决定生产环境的稳定性与团队应对故障的底气,是晋升资深 DevOps、架构师的必备能力。
可视化演示
展示Kubernetes集群版本升级策略、滚动更新流程与回滚方案,可视化Pod逐个替换过程和维护窗口规划。
本节配有交互动效(进入视口后自动加载,约 3KB)。
K8s集群版本升级流程 从当前版本逐步升级到目标版本,每步验证集群健康状态 v_n→v_n+1 逐版本升级确保集群稳定性
升级前准备
想象物业维修队要翻新一栋老楼——他们绝不会拎着工具箱直接冲进楼里就开始砸墙。第一件事一定是翻出整栋楼的设计图纸,检查每面墙能不能拆,每根水管接在哪。Kubernetes 集群升级前同样需要一套“图纸检查”:备份集群状态快照,就像给整栋楼拍一套完整的 X 光片留底;检查资源水位,确认楼里的水电余量是否足够支撑施工期间的临时负荷;评估应用兼容性,逐户确认新水管的口径和旧龙头是否能接上。
升级前准备的核心是三个动作。首先是状态备份,使用 etcd 快照备份集群的“大脑”——etcd 中存储了集群全部期望状态,包括每个 Pod、Service、ConfigMap 的定义。一旦升级中控制面损坏,这份快照就是唯一的“时光机”。其次是资源水位检查,升级过程中节点会被逐个排空,Pod 需要迁移到其他节点,如果集群总资源余量不足,迁移就会像高峰期的地铁一样拥挤甚至崩溃。最后是应用兼容性评估,Kubernetes API 在版本迭代中会有废弃和变更,需要用 kubectl convert 等工具提前校验现有资源定义是否兼容目标版本。
提前花一天做好备份和评估,远比升级失败后花一周抢救要划算。物业队常说的一句话是:“图纸画得越细,砸墙越安心。”这份安心,就是升级前准备的全部意义。
- 未备份状态数有多少核心配置没有做快照备份。每一条未备份的配置,都是升级失败后无法恢复的一处“断壁残垣”。
- 不兼容 API 数目标版本中已废弃或变更的 API 资源数量,旧版本清单文件在新版本中可能直接无法识别。
- 资源余量比例集群当前可分配的 CPU/内存余量占总容量的比例,反映迁移时的“缓冲空间”。
版本策略规划
翻新老楼时,有经验的物业队绝不会使用市面上最新款但没人用过的水管——他们一定选择那些经过大批小区验证、口碑稳定的型号。Kubernetes 版本选择也一样:永远不要追最新版,选择 N-1 稳定版。社区每三个月发布一个小版本,每个版本的支持周期约为一年,而 N-1 版本意味着它已经经过了大量生产环境的检验,已知的坑都被前人踩平了。
理解版本策略要先看懂 Kubernetes 的语义化版本规则:版本号形如 v1.29.3,从左到右分别是主版本、次版本、补丁版本。主版本变更意味着不兼容的大改动,次版本增加新功能,补丁版本只修 bug。集群升级遵循“小步快跑”原则,一般只升一个次版本(如 1.28 → 1.29),尽量不跨多个次版本跳级——跳版本升级就像让一个习惯开手动挡的老司机直接去开航天飞机,中间的 API 变更、配置格式变化全部叠加在一起,出了问题几乎无法定位。社区还提供了版本升级路径图(升级路径),Kubernetes 官方只保证连续两个次版本之间的升级路径是受支持的。
版本策略的精髓在于“克制”。物业队的老师傅常说:“翻新楼不怕慢,就怕步子迈太大扯着蛋。”每次只升一个版本,走一步看一步,是所有大型集群升级的共识。
- k 系数集群复杂度系数,节点数越多、应用越多样,k 值越大。这是每支物业队对自己楼宇“脾气”的量化评估。
- 升级跨度目标版本号与当前版本号的差值,每差一个次版本记 1。
- 平方放大风险随跨度呈平方增长,因为跨版本会叠加 API 变更、行为变更、配置迁移等多重因素。
滚动更新流程
真正的翻新施工开始了。物业队的做法是“一层楼一层楼地换”:先把一层楼的住户临时安置到别的楼层(节点排空),然后施工队进场换水管(升级节点),换完后让住户搬回来并观察几天(恢复与观察),确认没问题再开始下一层。Kubernetes 的滚动更新正是这个逻辑——逐个节点升级,同时保证整个集群中不可用的副本数不超过设定阈值。
滚动更新的关键参数有两个:maxUnavailable(最大不可用数)和 maxSurge(最大峰值数)。maxUnavailable 表示升级过程中允许有多少个 Pod 同时不可用,设为 1 意味着“最多只有一户人家暂时停水”;maxSurge 表示允许临时多启动多少个 Pod,设为 1 意味着“虽然只有一套新房,但可以先多租一间临时房再开工”。节点升级的具体流程是:先对节点执行 kubectl drain,优雅地驱逐该节点上所有 Pod(就像先帮住户搬家),然后升级节点系统组件和 kubelet,最后执行 kubectl uncordon 让节点重新接收 Pod。只有当前节点上所有 Pod 都恢复健康(即“新住户安顿好”),才能推进到下一个节点。
滚动更新的核心智慧是“永远留一只手扶着墙”:一批没稳,绝不动下一批。物业队的施工台上永远摆着一部对讲机,随时准备喊停——这正是滚动更新的安全绳。
- drain 时间排空第 i 个节点上所有 Pod 所花费的时间,取决于 Pod 数量与优雅终止期限。
- upgrade 时间节点系统组件与 kubelet 升级到目标版本的时间,通常由发行版包管理器控制。
- 观察期升级完成后节点重新调度 Pod 并确认所有副本 Running 且 Ready 的等待时间。
维护窗口规划
再熟练的施工队也不会在早高峰时更换主干道水管。维护窗口就是运维团队为升级施工划定的“夜间时段”——在业务流量最低的时段执行升级,把潜在影响降到最小。规划维护窗口不是简单选个周末,而是要综合考虑业务周期、时段流量、团队响应能力三个因素。
维护窗口规划有三层考量。第一层是选择业务低峰:电商平台选凌晨 2 点到 6 点,金融系统选周末,SaaS 服务要分析历史流量曲线找到真正的“谷底”。第二层是时间预算分配:将窗口总时长按比例分配给升级执行、观察验证、应急处理三个环节,一般建议执行占 50%、观察占 30%、应急预留占 20%。第三层是干系人通知:提前在运维公告群、值班日历、监控大屏上发布维护通告,让所有相关方知道“这段时间施工,可能有点动静”。值得注意的是,Kubernetes 本身有PodDisruptionBudget(PDB)机制——它像一道保险丝,规定自愿干扰(如节点维护)时最少要保持多少 Pod 可用,一旦触及下限,drain 操作就会阻塞等待。
维护窗口不是流程的摆设,而是给“意外”准备的礼物。物业队的老话是:“施工时间留得宽,半夜才不会接到住户的骂街电话。”
- 执行时间实际执行节点排空、升级、恢复操作所需的时间,由节点数和单节点耗时决定。
- 观察时间升级完成后验证核心应用健康的时间,覆盖滚动升级的观察期需求。
- 应急预留为意外情况预留的缓冲时间,若未出问题则提前结束窗口,释放给后续操作。
健康检查机制
新水管装好后,怎么知道它真的能用?物业队的做法是:打开水龙头试水,再让住户实际用两天。Kubernetes 的健康检查机制正是这套“试水”流程的自动化版本。它通过三类探针持续监听每个 Pod 的状态,确保升级过程中任何异常都能被第一时间发现。
Kubernetes 提供三种探针。存活探针(LivenessProbe)回答“容器还活着吗”——如果探针失败,kubelet 会杀掉容器并重启它,就像发现住户家水管爆了,直接关掉总阀再重新打开。就绪探针(ReadinessProbe)回答“容器准备好接收流量了吗”——如果探针失败,Pod 会被从 Service 的端点列表中移除,不再接收新请求,就像在住户家门上挂一块“暂停营业”的牌子,但人还在屋里。启动探针(StartupProbe)则专门保护启动缓慢的应用,给它一段“预热期”再开始执行存活检查。在升级场景中,就绪探针尤其重要:节点升级完成后,Pod 重新调度到新节点,只有就绪探针确认 Pod 真正能服务时,流量才会切过去。
健康检查就是升级施工的“监理”。物业队交房前一定会请第三方监理逐户验水,而 K8s 的探针就是这个不讲情面、时刻盯着的监理员。
- 就绪探针通过就绪探针返回成功,表示 Pod 已具备处理请求的能力,指示函数输出 1,否则为 0。
- 存活探针失败存活探针返回失败,表示容器进入异常状态需要重启,指示函数输出 1 时整个可用性归零。
回滚应急预案
即使准备再充分,翻新也可能出意外——新水管和旧接口不匹配,楼上漏水泡了楼下。这时物业队的第一反应不是现场修水管,而是立刻换回旧水管,先恢复供水再说。Kubernetes 集群升级同样遵循“回滚优先”原则:一旦升级后发现异常,首要动作是快速回到升级前版本,而不是在问题版本上排查修复。
回滚方案的关键在于提前准备。第一,升级前必须保留所有节点的旧版本镜像和安装包——就像物业队把旧水管整齐码在仓库里,随时能调出来。第二,明确回滚触发条件:例如“升级后 30 分钟内核心应用错误率超过 5%”“etcd 健康检查失败”“超过 3 个节点出现 NotReady”,满足任一条件立即启动回滚。第三,回滚操作要像消防演练一样预先排练:在测试环境完整走一遍回滚流程,确保步骤文档真实可靠。回滚的粒度也有讲究——如果只是单个组件异常(如 kubelet 升级失败),可以只回滚该组件;如果是控制面整体异常,则需要用之前备份的 etcd 快照恢复整个集群状态。
回滚不是失败,而是预案的胜利。物业队的老师傅最骄傲的一句话不是“我们从未出过问题”,而是“出了问题,我们十分钟内恢复了供水”。
- 错误率阈值核心应用在升级后一段时间内的请求错误率,是衡量升级是否引入回归的首要指标。
- etcd 健康条件etcd 集群是否达到法定人数并正常响应读写请求,这是控制面健康的地基。
升级后验证
施工队收工了,但物业队的工作还没结束——他们还要逐户回访:水压够不够?水质有没有变?有没有新的漏水点?升级后验证是升级流程的最后一道关卡,它确认的不只是“版本号变了”,而是“系统真的和升级前一样好,甚至更好”。
升级后验证包含四个层面。第一,版本信息核验:确认所有节点和控制面组件的版本一致且符合预期,用 kubectl get nodes 检查每个节点的 Kubelet 版本,用 kubectl version 核对客户端与服务端版本。第二,控制面健康确认:检查 etcd、kube-apiserver、kube-controller-manager、kube-scheduler 等核心组件的运行状态和日志,确认无异常错误。第三,工作负载状态检查:遍历所有命名空间,确认 Deployment、StatefulSet 的副本数全部达到期望值,Pod 全部 Running 且 Ready。第四,性能基线对比:将升级后的 CPU 使用率、内存占用、API 响应延迟与升级前一周的基线数据对比,偏差在合理范围内才算真正通过。
升级后验证是一次“彻底的竣工验收”。物业队在交还钥匙前,会拿着验收单逐项打勾——这份严谨,是对整栋楼住户的负责。
- 版本正确性每个组件的版本号必须等于目标版本,且节点间版本差异在允许范围内。
- 性能偏差升级后关键性能指标与基线相比的浮动幅度,通常取 CPU 和延迟两项的最大偏差。
风险控制清单
最后,把整个翻新工程的经验凝结成一张“风险控制清单”。它是物业队的施工手册,也是下一次翻新时打开就能用的标准作业程序。Kubernetes 集群升级的风险控制核心是建立三道防线。
第一道防线是资源水位阈值:设定集群资源使用率的警戒线(如 CPU 70%、内存 75%),一旦超过阈值立即暂停升级推进,避免节点排空引发的 Pod 迁移把集群压垮。第二道防线是灰度批次阈值:控制每批升级的节点数量,小集群(≤10 节点)建议每批 1 个节点,中大型集群(>50 节点)每批不超过总数的 10%,每批完成后必须确认观察期通过才能继续。第三道防线是关键应用保障:为核心业务应用设置 PodDisruptionBudget,并用 priorityClassName 标记高优先级 Pod,确保升级导致的驱逐不会影响关键服务。此外,整个升级过程应有专人盯守监控大屏,实时观察 Pod 调度、节点状态、应用错误率三类指标,做到“异常即暂停、暂停即排查、排查不过即回滚”。
风险控制清单的意义在于“把经验变成制度”。物业队的老队长退休时,留给新队长最值钱的东西不是工具,而是那本写满注意事项的施工手册——这就是风险清单的价值。
- 资源水位集群整体 CPU 或内存的使用率,取两者中的较大值,是判断“还有没有余量”的核心指标。
- 错误率升级期间核心应用的请求错误率,配合资源水位共同决定风险等级。
AI 应用场景
场景一:电商大促前的集群升级编排
阶段:运维策略规划与自动化执行
解决的问题:电商平台在大促前需要升级 K8s 集群以修复安全漏洞,但直接升级可能导致服务抖动、影响用户体验。传统方式是“赌运气式升级”——选个凌晨直接操作,出了问题靠人工抢修,极易造成长时间故障。借助本文的升级前准备、滚动更新流程和维护窗口规划方法,结合 AI 辅助的异常检测,可以在升级过程中实时分析监控数据,自动识别异常模式并在阈值触发时暂停升级。AI 系统还能根据历史流量数据智能推荐最优维护窗口,将升级对业务的影响降到最低。
具体案例:某头部电商平台在大促前一周完成 1.29.0 → 1.30.0 集群升级。运维团队首先通过 AI 流量预测模型分析出周三凌晨 3:00-5:00 为流量最低谷,随后按照“备份 → 检查 → 分批滚动”的流程执行升级。AI 监控系统在升级第 4 批节点时检测到订单服务错误率从 0.5% 攀升至 3%,自动触发了“暂停升级并回滚上一批”的策略,运维人员排查发现是新版 kube-proxy 与特定内核版本的兼容问题,绕过后继续升级,最终零故障完成。
场景二:金融系统维护窗口的 AI 辅助决策
阶段:风险评估与决策支持
解决的问题:金融系统的集群升级必须严格满足监管合规要求,任何一次失误都可能造成严重事故。传统方式依赖运维专家的个人经验判断“何时升、怎么升、要不要回滚”,主观性强且难以沉淀为组织能力。本文的维护窗口规划、健康检查机制和风险控制清单,结合 AI 辅助决策系统,可以将升级风险评估量化——AI 实时分析集群数百个指标(etcd 延迟、Pod 调度耗时、API 错误率),输出风险热力图并建议是否继续推进升级或启动回滚,让决策从“凭感觉”变为“看数据”。
具体案例:某股份制银行的核心支付系统进行季度例行升级,AI 风险控制系统在升级过程中监测到 etcd 的 fsync 延迟异常升高,系统自动将风险等级从“绿”提升至“黄”,建议放慢升级节奏并延长观察期。运维团队据此调整批次间隔,最终平稳完成升级——AI 的提前预警避免了可能出现的 etcd 超时事故。
Python 演示
import randomimport time class RollingUpgrader: def __init__(self, node_count, batch_size=1, error_threshold=0.05): self.node_count = node_count self.batch_size = batch_size self.error_threshold = error_threshold self.updated_nodes = 0 self.rolled_back = False self.pod_count = 0 def drain_node(self, node_id): """模拟排空节点:驱逐 Pod,等待优雅终止""" pods = random.randint(5, 15) print(f" 排空节点 {node_id}: 驱逐 {pods} 个 Pod") self.pod_count += pods time.sleep(0.1) def upgrade_node(self, node_id): """模拟升级节点系统组件与 kubelet""" print(f" 升级节点 {node_id}: kubelet v1.29 -> v1.30") time.sleep(0.1) def health_check(self): """模拟观察期:检查核心应用错误率""" error_rate = random.uniform(0, 0.08) print(f" 观察期错误率: {error_rate:.2%}") return error_rate def should_rollback(self, error_rate): """根据错误率阈值决定是否回滚""" return error_rate > self.error_threshold def rollback(self): """模拟回滚:恢复旧版本镜像""" print("!!! 错误率超限,立即回滚到 v1.29 !!!") self.rolled_back = True def run(self): """执行滚动升级主流程""" print(f"开始滚动升级: 共 {self.node_count} 个节点,每批 {self.batch_size} 个") while self.updated_nodes < self.node_count: batch = min(self.batch_size, self.node_count - self.updated_nodes) print(f"--- 处理第 {self.updated_nodes // self.batch_size + 1} 批 (节点 {self.updated_nodes}~{self.updated_nodes + batch - 1}) ---") for i in range(batch): node_id = self.updated_nodes + i self.drain_node(node_id) self.upgrade_node(node_id) error_rate = self.health_check() if self.should_rollback(error_rate): self.rollback() return False self.updated_nodes += batch print(f" ✅ 本批完成,已升级 {self.updated_nodes}/{self.node_count} 个节点") time.sleep(0.2) print(f"🎉 升级完成!共迁移 {self.pod_count} 个 Pod,未触发回滚") return True if __name__ == "__main__": random.seed(42) upgrader = RollingUpgrader(node_count=6, batch_size=2, error_threshold=0.05) success = upgrader.run() print(f"升级结果: {'成功' if success and not upgrader.rolled_back else '已回滚'}")
error_threshold 和 batch_size 参数,读者可以直观感受不同策略对升级安全性的影响。drain_node(node_id)模拟kubectl drain驱逐 Pod 的过程,Pod 数量按节点随机生成health_check()模拟观察期的错误率检查,随机生成 0%-8% 的错误率should_rollback(error_rate)核心决策函数:错误率超过 5% 即触发回滚self.updated_nodes += batch一批节点全部通过观察期后才推进计数,体现“稳一批走一批”的原则random.seed(42)固定随机种子,保证每次运行结果可复现,便于测试不同参数
常见误区
误区“Kubernetes 发布了新版本,我当然要用最新的,不然就落后了。”很多初学者认为最新版本功能最全、性能最好,直接在生产集群上追新。
正解最新版本往往意味着最少的生产环境验证。Kubernetes 社区的最佳实践是选择 N-1 版本,即比最新版落后一个次版本的稳定版。就像翻新老楼不会用刚出厂、没人用过的新型水管——等它在别的小区(生产环境)跑稳了再引进。此外,新版本可能引入未发现的 bug 或行为变更,直接升级会带来不可预知的风险。
为何常见:技术人普遍有“追新”心理,且互联网上关于新版本的宣传最多。但生产环境追求的不是功能最新,而是风险最低。
误区“集群升级不就是执行 `kubeadm upgrade apply` 嘛,跑完就结束了。”初学者把升级理解成单条命令,忽略了前置准备和后续验证。
正解升级是一个完整的生命周期过程。升级前的备份、兼容性评估、维护窗口规划,升级中的分批排空、健康检查、异常处理,升级后的版本核验、性能对比,缺一不可。单条命令只是众多环节中的一个动作,就像按一下电梯按钮不等于到了顶楼——中间还有楼层要一层层经过。kubeadm upgrade apply 只升级控制面组件,之后还要手动升级每个节点的 kubelet 和 kube-proxy。
为何常见:教程和文档往往聚焦命令用法,很少展示完整的运维流程。初学者容易把“命令能跑”等同于“升级完成”。
误区“升级失败了,把旧版本重新装回去不就行了?”认为回滚是简单重复升级的反向操作。
正解回滚远比“反向升级”复杂。如果控制面已升级到新版本,直接装回旧版可能导致 etcd 数据格式不兼容——新版 etcd 写入的数据旧版可能读不了。正确的回滚策略是:升级前备份 etcd 快照,回滚时用快照恢复集群状态到升级前的“时间点”,再安装旧版本组件。这就像把房子翻新后发现新电路和旧灯具不匹配,不能只把电线换回去,还要确保配电箱的配置也恢复到原来的状态。
为何常见:人们习惯用“装软件”的思维理解集群升级,忽略了 Kubernetes 是有状态分布式系统,数据格式的前后兼容性是回滚能否成功的关键。
误区“为了保险起见,把维护窗口定得越长越好,反正没人用。”认为时间充裕等于安全。
正解维护窗口过长反而增加风险。窗口长度意味着系统处于“变更中”的不稳定状态,拖得越久,其他因素(如业务突发流量、外部依赖变化)干扰升级的概率越大。业界实践是“窗口越短越好,但必须包含应急预留”。理想窗口是执行时间 + 观察时间 + 20% 应急预留。就像手术台上的麻醉时间——不是越长越安全,而是在保证手术顺利完成的前提下越短越好。
为何常见:初学者容易把“准备充分”误解为“时间充足”,忽略了长时间变更窗口本身就是一个风险源。
误区“所有节点都 Running 了,版本号也对了,升级成功了!”把“状态正常”等同于“一切正常”。
正解版本正确和状态 Running 只说明“装好了”,不代表“运行得好”。真正的验证要对比升级前后的性能基线,包括但不限于 API 响应延迟、Pod 调度耗时、etcd 写延迟等指标。升级后应至少保持 24-72 小时的观察期,期间像平常一样关注监控告警。物业队交房后还会安排“回访”——过几天再问问住户有没有漏水,就是这个道理。
为何常见:人们习惯用二值思维(成功/失败)看待升级,而忽略了分布式系统的性能劣化往往是渐进的,需要时间窗口才能暴露。
面试题
Q1. 升级 Kubernetes 集群前,以下哪项准备工作最关键?
- A.清理所有命名空间下的无用 Pod
- B.备份 etcd 集群状态快照← 正确答案
- C.删除所有旧版本的 ConfigMap
- D.重启所有工作节点以清理缓存
答案:B。etcd 存储了集群的完整期望状态,升级失败时快照是唯一能恢复集群到升级前状态的“时光机”。清理 Pod、删除 ConfigMap、重启节点都是破坏性操作,反而会增大升级风险,就像翻新前先砸坏几面墙而不是留好图纸。
Q2. Kubernetes 滚动升级中,maxUnavailable 参数的含义是:
- A.升级过程中最多允许多少个节点同时离线
- B.升级过程中最多允许有多少个 Pod 同时不可用← 正确答案
- C.升级过程中最多允许多少个 Pod 同时新建
- D.升级失败后最多允许多少次回滚重试
答案:B。maxUnavailable 控制的是 Pod 级别的不可用上限,而非节点级别。设为 1 表示升级时最多只有 1 个 Pod 暂时不可用,这相当于物业队承诺“最多只有一户人家暂时停水”。
Q3. 关于 PodDisruptionBudget(PDB)的作用,下列说法正确的是:
- A.限制 Pod 每次重启的最长时间
- B.保证自愿干扰操作(如节点维护)期间 Pod 的最小可用数量← 正确答案
- C.防止 Pod 被调度到资源不足的节点
- D.自动恢复处于 CrashLoopBackOff 状态的 Pod
答案:B。PDB 是维护操作的安全保险丝,规定节点排空等自愿干扰动作中必须保留的最少 Pod 数量。当驱逐 Pod 会跌破 PDB 下限时,drain 操作会阻塞。它不涉及重启时长、调度策略或故障自愈。
Q4. 集群从 v1.28 升级到 v1.31(跨三个次版本),下列关于风险的说法正确的是:
- A.风险与升级跨度成线性关系,跨三个版本风险是跨一个版本的三倍
- B.风险呈平方级增长,因为 API 变更和行为变更会叠加累积← 正确答案
- C.只要所有节点硬件配置相同,跨版本不会有额外风险
- D.跨版本升级比逐版本升级更安全,因为一步到位
答案:B。跨版本升级的风险随跨度平方增长——每个版本都包含 API 废弃、行为变更和配置迁移,这些变更会叠加在一起使问题定位极其困难,就像让只开过手动挡的人直接去开航天飞机。官方只保证连续两个次版本间的升级路径受支持。
Q5. 关于节点排空(kubectl drain)的过程,下列说法正确的有:
- A.drain 会先标记节点为不可调度(SchedulingDisabled)← 正确答案
- B.drain 会强制删除节点上所有 DaemonSet 管理的 Pod
- C.drain 会优雅终止节点上的普通 Pod,遵守优雅期限设置← 正确答案
- D.drain 完成后需用 uncordon 恢复节点调度能力← 正确答案
答案:ACD。drain 先将节点置为不可调度,然后逐批驱逐普通 Pod 并遵守优雅终止期限;DaemonSet 的 Pod 默认会被忽略(需特殊参数处理);升级完成后必须执行 uncordon 让节点重新接收 Pod。选项 B 说反了。
Q6. 回滚集群升级时,恢复 etcd 快照的意义在于:
- A.将节点上的容器镜像回退到旧版本
- B.将集群期望状态恢复到升级前的时间点← 正确答案
- C.清除新版 etcd 写入的全部垃圾数据
- D.重新生成所有节点的 kubeconfig 文件
答案:B。etcd 快照记录的是集群期望状态(哪些 Pod 应该运行、配置如何),恢复快照相当于把“设计图纸”还原到旧版本。容器镜像回退用的是旧版本包,不是快照;清理数据和生成 kubeconfig 都不是快照的功能。
Q7. 某集群升级后,核心应用错误率升至 4%,刚好处于 1%-5% 的中间地带。此时最合理的策略是:
- A.立即回滚到旧版本,不做任何观察
- B.暂停升级推进,延长观察期并排查错误来源← 正确答案
- C.继续推进升级,因为错误率未超过 5%
- D.忽略错误率,直接完成剩余节点的升级
答案:B。4% 处于“黄灯”区间,应暂停推进、深入排查错误是否由升级引入。立即回滚可能过度反应,直接推进则忽视风险。升级过程中“异常即暂停、排查不过即回滚”是核心原则——黄灯代表减速观察而非闯过去,也不是马上掉头。
Q8. 关于滚动升级的“观察期”设计,下列说法正确的有:
- A.观察期的目的是确认新版本 Pod 真正稳定后才推进下一批← 正确答案
- B.观察期时长应固定为 30 分钟,不随应用类型变化
- C.观察期应结合就绪探针和业务层监控指标综合判断← 正确答案
- D.核心应用和边缘应用可以使用相同的观察期标准
答案:AC。观察期是滚动升级的安全缓冲,必须确认新 Pod 通过健康检查且错误率正常才推进下一批。观察期应根据应用重要性差异化设计——核心应用观察期要长、指标要严,边缘应用可以适当缩短。固定时长和统一标准都是误区。
Q9. 升级完成后,要确认集群真正处于健康状态,以下哪项验证最具说服力?
- A.所有节点 Kubelet 版本号一致
- B.所有 Pod 状态为 Running
- C.关键性能指标与升级前基线偏差不超过 10%← 正确答案
- D.kubectl get nodes 输出全部 Ready
答案:C。版本一致、Pod Running、节点 Ready 都只证明“装好了”,性能基线对比才能证明“运行得好”。版本一致但 API 响应变慢、Pod Running 但频繁重启,这些隐患只有通过性能数据对比才能暴露——就像水龙头出水了不代表水压正常。
Q10. 关于维护窗口的时间预算分配,以及应急预留的作用,下列说法正确的有:
- A.执行时间应占窗口总时长的 50% 左右← 正确答案
- B.应急预留是给意外情况准备的缓冲时间,未用到则提前结束窗口← 正确答案
- C.维护窗口越长越安全,可以覆盖所有意外情况
- D.观察时间是升级完成后验证核心应用健康所需的时长← 正确答案
答案:ABD。合理的时间预算是执行 50%、观察 30%、应急预留 20%;预留时间若未使用应主动结束窗口,缩短系统处于变更中的时间。观察时间用于升级后的健康验证。维护窗口过长反而增加风险,选项 C 是常见误区。