0Pricing
DevOps Bootcamp · 课时

滚动更新与回滚

实现应用零停机更新,并在出现问题时恢复到之前的版本。

滚动更新与回滚 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。

零停机更新:为什么需要

想象一下更新一个正在运行的应用。如果没有周密的规划,用户可能会遇到停机或错误。这正是 Kubernetes 中的滚动更新大显身手的地方!

滚动更新允许您将应用更新到新版本,同时不中断服务。新版本会逐步推出,从而确保应用始终可用。

Deployment 如何处理更新

当您更新 Deployment 的 Pod 模板(例如更改容器镜像)时,Kubernetes 不会直接关闭所有内容再重新启动。相反,它默认使用 RollingUpdate 策略。

  • 它会使用更新后的配置创建新的 Pod。
  • 新 Pod 就绪后,它会逐步终止旧 Pod。
  • 此过程可以确保平稳过渡,并将停机时间降至最低甚至避免停机。

控制推出速度

您可以使用 Deployment 的 .spec.strategy.rollingUpdate 部分中的两个关键参数,精细调整滚动更新的行为:

  • maxUnavailable:更新期间允许不可用的 Pod 最大数量。可以是绝对数量或百分比。
  • maxSurge:超出期望 Pod 数量后允许创建的 Pod 最大数量。同样可以是绝对数量或百分比。

默认情况下,两者都设置为 25%。

我们的初始 Deployment

我们从一个简单的 Nginx Deployment 开始。此 YAML 定义了一个初始应用,该应用运行 3 个 nginx:1.14.2 副本。

下一步我们将以此为基础执行滚动更新。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

执行滚动更新

现在,我们将 Nginx 版本从 1.14.2 更新到 1.15.0。只需更改 YAML 中的镜像并应用即可。

Kubernetes 会检测到更改并自动启动滚动更新。请观察下面的 image 字段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.0
        ports:
        - containerPort: 80

监控推出状态

应用更新后的 YAML 后,您可以使用 kubectl rollout status 命令监控滚动更新的进度:

kubectl rollout status deployment/my-nginx

您将看到新 Pod 被创建、旧 Pod 被终止的提示,直到更新完成。您还可以使用 kubectl get rs 查看旧的和新的 ReplicaSet。

检查推出历史

Kubernetes 会保留 Deployment 修订版本的历史记录。这对于了解变更以及可能执行回滚非常有用。

要查看历史记录,请使用以下命令:

kubectl rollout history deployment/my-nginx

您将看到一个修订版本列表,每个修订版本代表 Deployment 的一种不同状态。CHANGE-CAUSE 通常反映执行的命令或 YAML 变更。

何时需要回滚

即使经过仔细测试,新版本的应用有时仍会引入未被发现的错误或性能问题。在这种关键情况下,您需要一种快速恢复到已知稳定状态的方法。

这正是回滚的用途。回滚可以撤销有问题的更新,并根据历史记录将 Deployment 恢复到之前可正常运行的版本。

执行回滚

要回滚到紧邻的上一个修订版本,请使用:

kubectl rollout undo deployment/my-nginx

如果您希望回滚到特定修订版本(例如修订版本 1),可以指定该版本:

kubectl rollout undo deployment/my-nginx --to-revision=1

Kubernetes 会再次执行滚动更新,将 Pod 恢复为指定的历史配置。

检查推出策略

以下哪个参数可用于控制 Kubernetes Deployment 的 RollingUpdate 策略的行为?

回顾:平稳更新与安全保障

我们已经探索了 Kubernetes Deployment 如何实现零停机滚动更新,使应用平稳过渡到新版本。您学习了:

  • Deployment 默认使用 RollingUpdate。
  • maxUnavailable 和 maxSurge 控制更新速度。
  • kubectl rollout status 监控更新进度。
  • kubectl rollout history 跟踪修订版本。
  • kubectl rollout undo 支持快速回滚到稳定版本。

这些功能对于维持应用的高可用性和可靠性至关重要!

常见问题解答

「滚动更新与回滚」课时是免费的吗?

是的 — 「滚动更新与回滚」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。

「滚动更新与回滚」这节课中我会学到什么?

实现应用零停机更新,并在出现问题时恢复到之前的版本。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DevOps Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「滚动更新与回滚」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DevOps Bootcamp 课中编写并运行代码吗?

能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 了解 Deployment
  2. 使用 ReplicaSets 扩展应用
  3. 滚动更新与回滚
  4. 部署策略:蓝绿与金丝雀
← 返回 DevOps Bootcamp