博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详谈kubernetes滚动更新-1
阅读量:4688 次
发布时间:2019-06-09

本文共 9439 字,大约阅读时间需要 31 分钟。

这个系列分为两个小节,第一个小节介绍deployment滚动更新时,deployment、replicaset、pod的细节以及创建过程以及deployment版本管理的方式

第二个小节将介绍滚动更新过程中最大可用、liveness以及readiness等

我们在阿里云上有两个不同版本的镜像用于测试,使用docker pull把它拉取到本地

docker pull registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1docker pull registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2

截至目前,我们并没有详细介绍过docker的操作,但是目前市面上已经有很多书籍和博客介绍docker的基本操作,没有docker操作经验的可以关注一些入门教程.

root@k8s-master:~# docker run -d  -p 10080:80 nginx:v1e88097841c5feef92e4285a2448b943934ade5d86412946bc8d86e262f80a050root@k8s-master:~# curl http://127.0.0.1:10080----------version: v1hostname: f5189a5d3ad3

注在linux里如果是以root用户登陆,则命令行前一个#标识,这里并不是注释的意思,还请注意

deployment、replicaset、pod之间的关系

+------------+                           | deployment |                           +-----+------+                                 |                                 |                                 |                                 |       +--------------------------------------------------+       |                         |                        |       |                         |                        |       |                         |                        |       |                         |                        |       |                         |                        |       |                         |                        |+------v------+           +------v------+          +------v------+|replicaset:v1|           |replicaset:v2|          |replicaset:v3|+-------------+           +------+------+          +-------------+                                 |                                 |                        +--------+---------+                        |                  |                        |                  |                    +---v---+          +---v---+                    |pod:v2 |          |pod:v2 |                    +-------+          +-------+
  • deployment调度replicaset,pod由replicaset调度
  • deployment管理多个replicaset版本,可用于回滚
  • replicaset控制pod的行为,包括新增pod、删除pod

我们首先准备一个yaml文件用于测试:

root@k8s-master:~# more roll_update.yamlapiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: image-deploymentspec:  replicas: 1  template:    metadata:      labels:        app: image-update    spec:      containers:      - name: nginx        image: registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1        imagePullPolicy: Always

简单验证一下:

root@k8s-master:~# kubectl apply -f roll_update.yamldeployment.extensions "update-deployment" created
root@k8s-master:~# kubectl get deployNAME                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGEupdate-deployment   3         3         3            3           54sroot@k8s-master:~# kubectl get rsNAME                           DESIRED   CURRENT   READY     AGEupdate-deployment-7db77f7cc6   3         3         3         56sroot@k8s-master:~# kubectl get podNAME                                 READY     STATUS    RESTARTS   AGEupdate-deployment-7db77f7cc6-7j49g   1/1       Running   0          1mupdate-deployment-7db77f7cc6-b75wn   1/1       Running   0          1mupdate-deployment-7db77f7cc6-cfnt5   1/1       Running   0          1m

deployment、replicaset、pod都已经正常启动,下面分析一下他们的行为:

deployment

root@k8s-master:~# kubectl describe deploy update-deploymentName:                   update-deploymentNamespace:              default...Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailableStrategyType:           RollingUpdateMinReadySeconds:        0RollingUpdateStrategy:  1 max unavailable, 1 max surge...NewReplicaSet:   update-deployment-7db77f7cc6 (3/3 replicas created)Events:  Type    Reason             Age   From                   Message  ----    ------             ----  ----                   -------  Normal  ScalingReplicaSet  1m    deployment-controller  Scaled up replica set update-deployment-7db77f7cc6 to 3
  • deployment创建了一个replicaset,叫做update-deployment-7db77f7cc6(7db77f7cc6是replicaset的template hash值)
  • 根据配置文件的要求,replicaset的副本数为3

replicaset

root@k8s-master:~# kubectl describe rs update-deployment-7db77f7cc6Name:           update-deployment-7db77f7cc6Namespace:      default...Controlled By:  Deployment/update-deploymentReplicas:       3 current / 3 desiredPods Status:    3 Running / 0 Waiting / 0 Succeeded / 0 Failed...Events:  Type    Reason            Age   From                   Message  ----    ------            ----  ----                   -------  Normal  SuccessfulCreate  3m    replicaset-controller  Created pod: update-deployment-7db77f7cc6-7j49g  Normal  SuccessfulCreate  3m    replicaset-controller  Created pod: update-deployment-7db77f7cc6-b75wn  Normal  SuccessfulCreate  3m    replicaset-controller  Created pod: update-deployment-7db77f7cc6-cfnt5

replicaset创建了3个pod

pod

root@k8s-master:~# kubectl describe pod update-deployment-7db77f7cc6-7j49gName:           update-deployment-7db77f7cc6-7j49gNamespace:      default...Status:         RunningIP:             10.10.169.140Controlled By:  ReplicaSet/update-deployment-7db77f7cc6...Events:  Type    Reason                 Age   From                Message  ----    ------                 ----  ----                -------  Normal  Scheduled              9m    default-scheduler   Successfully assigned update-deployment-7db77f7cc6-7j49g to k8s-node2  Normal  SuccessfulMountVolume  9m    kubelet, k8s-node2  MountVolume.SetUp succeeded for volume "default-token-v9nkm"  Normal  Pulling                9m    kubelet, k8s-node2  pulling image "registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1"  Normal  Pulled                 9m    kubelet, k8s-node2  Successfully pulled image "registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1"  Normal  Created                9m    kubelet, k8s-node2  Created container  Normal  Started                9m    kubelet, k8s-node2  Started container
  • pod被replicaset创建之后,开始分配到worker节点、拉取镜像、启动容器等一系列操作
  • 所以pod的命名方式是:update-deployment-7db77f7cc6-7j49g(deployment名字-replicaset模板hash名字-pod模板hash名字)

大家可能不禁会有疑问,为什么搞这么复杂,启动一个pod需要动用这么多组件呢?下面用一个场景说明为啥需要这么多组件:

镜像版本更新

镜像版本更新

  • 当镜像版本有更新时(三种方法都可以实现,参考前一篇文章:更新k8s镜像版本的三种方式),既要保证服务可用,又要保证在线更新,流程应该是:

    1) 先增加一个pod,镜像版本为新版本
    2) pod可用之后,删除一个老版本pod
    3) 循环第1、2步,直到老版本pod全部删除,新版本的pod全部可用

  • 上述的这个过程就是replicaset的作用,它根据需求,自动的增加新版本pod,然后删除老版本pod,直到老版本pod全部删除,新版本的pod全部可用

  • 如果此时版本需要回退,那replicaset需要把刚才的步骤逆向更新一遍,实现版本回退

  • deployment的作用就是管理replicaset。deployment会保存各个版本的replicaset,一旦需要进行版本回滚,deployment会立即回滚replicaset的版本,从而控制pod状态

下面测试一下:

使用patch命令更新镜像版本,并且使用pause命令来观察:

root@k8s-master:~# kubectl patch deployment update-deployment \--patch '{"spec": {"template": {"spec": {"containers": [{"name": "nginx","image":"registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2"}]}}}}' \&& kubectl rollout pause deployment update-deploymentdeployment.extensions "update-deployment" patcheddeployment.apps "update-deployment" paused

此时pod状态:

root@k8s-master:~# kubectl get pod -owideNAME                                 READY     STATUS        RESTARTS   AGE       IP              NODEupdate-deployment-7db77f7cc6-7j49g   1/1       Running       0          1h        10.10.169.140   k8s-node2update-deployment-7db77f7cc6-b75wn   1/1       Running       0          1h        10.10.235.211   k8s-masterupdate-deployment-7db77f7cc6-cfnt5   1/1       Terminating   0          1h        10.10.36.126    k8s-node1update-deployment-7fb7b4b557-6987x   1/1       Running       0          7s        10.10.36.127    k8s-node1update-deployment-7fb7b4b557-dxdqb   1/1       Running       0          10s       10.10.169.139   k8s-node2

新增了2个pod,而删除了1个老版本的pod

此时replicaset状态:

root@k8s-master:~# kubectl get rs -owideNAME                           DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                                                   SELECTORupdate-deployment-7db77f7cc6   2         2         2         1h        nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1   app=roll-update,pod-template-hash=3863393772update-deployment-7fb7b4b557   2         2         2         4m        nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2   app=roll-update,pod-template-hash=3963606113

有一个新版本的replicaset创建了出来,并且需求的pod数量为2,而原来的replicaset需求的pod数量从3降为2

查看replicaset版本:

root@k8s-master:~# kubectl rollout history deploy update-deploymentdeployments "update-deployment"REVISION  CHANGE-CAUSE1         
2 update version to v2

新增了一个版本2

由于使用pause命令,更新过程到此会卡主,我们让更新的过程继续下去:

root@k8s-master:~# kubectl rollout resume deployment update-deploymentdeployment.apps "update-deployment" resumed

查看状态:

root@k8s-master:~# kubectl get podNAME                                 READY     STATUS    RESTARTS   AGEupdate-deployment-7fb7b4b557-6987x   1/1       Running   0          15mupdate-deployment-7fb7b4b557-dxdqb   1/1       Running   0          15mupdate-deployment-7fb7b4b557-wg5c8   1/1       Running   0          1mroot@k8s-master:~# kubectl get rs -owideNAME                           DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                                                   SELECTORupdate-deployment-7db77f7cc6   0         0         0         1h        nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v1   app=roll-update,pod-template-hash=3863393772update-deployment-7fb7b4b557   3         3         3         14m       nginx        registry.cn-beijing.aliyuncs.com/mrvolleyball/nginx:v2   app=roll-update,pod-template-hash=3963606113

v1版本的replicaset已经没有pod,但是历史记录还是保留的,可以通过deployment调度快速回滚

转载于:https://www.cnblogs.com/tylerzhou/p/10995776.html

你可能感兴趣的文章
SYS_CONTEXT 详细用法
查看>>
Pycharm配置autopep8让Python代码更符合pep8规范
查看>>
函数的复写
查看>>
17_重入锁ReentrantLock
查看>>
winform窗口关闭提示
查看>>
64款工具,总有合适您的那款
查看>>
我的第一篇博客
查看>>
大数据学习线路整理
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
关于ProjectServer定制化项目中心页面
查看>>
使用Collectd + InfluxDB + Grafana进行JMX监控
查看>>
Linux下tar,zip命令详解
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>
Copy code from eclipse to word, save syntax.
查看>>
arguments.callee的作用及替换方案
查看>>
23 Java学习之RandomAccessFile
查看>>
P2709 小B的询问
查看>>