本篇主要讨论如何实现滚动更新和回滚,任意更换版本并且回滚以前的版本(版本更新),而下一章会讨论到 Pod 缩放,根据机器资源自动拓展和收缩应用(自动扩容实例)。
本文为作者的 Kubernetes 系列电子书的一部分,电子书已经开源,欢迎关注,电子书浏览地址:
https://k8s.whuanle.cn【适合国内访问】
https://ek8s.whuanle.cn 【gitbook】
滚动更新和回滚
部署应用
首先我们来部署 nginx,使用 nginx 作为练习的镜像。
打开 https://hub.docker.com/_/nginx 可以查询 nginx 的镜像版本,笔者这里选择三个版本:1.19.10
、1.20.0
、latest
,后续我们更新和回滚时,会在这几个版本之间选择。
首先,我们创建一个 Nginx 的 Deployment,副本数量为 3,首次部署的时候,跟之前的操作一致,不需要什么特殊的命令。这里我们使用旧一些的版本,笔者使用的是 1.19.0。
kubectl create deployment nginx --image=nginx:1.19.0 --replicas=3
# 或者
# kubectl create deployment nginx --image=nginx:1.19.0 --replicas=3 --record
执行 kubectl get pods
、kubectl describe pods
可以观察到有有三个 Pod,每个 Pod 的 nginx 镜像版本都是 1.19.0。
NAME READY STATUS RESTARTS AGE
nginx-85b45874d9-7jlrv 1/1 Running 0 5s
nginx-85b45874d9-h22xv 1/1 Running 0 5s
nginx-85b45874d9-vthfb 1/1 Running 0 5s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 119s default-scheduler Successfully assigned default/nginx-85b45874d9-vthfb to instance-2
Normal Pulled 117s kubelet Container image "nginx:1.19.0" already present on machine
Normal Created 117s kubelet Created container nginx
Normal Started 117s kubelet Started container nginx
更新版本
其实更新 Pod 是非常简单的,我们不需要控制每个 Pod 的更新,也不需要担心会不会对业务产生影响,K8S 会自动控制这些过程。我们只需要触发镜像版本更新事件,K8S 会自动为我们更新所有 Pod 的。
kubectl set image
可以更新现有资源对象的容器镜像,对象包括 Pod
、Deployment
、DaemonSet
、Job
、ReplicaSet
。在更新版本中,单个容器的 Pod,对于多个容器的 Pod 行为是差不多的,所以我们使用单容器 Pod 练习即可。
更新 Deployment 中的镜像版本,触发 Pod:
kubectl set image deployment nginx nginx=nginx:1.20.0
格式为:
kubectl set image deployment {deployment名称} {镜像名称}:={镜像名称}:{版本}