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
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/17674197.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」