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

相关推荐
木风小助理6 小时前
Kubernetes持久化存储架构深度解析:从易失的Pod到永恒的数据
kubernetes
一周困⁸天.7 小时前
K8s -蓝绿发布与金丝雀发布
docker·容器·kubernetes
永不停歇的蜗牛7 小时前
K8S之rke2证书过期,如何处理以及遇到的问题
服务器·容器·kubernetes
你想考研啊9 小时前
k8s使用kubectl报错
java·docker·kubernetes
回忆是昨天里的海9 小时前
记录线上k8s拉取不了阿里云镜像的一次临时处理
阿里云·容器·kubernetes
木风小助理9 小时前
Kubernetes Service 架构深度解析:从虚拟IP到流量的智能寻址
kubernetes
运维行者_9 小时前
APM 性能监控是什么?从应用监控与网站监控了解基础概念
网络·数据库·云原生·容器·kubernetes·智能路由器·运维开发
小毅&Nora9 小时前
【云计算】【Kubernetes】 ⑥ K8S Pod优雅下线全解析:从preStop到Eureka下线实战
kubernetes·云计算·优雅下线
会飞的小蛮猪10 小时前
K8s-1.29.2二进制安装-第三章(Master组件安装)
云原生·容器·kubernetes
百锦再10 小时前
Kubernetes与开发语言:重新定义.NET Core与Java的云原生未来
开发语言·云原生·kubernetes