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 上进行平滑、无损应用发布的艺术。

相关推荐
ICT董老师1 小时前
通过kubernetes部署nginx + php网站环境
运维·nginx·云原生·容器·kubernetes·php
原神启动11 小时前
K8S(八)—— Kubernetes Pod 资源限制 + 探针(Probe)解析
云原生·容器·kubernetes
zxnbmk2 小时前
【7】Kubernetes存储(本章知识密度较高,仅浅浅了解后续详解)
linux·云原生·容器·kubernetes
叫致寒吧2 小时前
pod详解
云原生·kubernetes
水上冰石2 小时前
查看k8s下Jenkins的插件在宿主机的路径
容器·kubernetes·jenkins
孤岛悬城2 小时前
58 k8s之pod
云原生·容器·kubernetes
可爱又迷人的反派角色“yang”2 小时前
k8s(五)
linux·运维·docker·云原生·容器·kubernetes
oMcLin2 小时前
如何在Ubuntu 22.10上通过配置K3s轻量级Kubernetes集群,提升边缘计算环境的资源管理能力?
ubuntu·kubernetes·边缘计算
水上冰石3 小时前
如何查看k8s按照的jenkins插件的路径
容器·kubernetes·jenkins
鱼跃鹰飞3 小时前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes