执行滚动更新

目标

使用 kubectl 执行滚动更新。

开始之前

本教程中的 shell 命令使用 POSIX shell 语法,大多数 Linux 和 macOS 系统上的默认 shell(例如 bash、zsh 或 sh)都支持该语法。Windows 用户必须使用与 POSIX 兼容的 shell,例如 Windows Linux 子系统 (WSL)Git Bash 来运行所写的命令。使用 export$() 和类似结构的命令兼容 PowerShell 或 Windows 命令提示符。

更新应用程序

用户期望应用程序始终可用,而开发人员则需要每天多次部署新版本。在 Kubernetes 中,这是通过滚动更新完成的。滚动更新允许 Deployment 在不产生停机的情况下完成更新。它通过逐步将现有的 Pod 替换为新 Pod 来实现这一点。新的 Pod 会被调度到有可用资源的节点上,并且 Kubernetes 会等待这些新 Pod 启动,然后再移除旧的 Pod。

在之前的模块中,我们将应用程序扩容为运行多个实例。这是在不影响应用程序可用性的情况下执行更新的前提。默认情况下,在更新期间不可用的 Pod 的最大数量和可以创建的新 Pod 的最大数量均为一个。这两个选项都可以配置为具体数量或百分比(Pod 的百分比)。在 Kubernetes 中,更新具有版本控制功能,任何 Deployment 更新都可以回滚到之前的(稳定)版本。

滚动更新概述

在滚动更新期间,此行为通过仅将流量路由到正在处理请求的 Pod 来保持应用程序可用。滚动更新允许执行以下操作:

  • 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
  • 回滚到以前的版本
  • 以零停机时间实现应用程序的持续集成和持续交付

在接下来的交互式教程中,我们将把应用程序更新到新版本,并执行一次回滚。

更新应用版本

要列出您的 Deployment,请运行 get deployments 子命令

kubectl get deployments

要列出正在运行的 Pod,请运行 get pods 子命令

kubectl get pods

要查看应用当前的镜像版本,请运行 describe pods 子命令并查找 Image 字段

kubectl describe pods

要将应用程序的镜像更新为版本 2,请使用 set image 子命令,后跟 Deployment 名称和新镜像版本

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=docker.io/jocatalin/kubernetes-bootcamp:v2

该命令通知 Deployment 为您的应用使用不同的镜像并启动了滚动更新。检查新 Pod 的状态,并使用 get pods 子命令查看旧 Pod 正在被终止

kubectl get pods

验证更新

首先,检查 Service 是否正在运行(因为您可能在上一个教程步骤中删除了它),运行 describe services/kubernetes-bootcamp。如果它缺失,您可以再次使用以下命令创建它:

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

创建一个名为 NODE_PORT 的环境变量,其值为已分配的节点端口

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo "NODE_PORT=$NODE_PORT"

接下来,对公开的 IP 和端口执行 curl

curl http://"$(minikube ip):$NODE_PORT"

每次运行 curl 命令时,您都会访问一个不同的 Pod。请注意,所有 Pod 现在都在运行最新版本 (v2)。

您还可以通过运行 rollout status 子命令来确认更新

kubectl rollout status deployments/kubernetes-bootcamp

要查看应用当前的镜像版本,请运行 describe pods 子命令

kubectl describe pods

在输出的 Image 字段中,验证您是否正在运行最新镜像版本 (v2)。

回滚更新

让我们执行另一次更新,尝试部署一个标记为 v10 的镜像

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

使用 get deployments 查看 Deployment 的状态

kubectl get deployments

请注意,输出中未列出所需数量的可用 Pod。运行 get pods 子命令列出所有 Pod

kubectl get pods

请注意,部分 Pod 的状态为 ImagePullBackOff

要深入了解问题,请运行 describe pods 子命令

kubectl describe pods

在受影响 Pod 的输出的 Events 部分中,请注意 v10 镜像版本在仓库中不存在。

要将 Deployment 回滚到上一个正常工作的版本,请使用 rollout undo 子命令

kubectl rollout undo deployments/kubernetes-bootcamp

rollout undo 命令将 Deployment 恢复到上一个已知状态(镜像的 v2)。更新具有版本控制功能,您可以回滚到 Deployment 的任何先前已知状态。

再次使用 get pods 子命令列出 Pod

kubectl get pods

要检查正在运行的 Pod 上部署的镜像,请使用 describe pods 子命令

kubectl describe pods

Deployment 再次使用了该应用的稳定版本 (v2)。回滚成功。

记得清理您的本地集群。

kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp

接下来


最后修改时间:2026 年 3 月 12 日 下午 3:33 PST:明确先决条件中的 POSIX shell 措辞 (5d98744874)