Coursera 笔记

Module 03 · Managing Applications with Kubernetes

Rolling Updates滚动更新(Rolling Updates)详解

Coursera ↗

定义与优势

看完本视频,您将能够:

  • 解释什么是滚动更新及其工作原理。
  • 列出应用滚动更新前的准备步骤。
  • 演示如何回滚滚动更新。

什么是滚动更新?

滚动更新是一种自动化且受控的更新机制,用于在 Pods 之间逐步部署应用程序的变更。

  • 特点:
    • 自动化更新,按计划进行。
    • 跨 Pods 推送受控的应用程序变更。
    • 适用于 Deployment 等带有 Pod 模板的工作负载。
    • 允许根据需要进行回滚(rollback)。

应用滚动更新前的准备步骤

为应用程序启用滚动更新,您需要进行以下准备:

1.添加探测器(Probes)

  • 向 Deployment 中添加 liveness probes‾\underline{liveness\ probes}(存活探针)和 readiness probes‾\underline{readiness\ probes}(就绪探针)。
  • 这样可以确保 Deployment 被正确标记为就绪(ready)。

2.定义滚动更新策略

在 YAML 文件中添加 rollingUpdate 策略:

策略属性 含义 示例值 目的
maxUnavailable 在更新过程中最多允许处于不可用状态的 Pods 数量(可以是百分比或绝对值)。 50% (至少 50% Pod 始终可用) 确保服务持续可用性。
maxSurge 在更新过程中最多可以超出所需副本数量的新 Pods 数量(可以是百分比或绝对值)。 2 (在 10 个 Pod 基础上最多增加 2 个) 控制资源消耗和更新速度。
零停机 将 maxUnavailable 设置为 0。 N/A 确保在任何时间点所有旧 Pod 至少有一个新 Pod 替换。
完全复制 将 maxSurge 设置为 100%。 N/A 在移除原始 Pod 集合之前,先创建一套完整的副本(双倍 Pod 数量)。
minReadySeconds Pods 在被视为可用(ready)之前应保持就绪状态的最小秒数。 N/A 在滚动到下一个 Pod 之前等待几秒钟,确保稳定性。

滚动更新演示

场景:零停机更新

  • 初始状态: ReplicaSet 中有 3 个 Pods,显示信息为 "Hello World!"。
  • 新需求: 应用程序需要更新到新版本,显示信息为 "Hello World v2"。
  • 目标: 零停机(no downtime)。

步骤

  1. 构建和上传新镜像
  • 将新软件 Dockerize。
  • 构建、标记并将新镜像上传到 Docker Hub(例如:hello-kubernetes-upcar/hello-kubernetes:2.0)。

📝 注意:这些是简单的 Docker 命令,与 Kubernetes 无关。

  1. 应用新镜像到 Deployment
  • 使用 set image 命令将 Deployment 的镜像标志设置为 Docker Hub 上更新后的标签。
  • 命令输出确认镜像已更新。
  1. 验证滚动更新状态
  • 使用 rollout status 命令查看更新状态。
  • API 输出显示 deployment hello-kubernetes successfully rolled out。
  1. 最终验证
  • 访问 URL,您将看到新消息 "Hello World v2"。

回滚滚动更新演示

当部署出现错误或客户改变主意时,回滚很容易在 Kubernetes 中实现。

步骤

  1. 执行回滚
  • 对 rollout 使用 undo 命令。
  1. 验证状态
  • 使用 get pods 命令确认:
    • 原有的更新后的 Pods 被终止(terminated)。
    • 作为回滚的一部分,3 个新 Pods 被创建。
  1. 最终验证
  • 再次访问站点,您将看到原始消息("Hello World!")。

滚动更新策略对比

1.一次性更新 (All-at-once Rollout)

  • 特点: 所有 v1 对象必须在 v2 对象激活之前被移除。
  • 过程:
    1. v1 应用(3 个 Pods)运行。
    2. 部署 v2,新 Pods 创建。
    3. v1 Pods 标记为删除并移除 → 用户访问被阻塞(Blocked)。
    4. v1 Pods 移除后,v2 Pods 激活 → 用户访问恢复。
    • 注意: 部署和 Pod 更新之间存在时间延迟(Time Lag)。

2.一次性回滚 (All-at-once Rollback)

  • 特点: 所有 v2 对象必须在 v1 对象激活之前被移除。
  • 过程:
    1. v2 应用(3 个 Pods)运行。
    2. 部署 v1,新 Pods 创建。
    3. v2 Pods 标记为删除并移除 → 用户访问被阻塞(Blocked)。
    4. v2 Pods 移除后,v1 Pods 激活 → 用户访问恢复。

3.逐个更新 (One-at-a-time Rollout)

  • 特点: 更新是交错进行(staggered),用户访问不中断。
  • 过程:
    1. v1 应用(3 个 Pods)运行。
    2. 创建第 1 个 v2 Pod。
    3. 第 1 个 v1 Pod 标记为删除并移除 → 第 1 个 v2 Pod 激活。
    4. 创建第 2 个 v2 Pod。
    5. 第 2 个 v1 Pod 标记为删除并移除 → 第 2 个 v2 Pod 激活。
    6. 创建第 3 个 v2 Pod。
    7. 第 3 个 v1 Pod 标记为删除并移除 → 第 3 个 v2 Pod 激活。

4.逐个回滚 (One-at-a-time Rollback)

  • 特点: 回滚是交错进行,用户访问不中断。
  • 过程:
    1. v2 应用(3 个 Pods)运行。
    2. 部署 v1,创建第 1 个 v1 Pod。
    3. 第 1 个 v2 Pod 标记为删除并移除 → 第 1 个 v1 Pod 激活。
    4. 创建第 2 个 v1 Pod。
    5. 第 2 个 v2 Pod 标记为删除并移除 → 第 2 个 v1 Pod 激活。
    6. 创建第 3 个 v1 Pod。
    7. 第 3 个 v2 Pod 标记为删除并移除 → 第 3 个 v1 Pod 激活。

总结

  • 滚动更新以受控和自动化的方式推出应用程序变更。
  • 它们在不造成明显中断的情况下发布变更。
  • 当应用程序需要还原时,滚动更新可以回滚变更。
  • 滚动更新和回滚可以使用**一次性(All-at-once)和逐个(One-at-a-time)**策略执行。