23、k8s-pod的控制器-第二种-Deployment(Deploy)-pod的增减(edit、scale)-更新(set镜像)策略(pod重建更新、滚动更新)-rs版本回退(--record)-金丝雀发布(pause、resume)

概念:Deployment控制器是在Replicaset基础上衍生而来的、Deployment是通过控制Replicaset来间接管理pod的、所以Deployment的功能比Replicaset强大、也常用

 

Deployment的功能:
    ·支持Replicaset的所有功能
    ·支持发布的停止、继续
    ·支持版本的滚动更新和版本的回退

常用的yaml案例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-deployment
  namespace: dev
  labels:
    chen: deployment

spec: #详细描述
  replicas: 3   #创建的pod数量
  revisionHistoryLimit: 3       #保留历史版本数量(实际就是保留的replicaset的数量)、默认是10
  paused: false         #暂停部署默认是false、不暂停
  progressDeadlineSeconds: 600          #部署超时时间(s)、默认是600s
  strategy:     #策略
    type: RollingUpdata #滚动更新策略
    rollingUpdata:      #滚动更新
      maxSurge: 30%     #最大额外存在的副本数量、可以百分比也可以是整数
      maxUnavaiTable: 30%       #最大不可用状态的pod的最大值、可以百分比、也可以是整数
  selector:     #选择器、通过他指定该控制器管哪些pod
    matchLabels:                #labels匹配规则
      app: nginx-pod
    matchExpressions:   #Expressions匹配规则
      - {key: app, operator: In, values: [nginx-pod]}

  template:     #模板、当副本数量不够时、会根据模板下面的规则创建pod
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

 

创建简单的Deployment案例

1、新建yaml文件:vim pc-deployment.yaml
-------------------------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pc-deployment
  namespace: dev

spec:
  replicas: 3
  selector:
    matchLabels:        #匹配的标签
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1

------------------------------------------------------
2、创建deployment:kubectl create -f pc-deploymnet.yaml
3、查看创建的deployment: kubectl get deploy pc-deployment -ndev -o wide
-------------------------------------------------------------------------
NAME            READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES         SELECTOR
pc-deploymnet   3/3     3            3           2m45s   nginx        nginx:1.17.1   app=nginx-pod
------------------------------------------------------------------------------------------------------

4、查看deployment所控制的replicaset: kubectl get rs -ndev
---------------------------------------------------------------------
NAME                       DESIRED   CURRENT   READY   AGE
pc-deploymnet-5d89bdfbf9   3         3         3       5m
#可以看到这个rs的名称是deployment名称后面跟着一个随机字符串的
-------------------------------------------------------------------------
5、查看deployment下由replicaset控制的pod:kubectl get pods -ndev
-------------------------------------------------------------------------
pc-deploymnet-5d89bdfbf9-89tjb   1/1     Running   0          6m58s
pc-deploymnet-5d89bdfbf9-dcvlb   1/1     Running   0          6m58s
pc-deploymnet-5d89bdfbf9-qtg2c   1/1     Running   0          6m58s

#可以看到pod的命名是replicaset名称后面跟着一串字符串
------------------------------------------------------------------------

 

=========================pod数量===========================

deployment的扩容与缩减(针对的是pod)

方法一:通过命令行来修改pod的数量(replicas的数量): 
    ·scale deploy pc-deploymnet -ndev --replicas=5
    ·查看deploy下的pod数量:kubectl get deploy pc-deploymnet -ndev -owide
    ---------------------------------------------------------------------------    
NAME            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
pc-deploymnet   5/5     5            5           13m   nginx        nginx:1.17.1   app=nginx-pod
    -----------------------------------------------------------------------------
    
方法二:使用编辑命令edit:
    · kubectl edit deploy pc-deploymnet -ndev
--------------------------------------
    spec:
    replicas: 3
    
    #修改了副本的数量为3
-----------------------------------

 

===============================更新策略============================

deployment的镜像更新策略

支持两种更新策略:可以通过strategy选项进行配置
    ·重建更新
    ·滚动更新(默认)
spec:
  strategy:      #指定新的pod替换旧的pod策略、支持两个属性
    type:        #指定策略类型、支持两种策略
      Recreate:   #重建更新:在创建出新的pod之前会先杀掉所有已存在的pod
      RollingUpdata:#滚动更新:就是杀死一部分、就启动一部分、在更新过程中、存在两个版本pod
    rollingUpdata:    #当type为rollingUpdata时生效、用于为RollingUpdata设置的参数、支持两个属性
      maxUnavailabel:    #用来指定在升级过程中不可用pod的最大数量、默认为25%
      maxSurge:    #用来指定在升级过程中可以超过期望pod的最大数量、默认为25%

 

deployment的重建更新:创建出新的pod之前会先杀掉所有已存在的pod、再创建新的pod

1、创建yaml文件:vim pc-deploymnet.yaml
----------------------------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pc-deploymnet
  namespace: dev

spec:
  strategy:            #更新策略
    type: Recreate     #重建更新
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
-----------------------------------------
2、更新deployment:kubectl apply -f pc-deploymnet.yaml        #这里使用apply是存在就更新
3、查看pod:kubectl get pods -ndev
4、重新开一个shell窗口用来实时监视deployment下pod的重建更新过程:
    ·kubectl get pods -ndev -w            # -w可以实时观看pod的状态(运行、停止、删除、创建)
5、使用set或者edit更改pod镜像版本后观看pod的实时状态过程:
    ·kubectl set image deploy pc-deploymnet nginx=nginx:1.17.2 -ndev

 

 

deployment的滚动更新:先是新建一个pod后、再删除一个旧的pod、再新建一个新的pod、再删除一个旧的pod、重复即可完成所有pod的更新

spec:
  strategy:    #更新策略
    type: RollingUpdate    #滚动更新
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
---------------------------------------------------
1、创建yaml文件(使用上面的修改):
----------------------------------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: pc-deploymnet
  namespace: dev

spec:
  strategy:                    #更新策略
    type: RollingUpdate        #滚动更新
    rollingUpdate:             #滚动更新规则
      maxUnavailable: 25%
      maxSurge: 25%
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
---------------------------------------------------
2、创建deployment:kubectl apply -f pc-deploymnet.yaml      
3、再开另一个shell窗口持续查看pod的状态
    ·kubectl get pods -ndev -w
4、这时再去执行镜像的版本更新:
    ·kubectl set image deploy pc-deploymnet nginx=nginx:1.17.3 -ndev
    ·再实时查看另一个窗口pod的状态
    ·这时可以看到pc-deployment下的pod先是新建一个pod后、再删除一个旧的pod、再新建一个新的pod、再删除一个旧的pod、重复三次即可完成所有pod的更新

 

==========================版本回退--record=========================

1、先删掉deployment控制器:kubectl delete -f pc-deploymnet.yaml
2、再新建deployment(这次是支持回退版本):使用 --record
    ·kubectl create -f pc-deploymnet.yaml --record
3、查看deployment、replicaset、pod:
    ·kubectl get deploy,rs,pod -ndev -owide
4、执行镜像更新:
    ·kubectl set image deploy pc-deploymnet nginx=nginx:1.17.2 -ndev
5、查看replicaset:
    ·kubectl get rs -ndev -w
    ·此时会发现存在两个rs、一个是新的rs、一个是旧的rs(用作版本回退而保留、只不过里面的pod已删除)
---------------------------------------------------------------------------------------------
NAME                       DESIRED   CURRENT   READY   AGE
pc-deploymnet-5d89bdfbf9   0         0         0       10m        #旧的rs
pc-deploymnet-675d469f8b   3         3         3       23s
-----------------------------------------------------------------------------------------------

 版本回退(--record)的功能选项:kubectl  rollout   选项

deployment支持升级过程中的暂停、继续功能以及版本回退等诸多功能
kubectl rollout:版本升级相关功能、支持下面的选项
    ·status    显示当前的升级状态
    ·history    显示升级的历史记录
    ·pause      暂停版本升级过程
    ·resume     继续已经暂停的版本升级过程
    ·restart    重启版本升级过程
    ·undo       回滚到上一级版本(可以使用--to-revision=版本号、回滚到指定的版本)

------------------------------------------------------------------------
1、查看升级状态: kubectl rollout status deploy pc-deploymnet -ndev
-----------------------------------------------------------------------
deployment "pc-deploymnet" successfully rolled out        #说明升级成功
-----------------------------------------------------------------------
2、查看升级的历史:kubectl rollout history deploy pc-deploymnet -ndev
---------------------------------------------------------------------
REVISION  CHANGE-CAUSE
1         kubectl create --filename=pc-deploymnet.yaml --record=true    #第一次升级使用的命令
2         kubectl create --filename=pc-deploymnet.yaml --record=true    #第二次升级使用的命令

#注意:如果在创建deploy的时候没有加 --record 那么在使用这个history的时候是没有这两行信息的,只会显示版本号1和2
-------------------------------------------------------------------------------------------------------------

3、回退到指定版本:
    ·先查看历史版本:kubectl rollout history deploy pc-deploymnet -ndev
    -------------------------------------------------------------------------------------
    REVISION  CHANGE-CAUSE
    1         kubectl create --filename=pc-deploymnet.yaml --record=true    #第一个版本
    2         kubectl create --filename=pc-deploymnet.yaml --record=true    #第二个版本
    3         kubectl create --filename=pc-deploymnet.yaml --record=true    #第三个版本
    -------------------------------------------------------------------------------------------
    ·再查看rs:kubectl get rs -ndev
    ---------------------------------------------------------------------------------------------
    NAME                       DESIRED   CURRENT   READY   AGE
    pc-deploymnet-5d89bdfbf9   0         0         0       31m        #第一个版本的rs、pod已不存在
    pc-deploymnet-675d469f8b   0         0         0       21m        #第二个版本的rs、pod已不存在
    pc-deploymnet-7865c58bdf   3         3         3       58s        #正在运行的第三个版本rs
    -----------------------------------------------------------------------------------------------
    ·再回退到第一个版本:kubectl rollout undo deploy pc-deploymnet --to-revision=1 -ndev
    ·再查看rs:kubectl get rs -ndev
    -------------------------------------------------------------------------------------------------
    NAME                       DESIRED   CURRENT   READY   AGE
    pc-deploymnet-5d89bdfbf9   3         3         3       35m        #pod已运行再第一个版本上
    pc-deploymnet-675d469f8b   0         0         0       26m
    pc-deploymnet-7865c58bdf   0         0         0       5m39s
    --------------------------------------------------------------------------------------------------
    ·再查看历史记录:kubectl rollout history deploy pc-deploymnet -ndev
    --------------------------------------------------------------------------------------------------  
    REVISION  CHANGE-CAUSE
    2         kubectl create --filename=pc-deploymnet.yaml --record=true
    3         kubectl create --filename=pc-deploymnet.yaml --record=true
    4         kubectl create --filename=pc-deploymnet.yaml --record=true
    
    #发现1版本已经不见、取而代之的是4版本
    ---------------------------------------------------------------------------------------------------

 

版本回退之-金丝雀发布(pause)

deployment支持更新过程中的控制、如暂停(pause)或继续(resume)更新操作
比如有一批新的pod资源创建完成后立即暂停更新过程、此时、仅存在一部分新版本的应用、主体部分还是旧的版本、
然后再筛选一小部分的用户请求路由到新版本的pod应用、继续观察能否稳定的按期望的方式运行、确定设帝国没问题之后、
再继续完成余下的pod资源滚动更新、否则立即回滚更新操作、这就是所谓的金丝雀发布
--------------------------------------------------------------------------------
案例:在上面的基础上
1、更新deployment版本并配置暂停deployment:
    ·kubectl set image deploy pc-deploymnet nginx=nginx:1.17.4 -ndev && kubectl rollout pause deployment pc-deploymnet -ndev
    ----------------------------------------------------------
    deployment.apps/pc-deploymnet image updated
    deployment.apps/pc-deploymnet paused            #暂停
    -----------------------------------------------------------
    ·观察更新状态:kubectl rollout status deploy pc-deploymnet -ndev
    ------------------------------------------------------------------------
    Waiting for deployment "pc-deploymnet" rollout to finish: 1 out of 3 new replicas have been updated...    
    #这里显示正在等待更新、有3个要更新、现在只更新了一个、如果不继续(resume)就一直维持这个状态
    -----------------------------------------------------------------------------------------------------------
    
   ·查看rs的状态:kubectl get rs -ndev
   --------------------------------------------------------------
   NAME                       DESIRED   CURRENT   READY   AGE
    pc-deploymnet-5d89bdfbf9   3         3         3       59m      #旧的还存在
    pc-deploymnet-675d469f8b   0         0         0       49m
    pc-deploymnet-6c9f56fcfb   1         1         1       4m20s    #发现新的rs下已经有一个pod新建起来了
    pc-deploymnet-7865c58bdf   0         0         0       28m    
    ------------------------------------------------------------------------------------------------------
    
2、执行继续更新:kubectl rollout resume deploy pc-deploymnet -ndev
3、查看rs的状态:kubectl get rs -ndev
------------------------------------------------------------------------
NAME                       DESIRED   CURRENT   READY   AGE
pc-deploymnet-5d89bdfbf9   0         0         0       62m          #旧的rs已停止
pc-deploymnet-675d469f8b   0         0         0       52m
pc-deploymnet-6c9f56fcfb   3         3         3       7m30s        #pod全跑到新的rs这边了
pc-deploymnet-7865c58bdf   0         0         0       32m
--------------------------------------------------------------------------
4、查看deployment的更新状态:kubectl rollout status deploy pc-deploymnet -ndev
----------------------------------------------
deployment "pc-deploymnet" successfully rolled out
-----------------------------------------------------


5、删除deployment:kubectl delete -f pc-deploymnet.yaml

 

posted @ 2024-07-01 00:12  little小新  阅读(38)  评论(0编辑  收藏  举报