Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Performing a Rolling Update

执行滚动更新

使用 kubectl 执行滚动更新。

目标

  • 使用 kubectl 执行滚动更新。

更新应用程序

用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。 在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新 允许通过使用新的实例逐步更新 Pod 实例,实现零停机的 Deployment 更新。 新的 Pod 将被调度到具有可用资源的节点上。

在前面的模块中,我们将应用程序扩展为运行多个实例。这是在不影响应用程序可用性的情况下执行更新的要求。 默认情况下,更新期间不可用的 pod 的最大值和可以创建的新 pod 数都是 1。这两个选项都可以配置为(pod)数字或百分比。 在 Kubernetes 中,更新是经过版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本。

摘要:

  • 更新应用

滚动更新通过逐步更新 Pod 实例并替换为新的实例,从而允许在 Deployment 更新过程中实现零停机。


滚动更新概述


与应用程序扩展类似,如果 Deployment 是公开的,Service 在更新期间仅将流量负载均衡到可用的 Pod。 可用的 Pod 是指应用程序对于用户可用的实例。

滚动更新允许以下操作:

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

如果 Deployment 是公开的,Service 在更新期间仅将流量负载均衡到可用的 Pod。


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


更新应用的版本

要列举 Deployment,请运行 get deployments 子命令:

kubectl get deployments

要列举运行中的 Pod,请运行 get pods 子命令:

kubectl get pods

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

kubectl describe pods

要更新应用程序的镜像版本到 v2,请使用 set image 子命令,后面给出 Deployment 名称和新的镜像版本:

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

此命令通知 Deployment 为应用程序使用不同的镜像,并启动滚动更新。 要检查新 Pod 的状态,并查看旧 Pod 的终止状况,请使用 get pods 子命令:

kubectl get pods

第二步:验证更新

首先,检查应用是否正在运行。要查找应用暴露的 IP 地址和端口,请运行 describe services 子命令:

kubectl describe services/kubernetes-bootcamp

创建名为 NODE_PORT 的环境变量,值为已被分配的 Node 端口:

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 正在运行。要检查这些 Pod 部署的镜像, 请使用 describe pods 子命令:

kubectl describe pods

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

记得清理本地集群:

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

最后修改 November 16, 2023 at 2:30 AM PST: [zh] Sync Tutorial update-intro. (c8043a62ac)