执行滚动更新

目标

使用 kubectl 执行滚动更新。

更新应用程序

用户希望应用程序始终可用,而开发者期望每天多次部署新版本。在 Kubernetes 中,这通过滚动更新来实现。滚动更新允许 Deployment 在零停机的情况下进行更新。它通过逐步用新的 Pod 替换当前的 Pod 来实现。新的 Pod 会被调度到有可用资源的 Node 上,Kubernetes 会等待这些新的 Pod 启动后再移除旧的 Pod。

在上一模块中,我们将应用程序扩缩容至运行多个实例。这是在不影响应用程序可用性的情况下执行更新的要求。默认情况下,更新期间不可用的 Pod 的最大数量以及可以创建的新 Pod 的最大数量都为一。这两个选项都可以配置为数字或百分比(Pod 的)。在 Kubernetes 中,更新是带有版本号的,任何 Deployment 更新都可以回滚到先前的(稳定)版本。

滚动更新概述

与应用程序扩缩容类似,如果 Deployment 被公开暴露,Service 在更新期间只会将流量负载均衡到可用的 Pod。可用的 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 为你的应用程序使用不同的镜像,并启动了滚动更新。使用 get pods 子命令查看新 Pod 的状态,以及旧 Pod 正在终止。

kubectl get pods

验证更新

首先,检查 Service 是否正在运行,因为你在之前的教程步骤中可能已将其删除,运行 describe services/kubernetes-bootcamp。如果它不存在,你可以使用以下命令再次创建它:

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

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

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

接下来,使用 curl 访问暴露的 IP 和端口

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

下一步

最后修改于 2024年11月18日 太平洋标准时间晚上 8:50:添加图片 css 和提示框 (b9ee7dbcba)