模块 6 - 更新你的应用
难度: 初级 预计时间: 10 分钟
本场景的目标是使用 kubectl set image
命令更新已部署的应用,并使用 rollout undo
命令回滚。
步骤 1 - 更新应用版本
要列出你的部署,运行 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=gcr.io/k8s-minikube/kubernetes-bootcamp:v2
该命令通知 Deployment 为你的应用使用不同的镜像,并启动了滚动更新。使用 get pods
命令检查新 Pod 的状态,并查看旧 Pod 正在终止。
kubectl get pods
步骤 2 - 验证更新
首先,检查应用是否正在运行。要查找公开的 IP 和端口,运行 describe service
命令
kubectl describe services/kubernetes-bootcamp
Docker Desktop 用户注意: 由于 Docker Desktop 网络限制,默认情况下你无法直接从主机访问 Pod。运行 minikube service kubernetes-bootcamp
,这将在 Pod 和你的主机之间创建一个 SSH 隧道,并在你的默认浏览器中打开一个连接到该服务的窗口。可以通过按 Control-C 终止隧道,然后继续执行 curl $(minikube ip):$NODE_PORT
命令之后的教程。
创建一个名为 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 $(minikube ip):$NODE_PORT
每次运行 curl
命令,你都会命中一个不同的 Pod。请注意,所有 Pod 都正在运行最新版本 (v2)。
你还可以通过运行 rollout status
命令来确认更新
kubectl rollout status deployments/kubernetes-bootcamp
要查看应用的当前镜像版本,运行 describe pods
命令
kubectl describe pods
在输出的 Image
字段中,验证你正在运行最新的镜像版本 (v2)。
步骤 3 - 回滚更新
我们再执行一次更新,部署一个标记为 v10
的镜像
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/k8s-minikube/kubernetes-bootcamp:v10
使用 get deployments
查看部署的状态
kubectl get deployments
请注意,输出中没有列出所需的可用 Pod 数量。运行 get pods
命令列出所有 Pod
kubectl get pods
请注意,一些 Pod 的状态为 ImagePullBackOff
。
要深入了解问题,运行 describe pods
命令
kubectl describe pods
在受影响 Pod 的输出 Events
部分中,请注意 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)。回滚成功。