创建一个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
命令后会将升级的命令记录下来。
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
若继续回滚到上个版本,那也只能回滚到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,则
[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
设置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
“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill
标 题:kubernetes应用升级、弹性伸缩、回滚、删除