k8s replicaSet,deployment 学习笔记
文章目录
- replicaSet 和 deployment 两者的关系。
- 创建
- 滚动更新
- 回滚
replicaSet 和 deployment 两者的关系。
在 Kubernetes 中,ReplicaSet 和 Deployment 都是用来确保某种 Pod 的副本数目。但是,ReplicaSet 和 Deployment 是有差别的,二者的关系可以粗略地理解为 Deployment 对 ReplicaSet 的进一步封装。
-
ReplicaSet是为了确保任意时刻都有特定数量的 Pod 副本在运行。换句话说,如果有 Pod 出现故障被删除,ReplicaSet会自动创建新的 Pod 来替代。但ReplicaSet本身并不支持滚动更新,如果要更新 Pod,就需要手动删除老的 Pod,然后ReplicaSet会自动创建新的 Pod。 -
Deployment是一个更高层次的概念,它管理ReplicaSet,并提供了声明式更新的能力。它包含了ReplicaSet所有的功能,并且增加了版本更新的功能。当有新的版本需要部署时,Deployment会自动创建一个新的ReplicaSet,并逐步将老的 Pod 替换为新的 Pod,直到达到预期的 Pod 数量。这个过程是滚动更新。
总结起来,Deployment 是对 ReplicaSet 进一步的封装,提供了滚动更新的能力,使得更新 Pod 变得更加方便。在实际使用中,大部分时候都是直接使用 Deployment,很少直接使用 ReplicaSet。

创建
nginx-deploy.yaml
apiVersion: apps/v1 # deployment api版本
kind: Deployment # 资源类型为deployment
metadata: # 元信息labels: # 标签app: nginx-deployname: nginx-deploy # deployment的名字namespace: default
spec:replicas: 3 #副本数量revisionHistoryLimit: 10 #进行滚动更新后保留的副本数量selector: #选择器,用于找到匹配的rsmatchLabels:app: nginx-deploystrategy: #更新策略rollingUpdate: #滚动更新策略maxSurge: 25% # 后面的滚动更新中会详细介绍maxUnavailable: 25% # 后面的滚动更新中会详细介绍type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginx-deployspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresent #拉取策略name: nginxresources:limits:cpu: 50mmemory: 128Mirequests:cpu: 50mmemory: 128MiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilerestartPolicy: Always #重启策略terminationGracePeriodSeconds: 30 #删除操作最多宽限多长时间
kb create -f nginx-deploy.yaml
由上图可知,创建了一个deployment,这个deployment管理着一个rs,而这个rs管理这个三个replica。
kb describe deploy nginx-deploy
滚动更新
maxSurge和maxUnavailable是 Kubernetes 的Deployment对象中用于控制滚动更新策略的两个参数。
这两个参数的合理配置可以确保滚动更新过程中服务的连续性和资源的高效利用。
-
maxSurge:这个参数表示滚动更新过程中,新副本 Pod 能超过原始
replicas数量的最大值。例如,如果replicas为3,maxSurge为1,那么滚动更新过程中最多可以有4个 Pod 同时运行。这个参数可以是绝对数量(例如,1),也可以是相对于replicas的百分比(例如,10%)。值得注意的是,当你设置的maxSurge和maxUnavailable都为0时,Kubernetes将不会允许这样的配置,因为这样就无法完成滚动更新。 -
maxUnavailable:这个参数表示滚动更新过程中,可以同时不可用的老副本 Pod 个数的最大值。例如,如果
replicas为3,maxUnavailable为1,那么滚动更新过程中,最多可以有1个老的 Pod 不可用。这个参数也可以是绝对数量或者相对于replicas的百分比。同样,如果maxSurge和maxUnavailable都设为0,Kubernetes 是不会接受的。
滚动更新流程
这个滚动更新的过程确保了服务在更新过程中的不中断,提供了零停机时间的更新体验。同时,通过灵活设置maxSurge和maxUnavailable参数,我们可以平衡服务的稳定性和资源的利用率。
- 当你更新了
Deployment的配置(例如,更改了 Pod 的 Docker 镜像)后,Deployment会创建一个新的 ReplicaSet 并将maxSurge参数设定的额外 Pods 数量添加到新的 ReplicaSet 中。这意味着新的 Pod 已经启动并准备接受请求。 - 一旦这些新的 Pod 就绪并开始运行,
Deployment会按照你设置的maxUnavailable参数的值,停止相应数量的旧的 Pods。这些被停止的 Pods 被新的 Pods 替代。这个终止和启动 Pods 的过程被称为 “滚动更新”。 - 如果在更新过程中新的 Pod 出现问题,
Deployment将停止创建新的 Pod 并开始回滚。这意味着,它会停止新的 Pods,并开始回滚到旧的 ReplicaSet。 - 如果新的 Pod 正常运行,
Deployment会继续停止更多的旧的 Pods,启动新的 Pods,直至所有的旧的 Pods 都被新的 Pods 替代。此时,更新完成。
注意,Deployment还记录了所有的旧的 ReplicaSet(即历史版本),以便于在必要时回滚到旧的版本。
-
kb edit deploy nginx-deploy,修改镜像。

-
kb describe deploy nginx-deploy,查看deploy更新event事件。

-
查看deploy,rs,pod

总结:deploy滚动更新并不是直接删除rs然后创建新rs;它是保持已有的rs不变,创建一个新的rs,然后根据yaml里设置的maxSurge和maxUnavailable;例如,我这里都是设置为1,所以在event里可以看到deploy每次在新的rs里创建一个pod,然后在旧的rs里关闭一个pod,如此这般操作直到旧的rs里的pod数量为0完全关闭,新的rs里的pod数量为3,至此滚动更新成功。
回滚
假设我们更新的nigin1.9.1版本是有问题的,那么我们就需要回退到之前的1.7.9。
-
查看历史版本。

-
查看指定版本的信息。

-
回退之前先看看当前的deploy信息,kb describe deploy nginx-deploy

-
版本1就是我们需要回退的目标版本,回退到版本1。

-
kb describe deploy nginx-deploy;查看回退之后的deploy信息。

-
可以看到回退是直接使用之前滚动更新时停用的rs。整个回退过程也是遵循滚动更新的规范,先开一个新的pod再关一个旧的pod,直到pod数量达到要求就完成了回退。
相关文章:
k8s replicaSet,deployment 学习笔记
文章目录 replicaSet 和 deployment 两者的关系。创建滚动更新回滚 replicaSet 和 deployment 两者的关系。 在 Kubernetes 中,ReplicaSet 和 Deployment 都是用来确保某种 Pod 的副本数目。但是,ReplicaSet 和 Deployment 是有差别的,二者的…...
Zabbix监控原理 安装
一、监控介绍 1、监控目的 监控是需要站在公司的业务角度去考虑,而不是针对某个监控技术的使用 对系统不间断时实监控 实际上是对系统不间断的时实监控 实时反馈系统当前状态 我们监控某个硬件、或者系统,都是需要能时实看到当前系统的状态&#x…...
我和“云栖大会”的双向奔赴
目录 引言初次参加云栖大会云栖大会带来的技术风向标本届大会最强技术有哪些?云栖大会对我职业生涯的影响个人对未来云栖大会的期待和建议结语 引言 想必大家对“云栖大会”并不陌生,“云栖大会”作为国内最具规模和影响力的云计算盛会,每年…...
HarmonyOS UI 开发
引言 HarmonyOS 提供了强大的 UI 开发工具和组件,使开发者能够创建吸引人的用户界面。本章将详细介绍在 HarmonyOS 中应用 JS、CSS、HTML,HarmonyOS 的 UI 组件以及如何自定义 UI 组件。 目录 JS、CSS、HTML 在 HarmonyOS 中的应用HarmonyOS 的 UI 组…...
中国移动发布《新型智慧城市白皮书》(2023版)
加gzh“大数据食铁兽”,回“20231101”,获取材料完整版 导读 通过本系列白皮书,我们系统的阐述了中国移动对中国智慧城市发展趋势,并对中国移动服务智慧城市建设六大核心能力进行了介绍,详细说明了中国移动智慧城市…...
windows和docker环境下springboot整合gdal3.x
链接: gdal官网地址 gdal gdal的一个用c语言编写的库,用于处理地理信息相关的数据包括转换,识别数据,格式化数据以及解析 同时提供第三方语言的SDK包括python,java上述需要编译后使用 java是需要使用jni接口调用实现方法在wind…...
大数据与健康:技术助力医疗卫生事业腾飞
大数据与健康:技术助力医疗卫生事业腾飞 随着科技的飞速发展,大数据技术已经渗透到我们生活的方方面面,包括医疗卫生领域。本文将对大数据在健康医疗领域的应用进行分析,并通过数据图表展示其发展趋势和前景。 一、背景介绍 近…...
《巴渝小将》少儿电视综艺走进江小白金色黄庄拍摄圆满成功!
巴渝小将,乘风破浪! 张扬巴渝魅力,展示少年风采,本期拍摄我们来到了位于江津的江小白金色黄庄。 江小白金色黄庄位于永兴镇黄庄村,是一座充满诗意又不乏童趣的农文旅综合体,基于当地良好的酿酒高粱产业基础…...
【uniapp】顶部和底部导航栏无法正常显示
关于顶部导航栏不显示的问题: 顶部导航栏在配置了 navigationBarTitleText 还是无法显示,如果是使用他人的项目结构,需要检查是否已经被配置了自定义导航栏: "navigationStyle": "custom" "globalStyle&…...
【ArcGIS模型构建器】06:ArcGIS中DOM批量分幅教程
ArcGIS中利用模型构建器实现DOM批量分幅裁剪。 文章目录 1. 加载数据2. 批量分幅1. 加载数据 批量分幅通常是基于数字正射影像来实现。 数字正射影像(DOM.tif)CASS标准图幅(shp) 2. 批量分幅 单个图幅可以通过裁剪或者按掩膜提取工具来进行,批量分幅采用模型构建器进行。…...
uniapp 设置 editor 默认值
dom 元素长这样 <editor id"editor" value12323 class"ql-container container" placeholder"开始输入..." ready"onEditorReady" blur"submit"></editor> 注意赋值必须要用 data 里面变量数据 不要let 定义…...
动态规划:计数类DP
整数划分: 二维做法: #include <iostream>using namespace std;const int N 1e3 7, mod 1e9 7;int f[N][N];int main() {int n;scanf("%d",&n);//总数为0时,前i个数字全不选也是一种方案,但某个数字不…...
Arcmap制图绘制显著性区域
类似于下图这种,为分析结果添加显著性区域,该如何实现呢? 实现方式多种多样,比如: 1、代码。Python、R、Matlab都有实现方式,但是绘制一幅优美的地图,用代码绘制,需要添加很多控制语…...
你一般会什么时候使用CHATGPT?
在当今数字时代,人们对于人工智能(AI)的依赖程度日益增加,而ChatGPT作为一种强大的自然语言处理工具,吸引了人们的广泛关注和应用。那么,人一般在什么时候会想要使用ChatGPT呢?这个问题涵盖了多…...
单例模式下双重校验锁 DCL 的灵魂三问
文章目录 前言如何实现一个双重校验锁 DCL定义一个单例变量定义一个获取单例的方法性能优化性能优化带来的一点点问题什么是指令重排? 总结如何理解文章开篇理解的三个问题1、为什么需要使用两个 if 语句?2、为什么使用了 synchronized 关键字还需要使用…...
oracle中关于connect by的语法及实现(前序遍历树)
语法 connect by是是结构化查询中用到的,其基本语法是: 1 select … from tablename 2 start with 条件1 3 connect by 条件2 4 where 条件3; 使用示例 例: create table tree(id int,parentid int); insert into tree values(120,184); …...
学习笔记二十七:K8S控制器Statefulset入门到企业实战应用
这里写目录标题 Statefulset控制器:概念、原理解读Statefulset资源清单文件编写技巧查看定义Statefulset资源需要的字段查看statefulset.spec字段如何定义?查看statefulset的spec.template字段如何定义 Statefulset使用案例:部署web站点State…...
JavaScript 的 闭包
在 JavaScript 中,闭包是一种强大的特性,它允许函数在结束执行后,仍能访问并控制其外部的局部变量。这种特性在许多高级 JavaScript 编程场景中都发挥着关键作用,如创建函数工厂、实现数据隐藏和封装等。 1、闭包的原理 JavaScri…...
二蛋赠书六期:《Linux管理入门经典(第8版)》
前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…...
19.10 Boost Asio 同步文件传输
在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbye lyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...


