当前位置: 首页 > news >正文

k8s pod 升级与回滚

当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有pod,然后下载新版本镜像并创建新的pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。

kubernetes提供了滚动升级功能来解决上述问题。

如果pod是通过Deployment创建的,则用户可以在运行时修改Deployment的pod定义(spec.template)或镜像名称,并应用到Deployment对象上,系统即可完成Deployment的rollout动作,rollout可被视为Deployment的自动更新或者自动部署动作,如果在更新过程中发生了错误,则还可以通过回滚操作恢复pod的版本

二、Deployment升级

下面以nginx的deployment为例:

apiversion: apps/v1kind: Deploymentmetadata:    name: nginx-deployment spec:  selector:    matchLabels:        app: nginx  replicas: 3  template:    metadata:      labels:          app: nginx  spec    containers:    - name: nginx      image: nginx:1.7.9      ports:      - containerPort: 80

可以看到已运行的副本数有3个:

那么如果想升级nginx的版本为1.9.1,该如何操作呢?

1. 升级方式

方式一:set image命令

可以通过kubectl set image命令为Deployment设置新的镜像名称:


方式一:edit命令

另一种更新的方法是使用kubectl edit命令修改Deployment的配置,将 spec.template.spec.containers[0].image从nginx: 1.7.9更改为nginx:1.9.1:

2. 查看过程

镜像名(或pod定义)一旦发生了修改,则将触发系统完成Deployment所有运行pod的滚动升级操作。

可以使用 kubectl rollout status 命令查看Deployment的更新过程:

查看当前运行的pod,名称已经更新了:

查看pod使用的镜像,已经更新为Nginx:1.9.1了:

3. 升级原理

Deployment升级pod的流程如下:

step1:初始创建Deployment时,系统创建了一个ReplicaSet (nginx--deployment-4o87004473),并按用户的需求创建了3个Pod副本;
step2:更新Deployment时,系统创建了一个新的ReplicaSet(nginx-deployment- 3599678771),并将其副本数量扩展到1,然后将旧的ReplicaSet缩减为2;
step3:之后,系统继续按照相同的更新策略对新旧两个ReplicaSet进行逐个调整;
step4:最后,新的ReplicaSet运行了3个新版本的Pod副本,旧的ReplicaSet副本数量则缩减为0

我们可以使用kubectl describe deployments/nginx-deployment命令仔细观察Deployment的更新过程:

运行kubectl get rs命令,查看两个ReplicaSet的最终状态:

在整个升级过程中,系统会保证至少有两个pod可用,并且最多同时运行4个pod,这是Deployment通过复杂的算法完成的。

Deployment需要确保在整个更新 过程中只有一定数量的pod可能处于不可用状态。在默认情况下,Deployment确保可用的pod总数量至少为所需的副本数量(DESIRED)减1,也就是最多1个不可用(maxUnavailables=1)。

Deploymenti还需要确保在整个更新过程中pod的总数量不会超过所需的副本数量太多。在默认情况下,Deployment确保pod的总数量最多比所需的pod数量多1个,也就是最多1个浪涌值(maxSurge=-1)。

Kubernetes从1.6版本开始,maxUnavailable和maxSurgef的默认值将从1、1更新为 所需副本数量的25%、25%。这样,在升级过程中,Deployment就能够保证服务不中断,并且副本数量始终维持为用户指定的数量(DESIRED)。

三、Deployment回滚

如果在Deployment升级过程中出现意外,比如写错新镜像的名称、新镜像还没被放入镜像仓库里、新镜像的配置文件发生不兼容性改变、新镜像的启动参数不对,以及因可能更复杂的依赖关系而导致升级失败等,就需要回退到之前的旧版本,这时就可以用到Deploymentl的回滚功能了。

1. 回滚方式

我们将Deployment回滚到之前的版本时,只有Deployment的pod模板部分会被修改,在默认情况下,所有Deployment的发布历史记录都被保留在系统中(可以配置历史记录数量),以便于我们随时进行回滚操作

注意,在创建Deployment时使用-record参数,就可以在CHANGE-CAUSE列看到每个版本使用的命令了,如果需要查看特定版本的详细信息,则可以加上-revision-=参数:

现在我们决定撤销本次发布并回滚到上一个部署版本:

kubectl rollout undo deployment/nginx-deployment deployment "nginx-deployment" rolled back

这样,该Deployment就回滚到之前的稳定版本了,可以从Deployment的事件信息中查看到回滚到版本2的操作过程:

四、其它

1. 暂停和恢复Deployment的部署操作

通过kubectl rollout pause命令暂停Deployment的更新操作:

kubectl rollout pause deployment/nginx-deployment deployment "nginx-deployment" paused

然后修改Deployment的镜像信息:

kubectl set image deploy/nginx-deployment nginx=nginx:1.9.1deployment "nginx-deployment"image updated

查看Deployment的历史记录,发现并没有触发新的Deployment部署操作:

最后,恢复这个Deployment的部署操作:

$ kubectl rollout resume deploy nginx-deployment deployment "nginx-deployment"resumed

可以看到一个新的ReplicaSet被创建出来了:

2.DaemonSet的更新策略

目前DaemonSet的升级策略(updateStrategy)包括两种:

升级策略

描述

OnDelete

DaemonSet的默认升级策略,与1.5及之前版本的Kubernetes保持一致。当使用OnDelete作为升级策略时,在创建好新的DaemonSeti配置之后,新的Pod并不会被自动创建,直到用户手动删除旧版本的Pod,才触发新建操作,即只有手工删除了DaemonSet创建的Pod副本,新的Pod 副本才会被创建出来。如果不设置updateStrategy的值,则在Kubernetes 1.6之后的版本中会被作为updateStrategyl的默认设置

RollingUpdate

从Kubernetes1.6版本开始引入。当使用RollingUpdate作为升级策略对DaemonSeti进行更新时,旧版本的Pod将被自动"杀 掉",然后自动创建新版本的DaemonSet Pod。整个过程与普通Deployment的滚动升级一样是可控的。不过有两点不同于普通Pod的滚动升级:一是目前Kubernetes还不支持查看和管理DaemonSetl的更新历史记录;二是DaemonSet的 回滚(Rollback)并不能如同Deployment一样直接通过kubectl rollback命令来实现,必须通过再次提交旧版本配置的方式实现

下面是DaemonSet采用RollingUpdate升级策略的YAML定义:

apiversion: apps/v1kind: DaemonSetmetadata: name: goldpingerspec:updatestrategy:type: RollingUpdate

3.StatefulSet的更新策略

StatefulSet实现了RollingUpdate、OnDelete和Partitioned这几种策略,以保证StatefulSet中各Pod有序地、逐个地更新,并且能够保留更新历史,也能回滚到某个历史版本(如果用户未设置updateStrategy字段,则系统默认使用RollingUpdate策略):

策略

描述

RollingUpdate

StatefulSet Controller会删除并创建StatefulSet:相关的每个Pod对象,其处理顺序与StatefulSet终止Pod的顺序一致,即从序号最大的Pod开始重建,每次更新一个Pod

OrderedReady

可能在更新过程中发生一些意外,从而导致StatefulSet陷入奔溃状态,此时需要用户手动修 复

OnDelete

StatefulSet Controller并不会自动更新StatefulSet中的Pod实例,而是需要用户手动删除这些Pod并触发StatefulSet Controller创建新的Pod实例来弥补,因此这其实是一种手动升级模式

Partitioned

在这种模式下, 用户指定一个序号,StatefulSet中序号大于等于此序号的Pod实例会全部被升级, 小于此序号的Pod实例则保留旧版本不变,即使这些Pod被删除、重建,也仍然保 持原来的旧版本。这种分区升级策略通常用于按计划分步骤的系统升级过程中。

相关文章:

k8s pod 升级与回滚

当集群中的某个服务需要升级时,我们需要停止目前与该服务相关的所有pod,然后下载新版本镜像并创建新的pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。kubernet…...

【Go】Go语言开发环境安装

【Go】Go语言开发环境安装 导入 安装环境:Winowds 我现在是win7安装的,与win10整体步骤是一样的,只是部分显示的时候有点差异不影响; 【名词】 编译器:先将代码编译成可执行文件,再执行; —…...

el-switch使用

效果图&#xff1a; 1.表格代码&#xff0c;给el-waitch加上change事件 <el-table-column prop"status" label"状态" align"center" width"150"> <template slot-sc…...

【算法入门】字符串基础

目录 一.字符串引言1.字符串基础二.洛谷P5734详解1.字符串相关库函数&#x1f4ab;&#xff08;1&#xff09; strcpy函数 &#x1f4ab;&#x1f4ab;&#xff08;2&#xff09; strcat函数 &#x1f4ab;&#x1f4ab;&#xff08;3&#xff09;strstr函数 &#x1f4ab;2.题…...

前端面试题 —— 浏览器原理(二)

目录 一、有哪些可能引起前端安全的问题? 二、网络劫持有哪几种&#xff0c;如何防范&#xff1f; 三、浏览器渲染进程的线程有哪些 四、僵尸进程和孤儿进程是什么&#xff1f; 五、为什么需要浏览器缓存&#xff1f; 六、对浏览器的理解 七、CSS 如何阻塞文档解析&…...

对于植物神经紊乱的治疗 中医采用辩证论治的方法

植物神经紊乱是由于心理压力过大、长期生活不规律所导致的一种疾病&#xff0c;这种疾病的发生往往是症状多样、涉及广泛的。当患有植物神经紊乱之后&#xff0c;主要的症状会以躯体化障碍为常见症状&#xff0c;但是很多患者还会出现情绪失控、睡眠障碍等问题。 对于植物神经紊…...

chatGPT之Python API启用上下文管理

chatGPT已经爆火一段时间了&#xff0c;我想大多数的开发者都在默默的在开发和测试当中&#xff0c;可能也是因为这个原因所以现在很难找到关于开发中遇到的一些坑或者方法和技巧。为什么别人的机器人能联想之前的语料&#xff0c;而你的却像个每次都只如初见的高冷机器人&…...

油田钻井实时在线监测系统

油田钻井的井下油层的压力不断变化&#xff0c;环境深度和压力巨大&#xff0c;且井下原油具有一定的流动性&#xff0c;实时在线压力监测是石油开采行业的难点。为更好地了解油田开采过程中油层的状况&#xff0c;提高油田开采效率和产量&#xff0c;油田钻井实时在线监测系统…...

经典PID控制算法原理以及优化思路

文章目录0、概念1、理解2、实现3、优化4、引用0、概念 PID算法是工业应用中最广泛算法之一&#xff0c;在闭环系统的控制中&#xff0c;可自动对控制系统进行准确且迅速的校正。PID控制&#xff0c;即Proportional – Integral(I) – Derivative(D) Control, 实际上是三种反馈…...

经典面试题之赋值和深浅拷贝的区别

1.区别 **赋值&#xff1a;**基本数据直接拷贝&#xff0c;互不影响&#xff0c;引用数据把地址赋值给新对象&#xff0c;新旧对象指向同一个地址。 **浅拷贝: **基本类型之间互不影响&#xff0c;对象只会复制对象的第一层基本数据和引用类型的地址&#xff0c;对象内部嵌套的…...

电子取证的电脑配置有关问题,以我仅有的知识为大家建议一下。

电子取证火力很重要&#xff0c;用轻薄本是没法取证的&#xff0c;所以至少是全能本或者是游戏本&#xff0c;牛逼的选手上台式&#xff0c;参考浙警许专家&#xff0c;yyds我专家&#xff01; 我从实战出发&#xff0c;参考历年“美亚杯”和“长安杯”比赛&#xff0c;给大家…...

【基础算法】单链表的OJ练习(5) # 环形链表 # 环形链表II # 对环形链表II的解法给出证明(面试常问到)

文章目录前言环形链表环形链表 II写在最后前言 本章的OJ练习相对于OJ练习(4)较为简单。不过&#xff0c;本章的OJ最重要的是要我们证明为何可以这么做。这也是面试中常出现的。 对于OJ练习(4)&#xff1a;-> 传送门 <-&#xff0c;分割链表以一种类似于归并的思想解得&a…...

MySQL 基础教程[13]

MySQL 基础教程[13]问题1问题1代码问题2问题2代码本系列MySQL 基础教程通过“问题-代码”的方式介绍各类方法&#xff0c;每篇设置2个MySQL综合问题&#xff0c;并给出解决方案。 问题1 kwgl数据库中有学生基本信息表student和系别表dept。表结构及说明如下: student (sid, s…...

个人练习-Leetcode-826. Most Profit Assigning Work

题目链接&#xff1a;https://leetcode.cn/problems/most-profit-assigning-work/ 题目大意&#xff1a;给出一串任务&#xff0c;difficulty表示任务难度&#xff0c;profit表示任务的收益&#xff08;以下简称diff和pro&#xff09;。给出一串工人的能力worker。每个工人只能…...

云原生周刊:边缘计算会吞噬云吗?| 2023.3.13

文章推荐 边缘计算吞噬云&#xff1f; 这篇文章讨论了边缘计算对传统云计算的潜在冲击。 边缘计算是一种新型的计算架构&#xff0c;它将计算移动到离数据源和终端设备更近的地方&#xff0c;从而提供更快的响应时间和更好的用户体验。相比之下&#xff0c;云计算是一种集中…...

python+django+vue图书个性化推荐系统

整个系统是由多个功能模块组合而成的&#xff0c;要将所有的功能模块都一一列举出来&#xff0c;然后进行逐个的功能设计&#xff0c;使得每一个模块都有相对应的功能设计&#xff0c;然后进行系统整体的设计。 本图书个性化推荐系统结构图如图python manage.py runserver 开…...

经典文献阅读之--LIO-PPF(增量平面预拟合LIO)

0. 简介 自从ikd-tree出来后&#xff0c;现在越来越多的工作瞄准了增量式这种方法&#xff0c;比如说激光惯导里程计&#xff08;LIDAR-Inertial Odometry&#xff0c;LIO&#xff09;的高精度跟踪通常涉及最小化点到平面距离的k最近邻&#xff08;kNN&#xff09;搜索&#x…...

ChatGPT背后有哪些关键技术?CSIG企业行带你一探究竟

目录1 ChatGPT的时代2 CSIG企业行3 议题&嘉宾介绍3.1 对生成式人工智能的思考3.2 对话式大型语言模型研究3.3 文档图像处理中的底层视觉技术4 观看入口1 ChatGPT的时代 2015年&#xff0c;马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始…...

C#基础之面向对象编程(二)

总目录 文章目录总目录前言一、概述1. 定义2. 面向对象的三大特性二、封装1. 定义2. 属性三、继承1. 定义2. 继承的使用3. base 和this四、多态1. 定义2. 重写和重载3. 多态性的实现1、静态多态性2、动态多态性4. 向上转型和向下转型1、定义2、语法格式3、案例结语前言 本文主…...

蓝桥杯刷题冲刺 | 倒计时25天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.完全二叉树1.完全二叉树 题目 链接&#xff1a; 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 给…...

c语言—动态内存管理

一.为什么存在动态内存开辟开辟空间的特点&#xff1a;空间开辟大小是固定的数组在申明时&#xff0c;必须指定数组长度&#xff0c;她所需要的内存在编译时分配但是对于空间的需求&#xff0c;不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道&#xff…...

请说明Ajax、Fetch、Axios三者的区别

相同点&#xff1a; 1、三者都用于网络请求&#xff0c;但是不同维度 2、 Ajax(Asynchronous Javascript and XML)&#xff0c;一种技术的统称&#xff0c;并不是实际的API 3、Fetch是一个具体的API&#xff0c;浏览器里面直接有一个API就叫Fetch 4、 Axios是一个第三方库&…...

阿里p8测试总监,让我们用这份《测试用例规范》,再也没加班过

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 固然&#xff0c;编写一份好的测试用例需要&#xff1a;充分的需求分析能力 理论及经验加持&#xff0c;作为测试职场摸爬打滚的老人&…...

【Unity】数据持久化路径Application.persistentDataPath

今天突然想到这个路径Application.persistentDataPath&#xff0c;热更的重要路径&#xff0c;该文件夹可读可写&#xff0c;在移动端唯一一个可读写操作的文件夹。移动端可以将本地的资源&#xff08;资源MD5值配置表&#xff09;等一些文件放到StreamingAssets文件夹下&#…...

华为OD机试 - 插队(Java JS Python)

题目描述 某银行将客户分为了若干个优先级, 1 级最高, 5 级最低,当你需要在银行办理业务时,优先级高的人随时可以插队到优先级低的人的前面。 现在给出一个人员到来和银行办理业务的时间序列,请你在每次银行办理业务时输出客户的编号。 如果同时有多位优先级相同且最高…...

MongoDB数据库从入门到精通系列之八:调整oplog大小

MongoDB数据库从入门到精通系列之八:调整oplog大小 一、oplog的概念二、oplog大小三、调整oplog大小详细步骤一、oplog的概念 操作日志oplog包含了主节点执行的每一次写操作。oplog是存在于主节点local数据库中的一个固定集合。从节点通过查询此集合以获取需要复制的操作。每个…...

PCL 间接平差法拟合二维直线

目录 一、算法原理二、代码实现三、结果展示四、相关链接一、算法原理 通过传统最小二乘法对点云数据进行二维直线拟合时,可将误差只归因于一个方向上,本文假设误差只存在于 y y y轴方向上,设点云拟合的二维直线方程为: y =...

进程调度的基本过程

这里写目录标题什么是进程进程管理结构体或类的主要属性pid内存指针文件描述符表辅助进程调度的属性并发并行并发什么是进程 进程是操作系统对一个正在运行的程序的一种抽象&#xff0c;也就是说&#xff0c;一个运行起来的程序就是一个进程。 进程又是操作系统进行资源分配的…...

python自动化办公(二)

上接python自动化办公&#xff08;一&#xff09; 文章目录文件和目录操作使用shutil库文件查找globfnmatchhashlib文件和目录操作 使用shutil库 shutil库也是Python标准库&#xff0c;它可以处理文件、文件夹、压缩包&#xff0c;能实现文件复制、移动、压缩、解压缩等功能。…...

Qt Quick - GridLayout 网格布局

GridLayout 理论总结一、概述二、依赖属性三、例子1. 不含跨行的2. 带跨行列的3. 从右到左一、概述 GridLayout 是最常用的布局器&#xff0c;也叫网格布局器&#xff0c;如果网格布局被调整大小&#xff0c;布局中的所有 Item 将被重新排列。它类似于基于widget的QGridLayout…...

做网站免费搭建/seo综合查询站长工具怎么用

多线程并发编程如何正确的执行程序&#xff1a; - 原子性&#xff1a;执行过程要么成功要么失败&#xff0c;比如经典的银行转账问题。 - 可见性&#xff1a;多线程并发时&#xff0c;一个线程修改了工作内存中的值&#xff08;主存中的值&#xff09;&#xff0c;会立刻改变主…...

做网站在线视频如何添加/app推广30元一单

文章目录基于阈值的分割方法Otsu阈值分割自适应阈值分割最大熵阈值分割法迭代阈值分割基于边缘的分割方法基于区域的分割方法基于图论的分割方法基于聚类的分割方法基于能量泛函的分割方法曲线演化理论snake方法水平集(LevelSet)Active Contours Without Edges能量函数用水平集…...

福田附近网站建设/哪家网络营销好

重复的任务总是耗费时间和枯燥的。想象一下&#xff0c;逐一裁剪100张照片&#xff0c;或者做诸如Fetching APIs、纠正拼写和语法等任务&#xff0c;所有这些都需要大量的时间。为什么不把它们自动化呢&#xff1f;在今天的文章中&#xff0c;我将与你分享10个Python自动化脚本…...

加强 政府网站信息内容 建设/甲马营seo网站优化的

Android环境搭建 首先下载jdk8和之前学过的Java的配置环境相同 之后下载Android Studio选择与自己电脑所对应的安装包 只有新建项目工程 然后打开Android 虚拟机 选择与自己手机相匹配的Android版本 然后虚拟安卓手机模仿按键图标 依次可以运行出来按钮界面...

wordpress音乐盒/东莞seo网站排名优化公司

1. 流水线实现多周期指令简图2. MIPS流水线基本流程1. 取指令&#xff1b;2. 读寄存器和译码&#xff1b;3. 执行ALU和地址计算&#xff1b;4. 存储器访问&#xff1b;5. 写结果到寄存器。3. 非流水与流水的对比&#xff1a;非流水的执行时间– 3条指令共需3800&#xff1d;240…...

东莞市官网网站建设品牌/盘古百晋广告营销是干嘛

文章目录 chage的作用 使用举例列出用户密码的有效期设置密码过期时间为立即过期&#xff08;0&#xff09;设置登陆必须修改密码设置gaosh3 密码60天后过期&#xff0c;至少7天后才能修改密码&#xff0c;密码过期前7天开始收到告警信息 总结 chage 详解 1. chage的作用 作…...