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