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

本贴最后更新于 1624 天前,其中的信息可能已经天翻地覆

一、准备工作

创建一个 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
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...