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

与应用程序扩展类似,如果部署是公开暴露的,那么在更新期间,服务将仅把流量负载均衡到可用的 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 podsVerify 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-bootcamprollout undo 命令将部署恢复到之前的已知状态(镜像的 v2 版本)。更新是有版本控制的,您可以回滚到部署的任何先前已知状态。
使用 get pods 子命令再次列出 Pod:
kubectl get pods四个 Pod 正在运行。要检查这些 Pod 上部署的镜像,使用 describe pods 子命令:
kubectl describe pods部署再次使用了应用的稳定版本(v2)。回滚成功。
记得清理您的本地集群
kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcampSummary:
- 更新应用程序
滚动更新允许通过逐步使用新的 Pod 实例替换旧的实例来实现部署的更新,且不会造成停机时间。