目录
kubernetes应用升级、弹性伸缩、回滚、删除
/    

kubernetes应用升级、弹性伸缩、回滚、删除

一、准备工作

创建一个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版本:

image.png

二、应用升级

将nginx版本升级到1.17

kubectl set image deployment web nginx=nginx:1.17

参数解释:

  • nginx=nginx:1.17中前者nginx代表容器名,后者代表镜像名称,容器名可以在yaml中查看

查看升级状态:

kubectl rollout status deployment web

image.png

三、应用回滚

查看应用部署历史记录(默认保留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

image.png

查看更新历史记录:

[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
image.png

查看升级历史记录

[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

image.png

查看更新历史记录:

[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

image.png

可以看到,获取的资源前面显示unknown,且时间信息里出现了failed to get cpu utilization:missing request for cpu,这是因为我们创建的pod对象没有添加request资源声明,这样导致hpa读取不到cpu指标信息,所以要想让hpa生效,则对应的pod资源中必须添加requests资源声明:

在线编辑资源(会使用默认编辑器打开):

kubectl edit deployment web

利用查找功能,找到resources,修改成以下内容(设置资源占用的cpu和内存大小的上限和下限):

image.png

        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应用升级、弹性伸缩、回滚、删除
作  者Leif160519
出  处https://leif.fun/articles/2020/06/11/1591854976388.html
关于博主:坐标南京,运维工程师,如有问题探讨可以直接下方留言。
声援博主:如果您觉得文章对您有帮助,可以评论、订阅、收藏。您的鼓励是博主的最大动力!