k8s
官方教程
Kubernetes Basics
Update Your App

Performing a Rolling Update

Objectives

  • Perform a rolling update using kubectl
  • 使用 kubectl 执行滚动更新

Updating an application

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

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

Rolling updates overview

![](public/kubernetes/offical-tutorial/module_06_rollingupdates1.svg)

与应用程序扩展类似,如果部署是公开暴露的,那么在更新期间,服务将仅把流量负载均衡到可用的 Pod 上。可用的 Pod 是指应用程序的用户可以使用的实例。

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

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

如果部署是公开暴露的,那么在更新期间,服务将仅把流量负载均衡到可用的 Pod 上。

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

Update the version of the app

要列出您的部署(Deployments),请运行 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

该命令通知部署(Deployment)为您的应用使用不同的镜像,并启动滚动更新。使用 get pods 子命令检查新 Pod 的状态,并查看旧 Pod 的终止情况:

kubectl get pods

Verify an update

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

kubectl describe services/kubernetes-bootcamp

创建一个名为 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)。

Roll back an update

让我们执行另一次更新,并尝试部署一个标记为 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 的输出的“事件”部分,注意到仓库中不存在 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

Summary:

  • 更新应用程序

滚动更新允许通过逐步使用新的 Pod 实例替换旧的实例来实现部署的更新,且不会造成停机时间。