1 - 执行滚动更新
教程目标
使用 kubectl 执行滚动更新。
更新应用
滚动更新通过增量式更新 Pod 实例并替换为新的实例,允许在 Deployment 更新过程中实现零停机。
用户希望应用程序始终可用,而开发人员则需要每天多次部署它们的新版本。 在 Kubernetes 中,这些是通过滚动更新(Rolling Updates)完成的。 滚动更新允许通过使用新的实例逐步更新 Pod 实例,实现零停机的 Deployment 更新。 新的 Pod 将被调度到具有可用资源的节点上。
在前面的模块中,我们将扩大应用的规模以运行多个实例。这是在对不影响应用程序可用性的情况下执行更新的要求。 默认情况下,更新期间不可用的 Pod 的个数上限和可以创建的新 Pod 个数上限都是 1。 这两个选项都可以配置为(Pod)数字或百分比。 在 Kubernetes 中,更新是具有版本控制的,任何 Deployment 更新都可以恢复到以前的(稳定)版本。
Rolling updates overview
如果 Deployment 的访问是公开的,Service 在更新期间仅将流量负载均衡到可用的 Pod。
与应用程序规模扩缩类似,如果 Deployment 的访问是公开的,Service 在更新期间仅将流量负载均衡到可用的 Pod。可用的 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=docker.io/jocatalin/kubernetes-bootcamp:v2
此命令通知 Deployment 为应用程序使用不同的镜像,并启动滚动更新。
要检查新 Pod 的状态,并查看旧 Pod 的终止状况,可以使用 get pods
子命令:
kubectl get pods
验证更新
首先,检查服务是否正在运行,因为你可能在上一个教程步骤中删除了它。
运行 describe services/kubernetes-bootcamp
,如果服务缺失,
你可以使用以下命令重新创建:
kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
创建名为 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
在输出中,验证应用程序正在运行最新版本的镜像(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。