执行滚动更新
目标
使用 kubectl 执行滚动更新。
更新应用程序
用户期望应用程序始终可用,而开发人员则期望每天多次部署新版本。在 Kubernetes 中,这通过滚动更新完成。滚动更新允许 Deployment 更新在零停机时间内完成。它通过以增量方式用新 Pod 替换当前 Pod 来实现。新 Pod 会调度到具有可用资源的节点上,并且 Kubernetes 会等待这些新 Pod 启动,然后再移除旧 Pod。
在之前的模块中,我们将应用程序扩展为运行多个实例。这是在不影响应用程序可用性的情况下执行更新的要求。默认情况下,更新期间不可用的最大 Pod 数量以及可以创建的新 Pod 的最大数量均为一。这两个选项都可以配置为数字或百分比(Pod 的百分比)。在 Kubernetes 中,更新是版本化的,任何 Deployment 更新都可以回滚到以前的(稳定)版本。
滚动更新概述
与应用程序扩缩类似,如果 Deployment 公开暴露,则 Service 将在更新期间仅将流量负载均衡到可用的 Pod。可用的 Pod 是应用程序用户的可用实例。
滚动更新允许以下操作
- 将应用程序从一个环境提升到另一个环境(通过容器镜像更新)
- 回滚到以前的版本
- 持续集成和持续交付应用程序,零停机时间
在下面的交互式教程中,我们将应用程序更新到新版本,并执行回滚。
更新应用程序版本
要列出你的 Deployment,请运行 get deployments
子命令
kubectl get deployments
要列出正在运行的 Pod,请运行 get pods
子命令
kubectl get pods
要查看应用程序的当前镜像版本,请运行 describe pods
子命令并查找 Image
字段
kubectl describe pods
要将应用程序的镜像更新到版本 2,请使用 set image
子命令,后跟 Deployment 名称和新镜像版本
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=docker.io/jocatalin/kubernetes-bootcamp:v2
该命令通知 Deployment 为你的应用程序使用不同的镜像,并启动了滚动更新。使用 get pods
子命令检查新 Pod 的状态,并查看旧 Pod 正在终止
kubectl get pods
验证更新
首先,检查 Service 是否正在运行,因为你可能在之前的教程步骤中将其删除,运行 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
查看 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 上部署的镜像,请使用 describe pods
子命令
kubectl describe pods
Deployment 再次使用应用程序的稳定版本(v2
)。回滚成功。
请记住清理你的本地集群。
kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp
下一步
- 了解更多关于Deployment的信息。