一、准备工作
创建一个 deployment,使用 nginx 镜像,版本为 1.16 并暴露应用
kubectl create deployment web --image=nginx:1.16
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
查看应用暴露的端口:
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.107.162.235 <none> 80:30892/TCP 21s
在浏览器中检查 nginx 版本:
二、应用升级
将 nginx 版本升级到 1.17
kubectl set image deployment web nginx=nginx:1.17
参数解释:
nginx=nginx:1.17
中前者nginx
代表容器名,后者代表镜像名称,容器名可以在yaml
中查看
查看升级状态:
kubectl rollout status deployment web
三、应用回滚
查看应用部署历史记录(默认保留 10
条,也可在 yaml
中查看设置,与副本集 replicas
参数同级,名称为 revisionHistoryLimit
):
[root@k8s-master ~]# kubectl rollout history deployment
web deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
2 <none>
其中,版本 1 代表之前部署的 1.16 版本,版本 2 为 1.17 版本,但是这里的变更记录里面却什么都没有,我们可以使用 --record=true
参数来记录每次升级的详细记录.
将 nginx 升级到 1.18:
kubectl set image deployment web nginx=nginx:1.18 --record=true
查看更新历史记录:
[root@k8s-master ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl set image deployment web nginx=nginx:1.18 --record=true
添加 --record=true
命令后会将升级的命令记录下来。
3.1 回滚到上一个版本
kubectl rollout undo deployment web
nginx 降级为 1.17
查看升级历史记录
[root@k8s-master ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
1 <none>
3 kubectl set image deployment web nginx=nginx:1.18 --record=true
4 <none>
由此可见,每次的升级都会将之前的版本号重命名为新的版本号,所以版本 1 是 1.16 ,版本 3 是 1.18 ,版本 4 是 1.17
3.2 回滚到指定版本
若继续回滚到上个版本,那也只能回滚到 18 版本,若想回滚到 1.16.则需要指定版本号进行回滚操作:
kubectl rollout undo deployment web --to-revision=1
查看更新历史记录:
[root@k8s-master ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION CHANGE-CAUSE
3 kubectl set image deployment web nginx=nginx:1.18 --record=true
4 <none>
5 <none>
其实,deployment 利用 rs 做副本管理、回滚,kubelet 会将应用执行一个滚动更新的操作,具体流程如下:
假设 web 副本集为 3,则
- 1.创建新的 rs 并且 scale up=1
- 2.将旧的 rs 缩容 scale down=2
- 3.将新的 rs scale up=2
- 4.将旧的 rs 缩容 scale down=1
- 5.将新的 rs 扩容 scale up=3
- 6.将旧的 rs 缩容 scale down=0 (但并不会删除 rs)
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5c987fcb9f 1 1 1 63m
web-669588cb76 0 0 0 57m
web-74b9fcbbc7 0 0 0 27m
四、应用扩容
将 web 应用扩容副本集为 3
kubectl scale deployment web --replicas=3
查看副本集:
[root@k8s-master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
web-5c987fcb9f 3 3 3 89m
web-669588cb76 0 0 0 83m
web-74b9fcbbc7 0 0 0 53m
4.1 弹性伸缩
设置 web 应用副本数为 3-10
kubectl autoscale deployment web --min=3 --max=10
查看 hpa
[root@k8s-master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web Deployment/web <unknown>/80% 3 10 3 20s
可以看到,获取的资源前面显示 unknown,且时间信息里出现了 failed to get cpu utilization:missing request for cpu
,这是因为我们创建的 pod 对象没有添加 request 资源声明,这样导致 hpa 读取不到 cpu 指标信息,所以要想让 hpa 生效,则对应的 pod 资源中必须添加 requests 资源声明:
在线编辑资源(会使用默认编辑器打开):
kubectl edit deployment web
利用查找功能,找到 resources,修改成以下内容(设置资源占用的 cpu 和内存大小的上限和下限):
resources:
requests:
cpu: 100m
memory: 500Mi
limits:
cpu: 200m
memory: 500Mi
修改完成保存后触发滚动更新,之后继续查看 hpa:
[root@k8s-master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
web Deployment/web 0%/80% 3 10 3 6m25s
当 cpu 占比超过 80% 时自动扩容,当低于 80% 时自动缩容。
注意:
hpa
(horizontal pod autoscaler
:Pod 水平伸缩)已经将内存指标禁用,原因是 cpu 分配的资源可控,内存不可控。- 弹性伸缩依靠某些硬件指标去进行控制,故依赖
metrics-server
。- 默认 cpu 占比为 80%,若设置其他值,则需要添加
--cpu-percent=<占比>
参数
hpa 的冷却时间为,扩容 3 分钟,缩容 5 分钟
五、应用删除
rs 会周期性检查当前 pod 是否按照预设的副本集去运行,若副本集少于预设值,则会自动拉起 pod,若副本集多余预设值,则删除多余的 pod,若想彻底删除 pod,则只需要删除 deployment 即可:
kubectl delete deployment web
kubectl delete svc web
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于