Deployment介绍

为了更好地解决服务编排的问题,k8s在V1.2版本开始,引入了deployment控制器,值得一提的是,这种控制器并不直接管理pod,

而是通过管理replicaset来间接管理pod,即:deployment管理replicaset,replicaset管理pod。所以deployment比replicaset的功能更强大。

deployment的主要功能有下面几个:

  • 支持replicaset的所有功能
  • 支持发布的停止、继续
  • 支持版本的滚动更新和版本回退

deployment的资源清单文件

  1. apiVersion: apps/v1 #版本号
  2. kind: Deployment #类型
  3. metadata: #元数据
  4. name: #rs名称
  5. namespace: #所属命名空间
  6. labels: #标签
  7. controller: deploy
  8. spec: #详情描述
  9. replicas: #副本数量
  10. revisionHistoryLimit: #保留历史版本,默认是10
  11. paused: #暂停部署,默认是false
  12. progressDeadlineSeconds: #部署超时时间(s),默认是600
  13. strategy: #策略
  14. type: RollingUpdates #滚动更新策略
  15. rollingUpdate: #滚动更新
  16. maxSurge: #最大额外可以存在的副本数,可以为百分比,也可以为整数
  17. maxUnavaliable: #最大不可用状态的pod的最大值,可以为百分比,也可以为整数
  18. selector: #选择器,通过它指定该控制器管理哪些pod
  19. matchLabels: #Labels匹配规则
  20. app: nginx-pod
  21. matchExpressions: #Expression匹配规则
  22. - {key: app, operator: In, values: [nginx-pod]}
  23. template: #模板,当副本数量不足时,会根据下面的模板创建pod副本
  24. metadata:
  25. labels:
  26. app: nginx-pod
  27. spec:
  28. containers:
  29. - name: nginx
  30. image: nginx:1.17.1
  31. ports:
  32. - containerPort: 80

创建deployment

创建pc-deployment.yaml,内容如下:

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: pc-deployment
  5. namespace: dev
  6. spec:
  7. replicas: 3
  8. selector:
  9. matchLabels:
  10. app: nginx-pod
  11. template:
  12. metadata:
  13. labels:
  14. app: nginx-pod
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: nginx:1.17.1

使用配置文件

  1. [root@master ~]# kubectl create -f pc-deployment.yaml
  2. deployment.apps/pc-deployment created
  3. [root@master ~]# kubectl get deploy -n dev -o wide
  4. NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
  5. pc-deployment 3/3 3 3 16s nginx nginx:1.17.1 app=nginx-pod

查看deployment控制的rs和pod,发现rs是在deployment之后加了一段字符串,而pod是在rs之后加了一段字符串

  1. [root@master ~]# kubectl get rs -n dev
  2. NAME DESIRED CURRENT READY AGE
  3. pc-deployment-5d89bdfbf9 3 3 3 2m13s
  4. [root@master ~]# kubectl get pod -n dev
  5. NAME READY STATUS RESTARTS AGE
  6. pc-deployment-5d89bdfbf9-k8j9n 1/1 Running 0 2m42s
  7. pc-deployment-5d89bdfbf9-vw87k 1/1 Running 0 2m42s
  8. pc-deployment-5d89bdfbf9-x7nsm 1/1 Running 0 2m42s

deployment功能

扩缩容

方式一:命令行

格式

  1. kubectl scale deploy deploy名称 --replicas=pod数量 -n 命名空间

通过命令行变更pod数量为5个

  1. [root@master ~]# kubectl scale deploy pc-deployment --replicas=5 -n dev
  2. deployment.apps/pc-deployment scaled
  3. [root@master ~]# kubectl get pod -n dev
  4. NAME READY STATUS RESTARTS AGE
  5. pc-deployment-5d89bdfbf9-bhcns 1/1 Running 0 83s
  6. pc-deployment-5d89bdfbf9-cfls7 1/1 Running 0 83s
  7. pc-deployment-5d89bdfbf9-k8j9n 1/1 Running 0 8m54s
  8. pc-deployment-5d89bdfbf9-vw87k 1/1 Running 0 8m54s
  9. pc-deployment-5d89bdfbf9-x7nsm 1/1 Running 0 8m54s

方式二:编辑deploy文件

格式

  1. kubectl edit deploy deploy名字 -n 命名空间

通过编辑deploy文件编辑pod数量为3个

  1. [root@master ~]# kubectl edit deploy pc-deployment -n dev
  2. 找到replicas,将其数量改为3
  3. spec:
  4. progressDeadlineSeconds: 600
  5. replicas: 3
  6. [root@master ~]# kubectl get pod -n dev
  7. NAME READY STATUS RESTARTS AGE
  8. pc-deployment-5d89bdfbf9-k8j9n 1/1 Running 0 15m
  9. pc-deployment-5d89bdfbf9-vw87k 1/1 Running 0 15m
  10. pc-deployment-5d89bdfbf9-x7nsm 1/1 Running 0 15m

镜像更新

deployment支持两种镜像更新策略:重建更新滚动更新(默认),可以通过strategy选项进行配置

  1. strategy:指定新的pod替换旧的pod的策略,支持两个属性:
  2. type:指定策略类型,支持两种策略
  3. Recreate:在创建出新的pod之前会先杀掉所有已存在的pod
  4. RollingUpdate:滚动更新,就是杀死一部分,就启动一部分,在更新过程中,存在两个版本pod
  5. rollingUpdate:当typeRollingUpdate时生效,用于为RollingUpdate设置参数,支持两个属性
  6. maxUnavailable:用来指定在升级过程中不可用pod的最大数量,默认为25%
  7. maxSurge:用来指定在升级过程中可以超过期望的pod的最大数量,默认为25%

重建更新

编辑pc-deployment.yaml,在spec节点下添加更新策略

  1. spec:
  2. strategy: #策略
  3. type: Recreate #重建更新策略
  1. [root@master ~]# vim pc-deployment.yaml
  2. [root@master ~]# kubectl apply -f pc-deployment.yaml
  3. Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
  4. deployment.apps/pc-deployment configured

创建deploy进行验证

  1. #首先记录原本的pod名
  2. [root@master ~]# kubectl get pod -n dev
  3. NAME READY STATUS RESTARTS AGE
  4. pc-deployment-5d89bdfbf9-bqf86 1/1 Running 0 8s
  5. pc-deployment-5d89bdfbf9-kz6jt 1/1 Running 0 8s
  6. pc-deployment-5d89bdfbf9-z7d9z 1/1 Running 0 8s

  7. #更改pod镜像
  8. [root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev
  9. deployment.apps/pc-deployment image updated

  10. #再次查看镜像
  11. [root@master ~]# kubectl get pod -n dev
  12. NAME READY STATUS RESTARTS AGE
  13. pc-deployment-675d469f8b-b9rwd 1/1 Running 0 27s
  14. pc-deployment-675d469f8b-kc7rr 1/1 Running 0 27s
  15. pc-deployment-675d469f8b-kxgkq 1/1 Running 0 27s

发现pod镜像已经改变了

滚动更新

编辑pc-deployment.yaml,在spec节点下添加滚动更新策略(也可以把strategy去掉,因为默认滚动更新策略)

  1. strategy:
  2. type: RollingUpdate #滚动更新策略
  3. rollingUpdate:
  4. maxUnavailable: 25%
  5. maxSurge: 25%
  1. [root@master ~]# vim pc-deployment.yaml
  2. [root@master ~]# kubectl apply -f pc-deployment.yaml
  3. Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
  4. deployment.apps/pc-deployment configured

创建deploy进行验证

  1. #记录以前的pod
  2. [root@master ~]# kubectl get pod -n dev
  3. NAME READY STATUS RESTARTS AGE
  4. pc-deployment-5d89bdfbf9-526wf 1/1 Running 0 61s
  5. pc-deployment-5d89bdfbf9-b5x5v 1/1 Running 0 64s
  6. pc-deployment-5d89bdfbf9-kc7hb 1/1 Running 0 59s
  7. #更新镜像
  8. [root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev
  9. deployment.apps/pc-deployment image updated
  10. #查看pod状态
  11. [root@master ~]# kubectl get pod -n dev
  12. NAME READY STATUS RESTARTS AGE
  13. pc-deployment-5d89bdfbf9-526wf 0/1 Terminating 0 2m2s
  14. pc-deployment-5d89bdfbf9-b5x5v 1/1 Running 0 2m5s
  15. pc-deployment-5d89bdfbf9-kc7hb 0/1 Terminating 0 2m
  16. pc-deployment-675d469f8b-7vw6x 1/1 Running 0 3s
  17. pc-deployment-675d469f8b-rzq82 0/1 ContainerCreating 0 2s
  18. pc-deployment-675d469f8b-zk4fs 1/1 Running 0 5s
  19. [root@master ~]# kubectl get pod -n dev
  20. NAME READY STATUS RESTARTS AGE
  21. pc-deployment-675d469f8b-7vw6x 1/1 Running 0 38s
  22. pc-deployment-675d469f8b-rzq82 1/1 Running 0 37s
  23. pc-deployment-675d469f8b-zk4fs 1/1 Running 0 40s

发现pod是旧的一遍停止新的一边创建,最后全变成了新的

滚动更新的过程

镜像更新中rs的变化

前期准备:

  1. #重建deployment
  2. [root@master ~]# kubectl delete -f pc-deployment.yaml
  3. deployment.apps "pc-deployment" deleted
  4. #添加record参数,表明创建时记录
  5. [root@master ~]# kubectl create -f pc-deployment.yaml --record
  6. deployment.apps/pc-deployment created
  7. [root@master ~]# kubectl get deploy,rs,pod -n dev
  8. NAME READY UP-TO-DATE AVAILABLE AGE
  9. deployment.apps/pc-deployment 3/3 3 3 81s
  10.  
  11. NAME DESIRED CURRENT READY AGE
  12. replicaset.apps/pc-deployment-5d89bdfbf9 3 3 3 81s
  13.  
  14. NAME READY STATUS RESTARTS AGE
  15. pod/pc-deployment-5d89bdfbf9-4bg2j 1/1 Running 0 81s
  16. pod/pc-deployment-5d89bdfbf9-gbt95 1/1 Running 0 81s
  17. pod/pc-deployment-5d89bdfbf9-tstlh 1/1 Running 0 81s

新建两个xshell窗口,用于监听rs和pod

在2窗口中监听rs,3窗口中监听pod

  1. #在2窗口中输入
  2. [root@master ~]# kubectl get rs -n dev -w
  3. NAME DESIRED CURRENT READY AGE
  4. pc-deployment-5d89bdfbf9 3 3 3 6m18s
  5. #在3窗口中输入
  6. [root@master ~]# kubectl get pod -n dev -w
  7. NAME READY STATUS RESTARTS AGE
  8. pc-deployment-5d89bdfbf9-4bg2j 1/1 Running 0 6m56s
  9. pc-deployment-5d89bdfbf9-gbt95 1/1 Running 0 6m56s
  10. pc-deployment-5d89bdfbf9-tstlh 1/1 Running 0 6m56s

在1窗口中改变pod镜像

  1. [root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev
  2. deployment.apps/pc-deployment image updated

查看3窗口中pod的变化,发现序号5开头的pod在逐渐暂停,序号6开头的pod在逐渐创建

查看2窗口中rs的变化,可以看见序号5开头的rs的pod数在减少,序号6开头的rs的pod数在增加

在1窗口中查看最终rs变化,发现原来的rs依旧存在,只是pod数量变为了0,而后又新产生了一个rs,pod数量为3,其实这就是deployment能够进行版本回退的奥妙所在,后面会详细解释

  1. [root@master ~]# kubectl get rs -n dev
  2. NAME DESIRED CURRENT READY AGE
  3. pc-deployment-5d89bdfbf9 0 0 0 11m
  4. pc-deployment-675d469f8b 3 3 3 3m12s

版本回退

deployment支持版本升级过程中的暂停,继续功能以及版本回退等诸多功能,下面具体来看

kubectl rollout:版本升级相关功能,支持下面的选项:

  • status:显示当前升级状态
  • history:显示升级历史记录
  • pause:暂停版本升级过程
  • resume:继续已经暂停的版本升级过程
  • restart:重启版本升级过程
  • undo:回滚到上一级版本(可以使用--to-revision回滚到指定版本)
  1. #查看升级状态
  2. [root@master ~]# kubectl rollout status deploy pc-deployment -n dev
  3. deployment "pc-deployment" successfully rolled out
  4.  
  5. #查看升级历史(注意:如果只显示版本号说明一开始使用yaml创建文件的时候没有加上--record命令)
  6. [root@master ~]# kubectl rollout history deploy pc-deployment -n dev
  7. deployment.apps/pc-deployment
  8. REVISION CHANGE-CAUSE
  9. 1 kubectl create --filename=pc-deployment.yaml --record=true
  10. 2 kubectl create --filename=pc-deployment.yaml --record=true
  11.  
  12. #版本回滚
  13. #这里使用--to-revision=1回滚到1版本,如果省略这个选项,则会回退到上个版本
  14. [root@master ~]# kubectl rollout undo deploy pc-deployment --to-revision=1 -n dev
  15. deployment.apps/pc-deployment rolled back
  16.  
  17. #查看是否回滚成功,发现5序号开头的rs被启动了
  18. [root@master ~]# kubectl get rs -n dev
  19. NAME DESIRED CURRENT READY AGE
  20. pc-deployment-5d89bdfbf9 3 3 3 31m
  21. pc-deployment-675d469f8b 0 0 0 22m

金丝雀发布

deployment支持更新过程中的控制,如"暂停(pause)"或"继续(resume)"更新操作

比如有一批新的pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新的pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。

  1. #更新deployment版本,并配置暂停deployment
  2. [root@master ~]# kubectl set image deploy pc-deployment nginx=nginx:1.17.2 -n dev && kubectl rollout pause deploy pc-deployment -n dev
  3. deployment.apps/pc-deployment image updated
  4. deployment.apps/pc-deployment paused
  5.  
  6. #查看rs,发现老版本rs没有减少,新版本rs增加一个
  7. [root@master ~]# kubectl get rs -n dev
  8. NAME DESIRED CURRENT READY AGE
  9. pc-deployment-5d89bdfbf9 3 3 3 44m
  10. pc-deployment-675d469f8b 1 1 1 35m
  11.  
  12. #在窗口2中查看deploy状态,发现deploy正在等待更新且已经有1个更新好了
  13. [root@master ~]# kubectl rollout status deploy pc-deployment -n dev
  14. Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
  15.  
  16. #在窗口1中继续deploy的更新
  17. [root@master ~]# kubectl rollout resume deploy pc-deployment -n dev
  18. deployment.apps/pc-deployment resumed
  19.  
  20. #查看窗口2的状态
  21. Waiting for deployment spec update to be observed...
  22. Waiting for deployment spec update to be observed...
  23. Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
  24. Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
  25. Waiting for deployment "pc-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
  26. Waiting for deployment "pc-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
  27. Waiting for deployment "pc-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
  28. Waiting for deployment "pc-deployment" rollout to finish: 1 old replicas are pending termination...
  29. Waiting for deployment "pc-deployment" rollout to finish: 1 old replicas are pending termination...
  30. deployment "pc-deployment" successfully rolled out
  31.  
  32. #在窗口1查看rs更新结果,发现老版本均停止,新版本已经创建好
  33. [root@master ~]# kubectl get rs -n dev
  34. NAME DESIRED CURRENT READY AGE
  35. pc-deployment-5d89bdfbf9 0 0 0 49m
  36. pc-deployment-675d469f8b 3 3 3 40m

k8s之deployment详解的更多相关文章

  1. k8s之yaml详解

    k8s之yaml详解 apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数 ...

  2. Kubernetes K8S之资源控制器RC、RS、Deployment详解

    Kubernetes的资源控制器ReplicationController(RC).ReplicaSet(RS).Deployment(Deploy)详解与示例 主机配置规划 服务器名称(hostna ...

  3. k8s应用配置详解

    1. 概述 k8s主要通过Object定义各种部署任务(例如:部署应用.部署Ingress路由规则.部署service等等),通过kubectl命令远程操作k8s集群. Object的定义通常以Yam ...

  4. Kubernetes K8S之Ingress详解与示例

    K8S之Ingress概述与说明,并详解Ingress常用示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...

  5. K8s工作流程详解

    在学习k8s工作流程之前,我们得再次认识一下上篇k8s架构与组件详解中提到的kube-controller-manager一个k8s中许多控制器的进程的集合. 比如Deployment 控制器(Dep ...

  6. k8s记录-Dockerfile详解

    Dockerfile命令详解 下面我们来分别介绍下上面使用到的命令: FROM 格式:FROM 或FROM :. 解释:FROM必须是Dockerfile里的第一条指令(注视除外),后面跟有效的镜像名 ...

  7. K8s核心概念详解

    kubernetes(通常简称为K8S),是一个用于管理在容器中运行的应用的容器编排工具. Kubernetes不仅有你所需要的用来支持复杂容器应用的所有东西,它还是市面上最方便开发和运维的框架. K ...

  8. 从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

    作者| 阿里巴巴资深技术专家.CNCF 9个 TCO 之一 李响 一.什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台.Kubernetes 这个 ...

  9. k8s之Service详解-Service使用

    实验环境准备 在使用service之前,首先利用deployment创建出3个pod,注意要为pod设置app=nginx-pod的标签 创建deployment.yaml,内容如下 apiVersi ...

随机推荐

  1. Deep Learning部署TVM Golang运行时Runtime

    Deep Learning部署TVM Golang运行时Runtime 介绍 TVM是一个开放式深度学习编译器堆栈,用于编译从不同框架到CPU,GPU或专用加速器的各种深度学习模型.TVM支持来自Te ...

  2. 图分析Rapids cuGraph

    图分析Rapids cuGraph 英伟达(Nvidia)建立的新的开源库可能是推进分析和使图形数据库更快的秘密要素. 在Nvidia GPU上进行并行处理. Nvidia很久以前就不再只是" ...

  3. 使用adb命令在模拟器安装apk

    1.adb connect 127.0.0.1:7555 连接网易模拟器地址2.adb devices -L 查看有几个连接端口地址3.执行推送配置文件 命令 adb push 文件 路径

  4. wrk(2)- Lua 脚本的使用

    背景 要用 wrk 进行压测 看了下其他同事的压测,都用了 Lua 脚本来自定义一些东西 所以这一篇主要讲 Lua 脚本 Lua 介绍 Lua 脚本是一种轻量小巧的脚本语言,用标准 c 语言编写,并以 ...

  5. 【读书笔记】《C语言 从入门到精通》(第三版)笔记

    C语言,上学的时候都没学好,没想到现在却靠它吃饭.因为对C语言还是比较熟悉,所以买这本书是用来当"字典"用的.所以下面的笔记不会有很基础的内容. 1.书籍介绍 2.结构体 3.[C ...

  6. 【题解】localmaxima 数论

    # T749 localmaxima 权限限制没有超链接 题目描述 Description 给出一个排列,若其中一个数比它前面的数都大,则称为localmaxima数,求一个随机排列中localmax ...

  7. 【题解】Luogu P3123 [USACO15OPEN]贝茜说哞Bessie Goes Moo

    Luogu P3123 [USACO15OPEN]贝茜说哞Bessie Goes Moo 题目描述 Farmer John and Bessie the cow love to exchange ma ...

  8. NOIP模拟测试9「随·单·题」

    liu_runda出的题,先$\%\%\%\%\%\%\%\%\%\%\%$为敬 随 考试时没有Qj 然后甚至没做,甚至没交 我不知道我怎么想的 这个题挺难改 你需要用到 循环矩阵快速幂,矩阵快速幂优 ...

  9. 在element的table修改事件中修改数据,table的数据也会修改

    大家在修改的时候有的会通过点击事件里面获取点击列表的值然后去赋值,但是row是Object对象类型,如果直接赋值的话,就变成了浅拷贝,复制的是地址,导致在表单中改变值的时候table中的数据也跟着改变 ...

  10. 温故知新,Blazor遇见大写人民币翻译机(ChineseYuanParser),践行WebAssembly SPA的实践之路

    背景 在之前<温故知新,.Net Core遇见Blazor(FluentUI),属于未来的SPA框架>中我们已经初步了解了Blazor的相关概念,并且根据官方的指引完成了<创建我的第 ...