执行滚动更新

使用 kubectl 执行滚动更新。

目标

  • 使用 kubectl 执行滚动更新。

更新应用程序

用户期望应用程序始终可用,开发人员也期望每天部署应用程序的新版本多次。在 Kubernetes 中,这是通过滚动更新来完成的。**滚动更新**允许部署更新在零停机时间的情况下进行。它是通过逐步用新 Pod 替换当前 Pod 来实现的。新 Pod 会调度到具有可用资源的节点上,Kubernetes 会等待这些新 Pod 启动,然后再删除旧 Pod。

在上一模块中,我们将应用程序扩展到运行多个实例。这是在不影响应用程序可用性的情况下执行更新的必要条件。默认情况下,更新期间可以不可用的 Pod 的最大数量和可以创建的新 Pod 的最大数量为 1。这两个选项都可以配置为数字或百分比(Pod 的百分比)。在 Kubernetes 中,更新是版本化的,任何部署更新都可以回滚到以前的(稳定)版本。

总结

  • 更新应用程序

滚动更新允许部署更新在零停机时间的情况下进行,方法是逐步用新的 Pod 实例替换旧的 Pod 实例。


滚动更新概述


与应用程序扩展类似,如果部署公开暴露,服务只会将流量负载均衡到更新期间可用的 Pod。可用的 Pod 是对应用程序用户可用的实例。

滚动更新允许执行以下操作

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

如果部署公开暴露,服务只会将流量负载均衡到更新期间可用的 Pod。


在以下交互式教程中,我们将更新应用程序到新版本,并执行回滚。


更新应用程序的版本

要列出您的部署,请运行 get deployments 子命令:kubectl get deployments

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

kubectl get pods

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

kubectl describe pods

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

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

该命令通知部署使用不同的镜像来运行您的应用程序,并启动滚动更新。使用 get pods 子命令检查新 Pod 的状态,并查看旧 Pod 正在终止。

kubectl get pods

验证更新

首先,检查服务是否正在运行,因为您可能在之前的教程步骤中删除了它,请运行 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 查看部署的状态

kubectl get deployments

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

kubectl get pods

请注意,一些 Pod 的状态为ImagePullBackOff.

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

kubectl describe pods

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

要将部署回滚到上次正常工作的版本,请使用 rollout undo 子命令

kubectl rollout undo deployments/kubernetes-bootcamp

rollout undo 命令将部署回滚到以前已知的状态(镜像的 v2)。更新是版本化的,您可以回滚到部署的任何以前已知的狀態。

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

kubectl get pods

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

kubectl describe pods

部署再次使用应用程序的稳定版本(v2)。回滚成功。

请记住清理您的本地集群

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

上次修改时间:2024 年 3 月 14 日下午 11:49 PST:check-service-exists (ef8ca3629f)