Kubernetes滚动发布详解

Kubernetes 中的滚动发布(Rolling Update)是一种非常优雅的部署策略,它能让你在更新应用时,实现零停机 和用户无感知的平滑升级。下面这张图清晰地展示了它的核心工作流程:

下面,我们详细解读这个过程,并看看如何掌控它。

🔄 滚动发布如何工作

滚动发布的核心思想是逐步替换。它不是一次性停止所有旧版本的 Pod(实例),然后再启动所有新版本的 Pod。相反,它遵循一个精心控制的流程:

  1. 逐步更替 :如流程图所示,系统会先启动一个新版本 Pod (V2),并等待其通过就绪探针检查,确认其已准备好接收流量。
  2. 流量切换 :一旦新的 Pod 就绪,负载均衡器(通常是 Kubernetes Service)就会将流量引导到它上面,同时终止一个旧版本 Pod(V1)。
  3. 循环往复:这个过程循环进行,直到所有旧版本的 Pod 都被替换为新版本的 Pod。

这种方式确保了在整个更新过程中,始终有可用的 Pod 实例在对外提供服务,从而实现了零停机。

⚙️ 核心配置参数

滚动发布的精细控制,主要通过 Deployment 配置中的 strategy.rollingUpdate下的两个关键参数实现:

参数 作用 默认值 生产环境建议
**maxSurge**​ 控制最多能创建多少个超出期望副本数的 Pod。 25% 通常设置为 1 或 25%。这相当于更新过程中的"缓冲区",允许新 Pod 提前启动。
**maxUnavailable**​ 控制在更新过程中,最多允许多少个 Pod 不可用。 25% 对于要求高可用的服务,可设置为 0,确保更新期间服务容量不降低。

举个例子 :如果你的应用有 4 个副本,并设置 maxSurge=1(最多可超 1 个 Pod),maxUnavailable=0(不允许任何 Pod 不可用)。那么滚动更新时,Kubernetes 会先创建一个新 Pod(此时总数为 5 个),待其就绪后,再终止一个旧 Pod(总数恢复 4 个),如此循环。这样,任何时候都至少有 4 个 Pod 是可用的。

🛠️ 实战操作指南

掌握了原理后,你可以通过以下命令来管理和监控滚动发布:

命令 功能
kubectl set image deployment/<部署名称> <容器名>=<新镜像>:<标签> 触发更新。这是最常用的触发方式。
kubectl rollout status deployment/<部署名称> 实时查看更新状态和进度。
kubectl rollout pause deployment/<部署名称> 暂停滚动更新。适用于想在某个中间状态进行验证的场景。
kubectl rollout resume deployment/<部署名称> 继续被暂停的滚动更新。
kubectl rollout undo deployment/<部署名称> 回滚到上一个版本。这是滚动发布带来的巨大优势之一。
kubectl get pods -w 观察 Pod 的新旧替换过程,直观看到流程图中的每一步。

💡 确保平滑发布的进阶技巧

要让滚动发布真正丝滑,还需要注意以下几点:

  1. 配置就绪探针 :这是最重要的配置!readinessProbe告诉 Kubernetes 你的应用何时真正准备好接收流量。如果没有它,Kubernetes 会在容器进程启动后立即发送流量,而此时你的应用(如 Spring Boot 项目)可能还在加载 Spring 上下文或连接数据库,导致请求失败。务必根据应用启动特点配置合理的路径和延迟时间。
  2. 配置优雅终止 :在 Pod 被终止时,Kubernetes 会向容器内的进程发送 SIGTERM 信号。你的应用应该捕获这个信号,然后停止接收新请求,并等待已有请求处理完成后再退出。这可以通过在 Deployment 中配置 spec.template.spec.terminationGracePeriodSeconds并结合 preStop钩子来实现,给应用一个清理和退出的缓冲时间。
  3. 避免使用 latest标签 :在 Deployment 的 YAML 中,明确指定镜像版本标签。使用 latest标签会导致无法清晰追踪当前运行的版本,也给回滚带来不确定性。

⚖️ 优缺点与策略对比

特点 滚动发布 重建发布 蓝绿发布
发布方式​ 逐步替换,新老版本同时存在一段时间 先全部停止旧版本,再启动新版本 部署两套完整环境,流量一次性切换
资源占用​ 低(只需运行一套环境) 低(只需运行一套环境) 高(需要两套环境的资源)
发布风险​ 中(风险被分散,可快速回滚) 高(服务有中断期) 低(回滚极快)
复杂度​ 低(Kubernetes 原生支持) 低 中(需要额外的流量控制能力)

💎 总结

总而言之,Kubernetes 的滚动发布是一种强大且实用的部署策略。理解其逐步替换 的工作原理,熟练运用 maxSurge和 maxUnavailable​ 来控制节奏,并结合就绪探针和优雅终止等最佳实践,你就能真正掌握在 Kubernetes 上进行平滑、无损应用发布的艺术。

相关推荐
weirong3 小时前
图解 client-go Informer:手写一个 mini-Informer 才敢说懂
kubernetes
.冰块.3 小时前
流量大了自动加 Pod!K8s HPA 扩缩容与 ResourceQuota/LimitRange 资源管控实战
linux·云原生·容器·kubernetes·hpa·quota·limitrange
无言听风雨丶1 天前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
无言听风雨丶1 天前
Kubernetes GitOps 持续交付实战:用 Argo CD 让 Git 成为集群事实源
git·elasticsearch·kubernetes
无言听风雨丶2 天前
Kubernetes 控制平面深度剖析:从 kubectl apply 到 etcd 写入的全链路
平面·kubernetes·etcd
openFuyao2 天前
openFuyao x 复旦大学软件工程实验室 Panel 回顾:Agentic时代,集群调度技术体系将如何演进?
kubernetes·openfuyao
螺蛳粉 螺蛳粉2 天前
第 05 篇:etcd 深入:Raft 共识、watch 机制与快照备份恢复实战(底座认知 05)
docker·云原生·容器·kubernetes·etcd·分布式存储·kube-apiserver
相思难忘成疾2 天前
从零搭建 Kubernetes 1.30 集群:kubeadm 部署一主多从实战(RHEL 9.3 + Docker + flannel)
linux·运维·kubernetes
weirong2 天前
给 K8s 加一个自动值班员:分级故障自愈引擎
kubernetes
云和数据.ChenGuang2 天前
Python 闭包详解:从原理到实战
linux·开发语言·人工智能·python·kubernetes