Deployment

在我们发布容器中的服务时,总共有一下几种方式:

  • 将旧的pod停掉,创建新的pod并发布
  • 创建新的pod,然后将旧的pod停掉
  • 滚动式升级。创建一个新的pod,删除一个旧的pod,直到所有的旧pod都被替换

    其中最完美的升级方式就是滚动式升级,但是操作命令过于复杂,而kubernetes提供的rolling-update方式也存在着会修改原有pod标签、

    kubectl所在服务器故障导致升级中断等风险。而Deployment就是为了完美解决这个问题诞生的。

    Deployment创建后,会自动创建一个ReplicaSet,然后由其来创建pod。

Deployment的升级策略

  • 滚动更新(RollingUpdate):默认策略,如果我们的服务支持多个版本同时运行,可以选择这个策略。
  • Recreate:会一次性删除所有旧版本的pod,然后创建新的pod。如果我们的服务不支持多个版本运行,并且允许服务出现短暂的停用,

    可以选择这个策略。

    Deployment升级过程:自动创建一个新的ReplicaSet然后慢慢从0开始扩容,旧的ReplicaSet慢慢缩容至0,然后完成滚动升级。升级完成后,

    旧版本的ReplicaSet并不会被自动删除,而是会保留下来,方便回滚时使用。默认会保留升级过程中的两个旧版本ReplicaSet

deployment的yaml文件及一些命令

  • 创建命令kubectl create -f deply.yaml --record

    --record 命令会记录历史版本号
  • 修改deployment的命令:kubectl patch deployment deploymentName -p

    kubectl patch命令会更改Deployment的自由属性,并不会导致pod的更新,因为pod的模板没有被修改。更改Deployment的其他属性也不会

    导致滚动升级,例如:副本数或者部署策略
  • 修改Deployment的镜像模板:kubectl set image deployment deploymentName
  • 查看Deployment的升级过程:kubectl rollout status
  • 查看Deployment升级过程中的历史版本:kubectl rollout history deployment kubia
  • 回滚Deployment:kubectl rollout undo deployment kubia
  • 回滚Deployment到指定版本:kubectl rollout undo deployment kubia --to-revision=1

修改 Deployment 或其他资源的不同方式

方法 作用 例子
kubectl edit 使用默认编辑器打开资源配置。修改保存并退出编辑器,资源对象会被更新 kubectl edit deployment kubia
kubectl patch 修改单个资源属性 kubectl patch deployment deploymentName -p json格式的数据
kubectl apply 通过一个完整的yaml或json文件来修改资源,如果文件中定义的资源不存在,会创建一个。文件中对资源的描述必须全面,不能像patch那样 kubectl apply -f kubia-deploy.yaml
kubectl replace 将原有对象替换为yaml/json中定义的新对象。如果原有对象不存在,会报错 kubectl replace -f kubia-deploy.yaml
kubectl set image 修改pod、rs、rc、deployment、DemonSet、job中的镜像 kubectl set image deployment kubia nodejs=luksa/kubia:v2

以上这些方式修改完Deployment资源后,会自动触发滚动升级

注意:如果Deployment的pod模板引用了一个configmap/secret,那么更改configmap资源不会触发升级。需要创建一个新的configmap

然后需改pod模板引用新的configmap。

滚动升级的相关控制

  1. 在升级过程中可以控制一次替换多少个pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
spec:
selector:
matchLabels:
name: app
strategy:
rollingUpdate:
# 决定了在升级过程中最多允许超出期待副本数的数量,默认为25%
# 如果期待副本数为4,那么运行时不会超过5个pod实例
# 如果设置的不是百分数的化,则代表的允许的最大超过数量,下面这个就是指最大超过一个
maxSurge: 1
# 决定了在升级过程中,最多允许多少个pod处于不可用状态,默认为25%
# 如果期待数量为4,那么可用的pod数量最低为3
# 如果设置的不是百分数的化,则代表的允许的最大不可用数量,下面这个就是指最大不可用数为一个
maxUnavailable: 0
  1. 暂停滚动升级

    将一个Deployment创建几秒后,暂停该Deployment,这样的话会创建一个新的pod,同时旧的pod依然在运行。

    这就是所谓的金丝雀发布,可以用来验证新版本的运行使用情况。验证完毕后可以继续升级或回滚旧版本。

目前还无法实现在一个确定的位置暂时滚动升级以达到金丝雀发布,所以上述方法还不健全。

可以操作的是可以创建两个不同的deployment,然后通过控制其pod数量来实现金丝雀发布

kubectl rollout pause deployment kubia
  1. 恢复滚动升级
kubectl rollout resume deployment kubia

因为修改Deployment时会自动触发滚动升级,如果不想立即升级,可以通过不停的使用暂停滚动升级,直到对deployment的修改完毕后,再恢复滚动升级。

阻止出错版本的滚动升级

可以通过Deployment的spec.minReadySeconds和就绪探针实现,升级过程中发现新版本故障,自动停止升级。

minReadySeconds指的是,新创建的pod至少要成功运行多久之后 ,才能将其视为可用,在这个期间内,deployment不会继续滚动升级,除非这个pod已经被视为可用。

在升级过程中,pod的就绪探针返回成功后,kubernetes才会视为pod可用,而在deployment升级过程中只有在minReadySeconds时间内,

pod的就绪探针没有返回过失败,才会判断为这个新版本pod发布没有问题,然后继续后面的滚动升级动作,否则会阻止滚动升级。

可以通过设置Deployment的spec.progressDeadlineSeconds值来定义升级的时间限制,如果在设置时间内没有完成升级,则会停止升级动作。

kubernetes的Deployment的更多相关文章

  1. Kubernetes中Deployment部署故障排除

    Kubernetes中Deployment部署故障排除 字符型思维导图 排查pod状态(带标签):kubectl get pods,是否有等待处理的pod? 是?kubectl describe po ...

  2. Kubernetes之Deployment控制器

    Deployment 简介 deployment 是用来管理无状态应用的,面向的集群的管理,而不是面向的是一个不可变的个体,举例:有一群鸭子,要吃掉一个,只需要再放一个新的鸭仔就好了,不会影响什么,而 ...

  3. 使用kubernetes的deployment进行RollingUpdate

    rolling update,可以使得服务近乎无缝地平滑升级,即在不停止对外服务的前提下完成应用的更新. replication controller与deployment的区别 replicatio ...

  4. (部署)使用kubernetes的deployment进行RollingUpdate

    rolling update,可以使得服务近乎无缝地平滑升级,即在不停止对外服务的前提下完成应用的更新. replication controller与deployment的区别 replicatio ...

  5. 【转】kubernetes 中 deployment 支持哪些键值

    这个比较全,可以参考 ================= https://www.addops.cn/post/kubernetes-deployment-fileds.html ========== ...

  6. 【Kubernetes】Deployment控制器模型

    在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...

  7. kubernetes的Deployment, DaemonSet, Job 和 CronJob事例

    k8s kubernetes给node节点添加标签和删除node节点标签 Deployment配置文件exampledeploymentv1.yaml apiVersion: apps/v1 kind ...

  8. Kubernetes之deployment

    Kubernetes实现了零停机的升级过程.升级操作可以通过使用ReplicationController或者ReplicaSet实现,但是Kubernetes提供了另一种基于ReplicaSet的资 ...

  9. kubernetes之deployment滚动升级

    参考:https://blog.51cto.com/wutengfei/2116663 创建和管理多个Pod--Deployment Deployment 为 Pod 和 ReplicaSet 提供了 ...

  10. Kubernetes的Deployment对象使用

    一.什么是Deployment对象 明明ReplicaSet已经可以控制pod的数量了,为什么还需要Deployment? Deploymen实际上一个两层控制器,遵循一种滚动更新的方式来实升级现有的 ...

随机推荐

  1. 【Shiro】02 shiro.ini文件分析

    [什么是INI文件?] INI 全称:Initialization File 初始文件 Window系统文件扩展名 Shiro 使用时可以连接数据库,也可以不连接数据库. 当不使用数据库时,需要配置S ...

  2. 【Vue】Re06 组件化

    将一个应用页面拆分成若干个可重复使用的组件 一.Vue的组件的使用步骤: 1.创建组件构造器 2.注册组件 3.使用组件 <!DOCTYPE html> <html lang=&qu ...

  3. 使用AI模型替代工业仿真过程

    引自: https://www.zhihu.com/question/641951284/answer/3384531468 使用AI模型替代工业仿真,如:CAE,等等,进行仿真环境的求解运算.

  4. UBUNTU18.04 SERVER 多显卡 服务器,为防止显卡计算任务出现不意外报错,设置显卡工作状态为:设定持久模式

    参考: https://www.cnblogs.com/devilmaycry812839668/p/14799016.html https://www.cnblogs.com/devilmaycry ...

  5. 强化学习:一种新的并行算法下的参数同步更新方式——半异步更新方式——( 同步、异步 -> 半异步 )

    Abstract: 并行算法下的参数同步方式一般有同步更新和异步更新两种方式,本文在此基础之上提出了一种新的参数同步方式--半异步更新方式. Introduction: 这里用神经网络举例子,也就是神 ...

  6. WPF Boolean类型转化器收集 反转转化器

    参考链接 https://stackoverflow.com/questions/534575/how-do-i-invert-booleantovisibilityconverter Boolean ...

  7. (数据科学学习手札163)ibis:极具潜力的Python数据分析框架

    本文完整代码及附件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,今天要给大家介绍的Pyt ...

  8. WhaleStudio 2.6重磅发布!调度模块WhaleScheduler更新78项核心功能

    我们很高兴地宣布WhaleStudio 2.6版本的正式发布!新版本中包含了数据调度模块WhaleScheduler和数据集成模块WhaleTunnel的百余项核心功能更新,本文摘选了WhaleSch ...

  9. SMU Spring 2023 Trial Contest Round 11

    A. The Text Splitting 题意:给出字符串长度,给出p和q两种切割方式,任选其中一种,把字符串分割输出结果. 题解:先进行判断,p和q是否能整个的分割n,利用p和q的函数关系判断(见 ...

  10. springboot2集成oauth2坑二(The bean 'scopedTarget.oauth2ClientContext', defined in class path resource )

    码云地址:https://gitee.com/lpxs/lp-springcloud.git 有问题可以多沟通:136358344@qq.com. 由于使用Enableoauth2sso注解一直报错, ...