K8S之使用Deployment实现滚动更新

news2024/10/5 19:18:43

滚动更新

  • 滚动更新简介
  • 使用Deployment实现滚动更新
    • 相关字段介绍
    • 测试滚动更新
      • 观察滚动更新
      • 查看历史版本
  • 自定义滚动更新策略
    • 自定义配置建议
    • 实践自定义策略
      • 通过 RollingUpdateStrategy 字段来设置滚动更新策略
      • 使用Recreate更新策略

滚动更新简介

滚动更新是一种自动化程度较高的发布方式,用户体验比较平滑,是目前成熟型技术组织所采用的主流发布方式,一次滚动发布一般由若干个批次组成,每批的数量一般是可以配置的(通过发布模板定义)。批次间可留观察间隔,通过手工验证或监控反馈确保没有问题再继续下一批次,所以总体上滚动式发布过程是比较缓慢的。

使用Deployment实现滚动更新

相关字段介绍

通过编写资源文件实现,涉及的字段如下:

kubectl explain deployment.spec

配图,标注

  • paused:暂停,当我们更新的时候创建pod先暂停,不是立即更新
    (ps. 金丝雀发布 会使用到)
  • strategy:更新策略,支持的滚动更新策略
  • revisionHistoryLimit : 保留的历史版本数,默认是10个。
    (ps. 需要回滚时使用,每更新镜像会产生一个版本,默认保留10个版本,回滚时可指定版本)

看更新策略

kubectl explain deploy.spec.strategy

在这里插入图片描述

更新的2种策略

  • Recreate:重建式更新,删除一个pod更新一个 pod。
  • RollingUpdate :滚动更新,定义滚动更新的更新方式的,也就是pod能多几个,少几个,控制更新力度的

看RollingUpdate 滚动更新的配置

kubectl explain deploy.spec.strategy.rollingUpdate

在这里插入图片描述

  • maxSurge:更新的过程当中最多允许超出的指定的目标副本数有几个
    它有两种取值方式,第一种直接给定数量,第二种根据百分比,百分比表示原本是5个,最多可以超出20%,那就允许多一个,最多可以超过40%,那就允许多两个
  • maxUnavailable:最多允许几个不可用
    假设有5个副本,maxUnavailable = 1表示:最多一个不可用,就 最少有4个可用

测试滚动更新

观察滚动更新

例子:用deployment先创建一个pod ,变更镜像再重新更新pod。观察

vim deploy-demo.yaml 

编写Deployment资源文件

apiVersion: apps/v1  # deployment对应的api版本
kind: Deployment     # 创建的资源是deployment
metadata:
  name: myapp-v1    # deployment的名字
spec:
  replicas: 2     # deployment管理的pod副本数
  selector:       # 标签选择器
    matchLabels:  # 筛选定义的标签需要跟template.metadata.labels定义的标签一致
      app: myapp
      version: v1
  template:
    metadata:
      labels:    # Pod具有的标签
        app: myapp
        version: v1
    spec:   #定义容器的属性
      containers:  
      - name: myweb
        image: janakiramm/myapp:v1     # 容器使用的镜像
        imagePullPolicy: IfNotPresent  # 镜像拉取策略
        ports:
        - containerPort: 80     # 容器里的应用的端口

更新资源清单文件

kubectl apply -f deploy-demo.yaml

在终端1下 执行如下:

kubectl get pods -l app=myapp -w

打开一个新的终端2窗口更改镜像版本,按如下操作:

vim deploy-demo.yaml

把 "image: janakiramm/myapp:v1 "变成 “image: janakiramm/myapp:v2”

保存退出,执行

kubectl apply -f deploy-demo.yaml 

再回到 终端1 监测的那个窗口,可以看到信息如下:

在这里插入图片描述

pending表示正在进行调度,ContainerCreating表示正在创建一个pod,running表示运行一个pod,running起来一个pod之后再Terminating一个pod,以此类推,直 到所有pod完成滚动升级

在另外一个终端3 执行

kubectl get rs

显示如下:
在这里插入图片描述

上面可以看到rs有两个,下面那个是升级之前的,已经被停掉,但是可以随时回滚

查看历史版本

查看 myapp-v1 这个控制器的滚动历史

kubectl rollout history deployment myapp-v1 -n default

显示如下:每更新镜像会产生一个版本
在这里插入图片描述

回滚操作如下:
“–to-revision” 指定要回滚到的版本号

kubectl rollout undo deployment/myapp-v1 --to-revision=1 -n default

在这里插入图片描述

kubectl get pods -l app=myapp -w

发现runing状态的又回到了第一版
在这里插入图片描述

自定义滚动更新策略

自定义配置建议

maxSurge 和 maxUnavailable 用来控制滚动更新的更新策略

取值范围

  • 填写整数类型的话,范围如下(ps. 两者不能同时为0):
    – maxUnavailable: 0 ~ replicas的值(副本数)
    – maxSurge: 0 ~ replicas的值(副本数)

  • 填写比例的话,范围如下(ps. 两者不能同时为0):
    – maxUnavailable: 0%~100%;(向下取整,比如10个副本,5%的话 相当于 0.5个,但计算按照0个)
    – maxSurge: 0%~100%;(向上取整,比如10个副本,5%的话 相当于 0.5个,但计算按照1个)

建议配置
maxUnavailable 设置为 0
maxSurge 设置为 1
建议生产环境提供的默认配置。即 “一上一下,先上后下” 最平滑原则:1个新版本pod ready(结合readiness就绪性探测)后,才销毁旧版本pod。
此配置适用场景:平滑更新、保证服务平稳,但也有缺点,就是“太慢”了。

配置总结: maxUnavailable:和期望的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;
maxSurge:和期望的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。

实践自定义策略

通过 RollingUpdateStrategy 字段来设置滚动更新策略

修改更新策略:maxUnavailable=1,maxSurge=1

kubectl patch deployment myapp-v1 -p '{"spec":{"strategy":{"rollingUpdate": {"maxSurge":1,"maxUnavailable":1}}}}' 

查看myapp-v1这个控制器的详细信息

kubectl describe deployment myapp-v1

在这里插入图片描述

这个rollingUpdate更新策略变成了新设定的,因为创建deployment 时,设定的pod副本数是3,1 max unavailable表示:最少不能少于2个pod,1 max surge表示:最多不能超过4个pod

使用Recreate更新策略

vim deploy-demo.yaml 

编写Deployment资源文件

apiVersion: apps/v1  
kind: Deployment     
metadata:
  name: myapp-v1    
spec:
  strategy:  # 使用更新策略类型为Recreate
    type: Recreate
  replicas: 2     
  selector:       
    matchLabels:  
      app: myapp
      version: v1
  template:
    metadata:
      labels:    
        app: myapp
        version: v1
    spec:   
      containers:  
      - name: myweb
        image: janakiramm/myapp:v2  # 变更镜像apply才更新生效     
        imagePullPolicy: IfNotPresent  
        ports:
        - containerPort: 80     

更新资源清单文件

kubectl apply -f deploy-demo.yaml

打开新的终端,看pod更新过程

kubectl get pods -l app=myapp -w

发现 先都删除旧pod后再启动新的pod
在这里插入图片描述

总结:recreate这种更新策略,会把之前的所有pod都删除,再创建新的pod,风险很大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1476968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门06 数据的共享与保护

图源:文心一言 听课笔记简单整理,供小伙伴们参考,内容包含“🐋5.2 变量的生存期与可见性、🐋5.5 静态成员与静态函数、🐋5.6 友元函数与友元类、🐋5.7 共享数据的保护 / const关键字、&#x1…

使用Fragments(片段)提升你的Vue.js开发体验

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

JS进阶——深入对象

版权声明 本文章来源于B站上的某马课程,由本人整理,仅供学习交流使用。如涉及侵权问题,请立即与本人联系,本人将积极配合删除相关内容。感谢理解和支持,本人致力于维护原创作品的权益,共同营造一个尊重知识…

docker安装单机版canal和使用

说明:我安装的组件架构如下: 1、准备一台虚拟机,192.168.2.223,我安装的时候,docker只支持canal1.1.6版本,1.1.7无法使用docker安装.还有一点要补充,就是1.1.6好像不支持es8.0以上版本&#x…

基于springboot实现的牙科诊所系统

一、系统架构 前端:html | layui | js | css 后端:springboot | mybatis 环境:jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. web端-首页 02. web端-医生介绍 03. web端-新闻资讯 04. web端-关于我们 05. web…

mini-spring|关于Bean对象作用域以及FactoryBean的实现和使用

需求 FactoryBean 直接配置FactoryBean 获取FactoryBean中的Bean对象 FactoryBean的getObject方法通过反射获取Bean对象 由此省去对实体Dao类的定义 解决方法 对外提供一个可以二次从 FactoryBean 的 getObject 方法中获取对象的功能即可 整体架构 整个的实现过程包括了两部…

Spark Bloom Filter Join

1 综述 1.1 目的 Bloom Filter Join,或者说Row-level Runtime Filtering(还额外有一条Semi-Join分支),是Spark 3.3对运行时过滤的一个最新补充   之前运行时过滤主要有两个:动态分区裁剪DPP(开源实现&am…

electron-release-server部署electron自动更新服务器记录

目录 一、前言 环境 二、步骤 1、下载上传electron-release-server到服务器 2、宝塔新建node项目网站 3、安装依赖 ①npm install ②安装并配置postgres数据库 ③修改项目配置文件 ④启动项目 ⑤修改postgres的认证方式 ⑥Cannot find where you keep your Bower p…

Unity(第十四部)光照

原始的有默认灯光、除了默认的你还可以创建 1、定向光源(类似太阳、从无限远的地方射向地面的光,光源位置并不影响照射角度等,不同方向的旋转影响角度和明亮) 1. 颜色:调整光的颜色2. 模式:混合是实时加烘…

【InternLM 实战营笔记】LMDeploy 的量化和部署

环境配置 vgpu-smi 查看显卡资源使用情况 新开一个终端执行下面的命令实时观察 GPU 资源的使用情况。 watch vgpu-smi复制环境到我们自己的 conda 环境 /root/share/install_conda_env_internlm_base.sh lmdeploy激活环境 conda activate lmdeploy安装依赖库 # 解决 Modu…

SpringBoot项目中如何结合Mybatis进行数据库查询

在Spring Boot项目中使用Mybatis进行数据库操作是一种常见的实现方式。下面我将展示如何在Spring Boot项目中整合Mybatis。这个示例将包括几个主要部分:项目依赖配置、配置文件、实体类、Mapper接口及其XML配置文件、服务类、以及一个简单的控制器。 1. 项目依赖配…

MyBatis-Plus 快速入门

介绍 j​​​​​MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网:MyBatis-Plus (baomidou.com) 1.…

sheng的学习笔记-卷积神经网络经典架构-LeNet-5、AlexNet、VGGNet-16

目录:目录 看本文章之前,需要学习卷积神经网络基础,可参考 sheng的学习笔记-卷积神经网络-CSDN博客 目录 LeNet-5 架构图 层级解析 1、输入层(Input layer) 2、卷积层C1(Convolutional layer C1&…

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近,也在对自己以前做的项目做一个知识点的梳理,发现可能自己以前更多的是用某个控件,以及看官方手册,但是没有更…

卷积神经网络(CNN)原理与实现

卷积神经网络(CNN) 卷积神经网络原理卷积神经网络的数学推导卷积层反向传播算法数学推导卷积层实现代码 卷积神经网络(CNN) 卷积神经网络原理 卷积神经网络是一种用于图像、语音、自然语言等数据的深度学习模型,其核心思想是使用卷积操作提取输入数据的特征&…

tmux 工具常用命令

Tmux 是一个终端复用器(terminal multiplexer),类似于 GNU screen 非常有用,属于常用的运维管理工具。 安装步骤 Ubuntu apt install tmux centos yum install tmux常用命令 以下所有快捷键,均是 ctrlb 按完之后先…

SpringBoot+Vue全栈开发-刘老师教编程(b站)(二)

创建SpringBoot项目 1.配置maven 出现bug java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/maven/repository/org/springframework/boot/spring-boot/3.0.0/spring-boot-3.0.0.jar!/org/springframework/boot/SpringApplication.class 类…

react-router 源码之matchPath方法

1. 基础依赖path-to-regexp react-router提供了专门的路由匹配方法matchPath(位于packages/react-router/modules/matchPath.js),该方法背后依赖的其实是path-to-regexp包。 path-to-regexp输入是路径字符串(也就是Route中定义的path的值)&…

AI:145-智能监控系统下的行人安全预警与法律合规分析

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

vscode 设置打开终端的默认工作目录/路径

vscode 设置打开终端的默认工作目录/路径** 文章目录 vscode 设置打开终端的默认工作目录/路径**打开vscode,打开设置UI 或是设置JSON文件,找到相关设置项方式1:通过打开settings.json的UI界面 设置:方式2:通过打开设置settings.j…