滚动更新和回滚部署在 Kubernetes 中的工作原理

news2024/11/13 15:20:54

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。


在过去的几年中,Kubernetes 在生产环境中被广泛使用,它通过其声明式 API 提供了大量解决方案,用于编排容器。

Kubernetes 的一个显著特性是其具有弹性的能力,能够执行滚动更新和回滚部署,而能够完成这些滚动更新和回滚,主要是由Deployment来实现的,下面就讲解下Deployment的相关知识

Deployment

Deployment是 Kubernetes 中处理工作负载(应用程序)的机制之一。它由 Kubernetes的Deployment Controller管理.。

在 Kubernetes 中,控制器是一个控制环,它负责观察集群的状态,然后根据需要做出或请求做出更改。每个控制器都试图让当前集群状态更接近所需的状态。

在这里的部署中,我们希望实现的状态其实是 pod 的状态,在 K8s 中一切都是声明式的,因此所需的状态会作为规范写入部署清单文件中。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

如果pod实例出现故障或更新(状态改变),Kubernetes会对yaml中声明状态和实际状态之间的差异做出响应,进行修正,即与定义的部署状态相匹配。

Deployment的内部工作原理

Deployment是对 ReplicaSet 的抽象。在内部,部署创建了一个ReplicaSet,而 ReplicaSet 则在集群上创建了一组 Pod。因此,ReplicaSet 其实实在管理我们的 Pod 的副本。

总之,控制器会读取Deployment配置声明,将 pod 配置转发给 ReplicaSet,然后用适当的副本创建Pod


Deployment > ReplicaSet > Pods

滚动部署

Kubernetes 承诺零停机时间,其背后的原理之一就是滚动部署。通过滚动部署,Kubernetes可以保证在部署更新 pod 时不会中断 pod 的流量

示例

下面让我们亲自操作一下Kubernetes,来看看这些部署策略。

Create Deployment

在前面的章节中,写过一个Kubernetes的部署手册,如果没有Kubernetes集群的同学,请进行参考
最佳实践-使用RKE快速部署K8S集群

$ kubectl create deployment test-nginx --image=nginx:1.18-alpine

如前所述,部署会创建一个ReplicaSet,然后是Pod。您可以使用

$ kubectl get deploy,rs,po -l app=test-nginx

可以检查Deployment是否创建了ReplicaSet

$ kubectl describe  <replica-set-name>

同时我们还可以看一下是否是ReplicaSet创建了pod

$ kubectl describe  <pod-name>

扩容 Deployment
让我们将部署扩展到 3 个 nginx pod 实例。

$ kubectl scale deploy test-nginx --replicas=3

现在,我们的集群上已经有了多个pod实例了,下面让我们试试部署策略。

滚动更新部署

假设我们在使用nginx的1.18-alpine版本遇到了一些问题,而1.19-alpine版本解决了这些问题,因此我们需要让pod更新为新版本镜像。

通过更新当前 pod 的镜像(状态变更),Kubernetes 将进行新的部署。

$ kubectl set image deploy test-nginx nginx=nginx:1.19-alpine

设置新镜像后,我们可以看到旧的 pod 被终止,新的 pod 被创建。

我们可以看到Kubernetes在更新过程中,在为新 pod 创建完整的副本之前,最后一个旧 pod 不会被终止。旧 pod 也会有一个宽限期,确保其服务的流量在一定时间内不会断开,直到请求可以安全地路由到新创建的 pod。

虽然这么说但是有时候Kubernetes认为的pod启动就绪,并不是我们期望的启动并就绪,这个地方需要结合自身系统进行判断,后面的文章会进行讲解

可以看到nginx的版本已经更新完成

回滚部署版本

假设新的nginx更新后比上一个版本问题更多,而我们现在意识到旧版本的还是更靠谱,这时候需要回滚到之前的nginx版本

但该怎么做?你可能已经注意到,现在有两个ReplicaSets。这与我们前面的说明部署模式是一样的,我们更新部署,它就会创建一个新的ReplicaSet,从而创建新的Pod

Kubernetes 默认最多保留 10 个 ReplicaSet 的历史记录,我们可以在部署规范中使用revisionHistoryLimit 来更新这一数字。

这些历史记录将作为滚动跟踪,最新版本的才是目前使用的。

到目前为止,我们已经对部署 test-nginx 做了两次更改,因此部署历史记录应该是两次。

$ kubectl get rs|grep test-nginx
$ kubectl rollout history deploy test-nginx
$ kubectl rollout history deploy test-nginx --revision=1

可以看到revision=1对应的是1.18-alpine,下面让我们回滚到上一个版本即1.18-alpine

$ kubectl rollout undo deploy test-nginx --to-revision=1


滚动更新部署一样,回滚部署也会终止当前 pod,并用包含来自 Revision 1 的 Pod 替换它们。

如果再次查看部署历史,就会发现修订版 1 已被用于创建最新的 pod,并标记为修订版 3。

在多个修订版中重复维护同一规范是没有意义的,所以Kubernetes 删除了修订版 1,因为我们已经有了同一规范的最新修订版 3。

现在我们已经回滚到了1.18-alpine版本,通过describe部署可以进行验证。

$ kubectl describe deploy test-nginx

总结

通过 Kubernetes,我们可以利用这些策略轻松控制应用程序的部署。以上只是对滚动和回滚更新部署工作原理的简单介绍。在实际工作中,我们很少手动完成所有这些步骤,我们一般会交给 CI/CD平台去做这些事情。

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

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

相关文章

简化业务流程——通知短信API在企业中的应用

引言 通知短信API是一种可以帮助企业简化业务流程的通讯工具。随着移动互联网技术的不断发展&#xff0c;移动通讯已经成为了我们日常生活和企业运营中不可或缺的一部分。通知短信API是一种可以在企业中将移动通讯应用到极致的工具&#xff0c;它可以为企业提供高效便捷的通讯…

JSP协同办公eclipse定制开发mysql数据库BS模式java编程OA系统

一、源码特点 java 协同办公管理系统是一套完善的web设计系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

Docker之虚悬镜像(查看、删除)

虚悬镜像: 仓库名、标签都是的镜像&#xff0c;俗称dangling image 查看 docker image ls -f danglingtrue删除 虚悬镜像已经失去存在价值&#xff0c;可以删除 docker image prune

ESP32 http 请求

目录 参考教程1.使用的http连接2.使用Vscode-IDF创建http_request例程3.修改http_request_example_main.c函数4.已经获取到响应的数据 参考教程 ESP-IDF HTTP获取网络时间 1.使用的http连接 http://api.m.taobao.com/rest/api3.do?apimtop.common.getTimestamp请求可以得到…

系列四、Java8的Lambda表达式

一、概述 Lambda是一个匿名函数&#xff0c;我们可以把Lambda表达式理解为是一段可以传递的代码&#xff08;将代码像数据一样进行传递&#xff09;。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力得到了提升。 Lambda 表达式在Jav…

【开源】基于JAVA的校园二手交易系统

项目编号&#xff1a; S 009 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S009&#xff0c;文末获取源码。} 项目编号&#xff1a;S009&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 二手商品档案管理模…

【pytorch深度学习 应用篇02】训练中loss图的解读,训练中的问题与经验汇总

文章目录 loss图解析train loss ↘ \searrow ↘ ↗ \nearrow ↗ 先降后升 loss图解析 train loss ↘ \searrow ↘ 不断下降&#xff0c;test loss ↗ \nearrow ↗ 不断上升&#xff1a;原因很多&#xff0c;我是把workers1&#xff0c;batchSize8192train loss ↘ \searro…

再见 Excel,你好 Python Spreadsheets!⛵

Excel是大家最常用的数据分析工具之一&#xff0c;借助它可以便捷地完成数据清理、统计计算、数据分析&#xff08;数据透视图&#xff09;和图表呈现等。 但是&#xff01;大家有没有用 Excel 处理过大一些的数据&#xff08;比如几十上百万行的数据表&#xff09;&#xff0…

面试题 三

一、this 手写call //1、定义myCall方法 //3、接收剩余参数并返回结果 Function.prototype.myCall function (thisArg, ...arg) {// console.log(thisArg); //person对象// console.log(this); //func方法//2、设置this并调用原函数//下面三行代码有个缺陷就是如果pers…

YOLOv8-seg改进:SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能

🚀🚀🚀本文改进:SEAM、MultiSEAM分割物体与物体相互遮挡性能 🚀🚀🚀SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何…

leetcode:415. 字符串相加(模拟竖式计算)

一、题目 链接&#xff1a; 415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;char* addStrings(char* num1, char* num2) 二、思路&#xff1a; 本题本质是将两个字符型数字相加&#xff0c;字符型数字相加就一定需要进行字符与数字的相互转换 详…

Mybatis-Plus 自定义SQL注入器,实现真正的批量插入![MyBatis-Plus系列]

导读 Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。 在使用MyBatis-Plus时,dao层都会去继承BaseMapper接口,这样就可以用BaseMapper接口所有的方法CRUD。 在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的。

【开源】基于JAVA的超市自助付款系统

项目编号&#xff1a; S 008 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S008&#xff0c;文末获取源码。} 项目编号&#xff1a;S008&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账…

【精选】JSP技术知识点大合集

JSP简介 JSP介绍 JSP(全称Java Server Pages)Java服务端页面技术&#xff0c;是JavaEE平台下的技术规范。它允许使用特定的标签在HTML网页中插入Java代码&#xff0c;实现动态页面处理&#xff0c;所以JSP就是HTML与Java代码的复合体。JSP技术可以快速的实现一个页面的开发&am…

山西电力市场日前价格预测【2023-11-21】

1.日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-21&#xff09;山西电力市场全天平均日前电价为278.73元/MWh。其中&#xff0c;最高日前电价为367.26元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计…

MR素数测试及 pycryptodome库下 已知MR伪素数以及强伪证 生成指定伪随机数生成器绕过素性检测

MR素数测试在密码学库中应用广泛&#xff0c;通常作为BSPW的一部分来进行素数测试&#xff0c;由于在其算法中&#xff0c;有随机数的使用&#xff08;选择一个随机的base&#xff09;&#xff0c;若一个MR伪素数 n n n&#xff0c;已知其在某一个强伪证 a a a&#xff08;随机…

2023年中国吞咽神经和肌肉电刺激仪市场发展趋势分析:产品需求持续增长[图]

吞咽神经和肌肉电刺激仪是通过输出特定的低频脉冲电流对吞咽及构音功能相关的神经和肌肉进行电刺激&#xff0c;改善吞咽、构音肌群的收缩运动功能&#xff0c;缓解神经元麻痹&#xff0c;促进吞咽反射弧的重建与恢复&#xff0c;进而提高患者的吞咽及语言能力。 吞咽神经和肌…

【软件工程师从0到1】- Java面向对象基础 (知识汇总)

前言 介绍&#xff1a;大家好啊&#xff0c;我是hitzaki辰。 社区&#xff1a;&#xff08;完全免费、欢迎加入&#xff09;日常打卡、学习交流、资源共享的知识星球。 自媒体&#xff1a;我会在b站/抖音更新视频讲解 或 一些纯技术外的分享&#xff0c;账号同名&#xff1a;hi…

数据结构与算法编程题3

长度为n的顺序表&#xff0c;删除线性表所有值为x的元素&#xff0c;使得时间复杂度为O(n)&#xff0c;空间复杂度为O(1) #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {E…