K8S之使用Deployment实现滚动更新

滚动更新

  • 滚动更新简介
  • 使用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,风险很大

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第27天—贪心算法01 | ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

理论基础 https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 贪心算法的本质:由局部最优推到全局最优贪心算法的套路:无固定套路 455.分发饼干 https://programmercarl.com/0455.%E5%88%8…

小程序框架(概念、工作原理、发展及应用)

引言 移动应用的普及使得用户对于轻量级、即时可用的应用程序需求越来越迫切。在这个背景下,小程序应运而生,成为一种无需下载安装、即点即用的应用形式,为用户提供了更便捷的体验。小程序的快速发展离不开强大的开发支持,而小程…

vue项目从后端下载文件显示进度条或者loading

//API接口 export const exportDownload (params?: Object, peCallback?: Function) > {return new Promise((resolve, reject) > {axios({method: get,url: ,headers: {access_token: ${getToken()},},responseType: blob,params,onDownloadProgress: (pe) > {peC…

市场复盘总结 20240228

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率 25% 最常用的二…

LeetCode104.二叉树的最大深度

题目 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 输入:root [3,9,20,null,null,15,7] 输出:3思路 计算二叉树的最大深度通常可以使用 递归 来实现。我们可以从根…

react倒计时功能

目录 类组件写法 函数组件写法: demo: 手机获取验证码登录(验证码60秒倒计时) react倒计时5 秒 React中的倒计时可以通过使用setInterval()函数来实现。下面是一个示例代码: 类组件写法 import React from react; import { But…

什么是电子邮件客户端?如何选择合适的邮箱客户端?

“从1到10分,你会如何评价我们的电子邮件服务?” 无论你的评分是多少,影响你评分的一个重要因素肯定是电子邮件客户端提供的功能。 电子邮件客户端应该具有基本而漂亮的高级功能,以使迁移过程更容易。此外,应该有一些…

C语言第三十二弹---自定义类型:联合和枚举

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1、联合体 1.1、联合体类型的声明 1.2、联合体的特点 1.3、相同成员的结构体和联合体对比 1.4、联合体大小的计算 1.5、联合的⼀个练习 2、枚举类型 …

微信小程序引入Vant插件

Vant官网:Vant Weapp - 轻量、可靠的小程序 UI 组件库 先查看官网的版本 新建一个package.json页面,代码写上:(我先执行的npm安装没出package页面,所以先自己创建了一个才正常) {"dependencies"…

Aethir推出其首次去中心化AI节点售卖

Aethir,去中心化GPU云基础设施领导者,宣布其备受期待的节点销售。Aethir是一家企业级的以AI和游戏为重点的GPU即服务提供商。Aethir的去中心化云计算基础设施使GPU提供商能够与需要NVIDIA的H100芯片提供强大AI/ML任务支持的企业客户相连接。 此外&#x…

网页数据的存储--存储为文本文件(TXT、JSON、CSV)

用解析器解析出数据后,接下来就是存储数据了。数据的存储有多种多样,其中最简单的一种是将数据直接保存为文本文件,如TXT、JSON、CSV等。这里就介绍将数据直接保存为文本文件。 目录 一、Python存储数据的方法 1、 文件读取 2、 文件写入…

线性规划基础

利用一个简单的实例来介绍什么事线性规划,假设如果有一家巧克力工厂需要生产两种不同类型的巧克力,分别是类型A和类型B,两种巧克力用到的原材料是一样的,都是使用牛奶和可可两种材料,主要的区别是在与这两种原料的配料比区别,而对于类型A巧克力,生产一单位的巧克力会需要…

06|Mysql内部组件结构

1. 连接器 客户端要向mysql发起通信都必须先跟Server端建立通信连接,而建立连接的工作就是由连接器完成的 mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306连接步骤: 1、如果用户名或密码不对,你就会收到一个"Access denied for us…

Unity(第十四部)光照

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

【大数据架构(2)】kappa架构介绍

文章目录 一. Kappa架构1. Speed Layer (Stream Layer) - The Foundation of Kappa Architecture2. Stream Processing: The Heart of Kappa Architecture 二. Benefits of Kappa and Streaming Architecture1. Simplicity and Streamlined Pipeline2. High-Throughput Process…

Vue 3, TypeScript 和 Element UI Plus:前端开发的高级技巧与最佳实践

Vue 3、TypeScript 和 Element UI Plus 结合使用时,可以提供一个强大且灵活的前端开发环境。以下是一些高级用法和技巧,帮助你更有效地使用这些技术: 1. Vue 3 高级特性 Composition API 使用 setup 函数: Vue 3 引入了 Composition API&am…

软考50-上午题-【数据库】-SQL访问控制

一、SQL访问控制 数据控制,控制的是用户对数据的存储权力,由DBA决定。 DBA:数据库管理员。 DBMS数据控制应该具有一下功能: 1-1、授权语句格式 说明: 示例: 1-2、收回权限语句格式 示例: PUBLI…

【C++】拿下! C++中的内存管理

内存管理 1 C 的内存分布2 C语言的内存管理3 C的内存管理3.1 内置类型操作3.2 自定义类型操作 4 operator new与operator delete函数(重点)5 new和delete的实现原理5.1 内置类型5.2 自定义类型new的原理delete的原理new T[ N ] 的原理lete[]的原理 6 总结…

开源现场总线协议栈(ethercat、ethernet/ip、opc ua、profinet、canopen、modbus)

ecat主站及其相关: 1.soem:GitHub - OpenEtherCATsociety/SOEM: Simple Open Source EtherCAT MasterSimple Open Source EtherCAT Master. Contribute to OpenEtherCATsociety/SOEM development by creating an account on GitHub.https://github.com/…

vue项目导出excel ,文件过大导致请求超时的处理方法

一、因为文件过大,请求时间较长,就会产生请求超时的情况,处理方式是可以分为三个接口,接口1用来获取id值,接口2利用id值发起请求,询问是否准备好下载,如果没准备好,则没隔一秒再次发…