1 - 执行滚动更新

使用 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

2 - 交互式教程 - 更新你的应用

要与终端交互,请使用桌面/平板电脑版本