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

K8S ReplicaSet 控制器

一、理论介绍

今天我们来实验 ReplicaSet 控制器(也叫工作负载)。官网描述如下:

1、是什么?

  • ReplicaSet 副本集, 维护一组稳定的副本 Pod 集合。

2、为什么需要?

  • 解决 pod 被删除了,不能自我恢复问题。

3、缺点

ReplicaSet 无法提供声明式更新,声明式更新的好处,是不会丢失历史版本。

1.1、基础信息

kubectl explain rs
# rs replicaset 的缩写

apiVersion:当前资源使用的 api 版本,是 GROUP/VERSION 的组合。官网介绍如下

kind:资源类型,跟 KIND 保持一致。

metadata:元数据。定义资源名称、注解等。

spec:规范、规约。定义 Pod 副本数Pod 标签选择器Pod 模板

status:状态信息,只读,一般不会去修改。

1.2、ReplicaSet.spec 规约

kubectl explain rs.spec
# rs replicaset 的缩写

replica:副本数。定义 ReplicaSet 所管理的 Pod 的副本数,默认是 1。

selector:标签选择器。用于查找一组 Pod 以便于被 ReplicaSet 所管理。它必须跟 Pod 模板的标签(template.metadata.labels)相匹配。否则会报如下错误。

template:Pod 模板。定义 Pod 的模板。

可以看到 template 内部主要就是定义 Pod 的规范(PodSpec)它跟 Pod 定义里的规范(Pod.spec)是同一个类型。

kubectl explain rs.spec.template

二、镜像准备

假设有如下三个节点的 K8S 集群:

k8s31master 是控制节点

k8s31node1、k8s31node2 是工作节点

容器运行时是 containerd

使用 springboot 打包两个镜像 hellok8s-1.0.jar.gz 和 hellok8s-2.0.jar.gz。

hellok8s:1.0

@RestController
public class HelloController {@GetMapping("/sayHello")@ResponseBodypublic String sayHello() {# 蓝return "Hello,I am Blue";}
}

hellok8s:2.0

@RestController
public class HelloController {@GetMapping("/sayHello")@ResponseBodypublic String sayHello() {# 绿return "Hello,I am Green";}
}

它们的区别仅在输出的问候信息不同,一个 Blue、一个 Green.

  •  导入镜像
# node1 执行
[root@k8s31node1 ~]# ctr -n=k8s.io images import hellok8s-1.0.jar.gz
[root@k8s31node1 ~]# ctr -n=k8s.io images import hellok8s-2.0.jar.gz
# node2 执行
[root@k8s31node2 ~]# ctr -n=k8s.io images import hellok8s-1.0.jar.gz
[root@k8s31node2 ~]# ctr -n=k8s.io images import hellok8s-2.0.jar.gz

三、管理 Pod

3.1、管理 template 定义的 Pod 

rs-template.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata: name: rs-template
spec:replicas: 3selector:matchLabels:app: hellok8s-v1template:metadata:labels:app: hellok8s-v1spec:containers:- name: hellok8simage: hellok8s:1.0imagePullPolicy: IfNotPresentports:- containerPort: 8080

replicas: 3 副本为3 

image: hellok8s:1.0 镜像的版本是 1.0

selector.matchLabels 必须跟 template.metadata.labels 相匹配。

  •  执行并查看
kubectl apply -f rs-template.yaml
# 查看 rs
kubectl get rs

DESIRED 表示期望的副本数是 3。

CURRENT 表示当前在运行的副本数是 3。

READY 表示当前就绪的副本数是 3。

  • 查看 Pod
kubectl get pod -owide

 从这可以看出来,pod 的名字是由控制器的名字-随机数组成的。

  •  访问接口
curl 10.244.9.34:8080/sayHello

3.2、管理 非 template 定义的 Pod

3.2.1、先有 ReplicaSet 后有 Pod

假设在刚才已经存在 3 个 Pod 的基础上,我们再新增一个 Pod,看看会发生什么?

pod-single.yaml

apiVersion: v1
kind: Pod
metadata:name: pod-singlelabels:app: hellok8s-v1
spec:containers:- name: hellok8simage: hellok8s:1.0imagePullPolicy: IfNotPresentports:- containerPort: 8080

 特意设置 metadata.labels 跟 ReplicaSet 的 template.metadata.labels 相匹配。

让 ReplicaSet 能通过标签选择器查询到这个 Pod。

  •  运行并监控
kubectl apply -f pod-single.yaml
kubectl get pod -w

 可以看到 新创建的 pod-single 创建并不成功。

ReplicaSet 控制器,会始终控制标签选择器选中的副本数,是我们设置 replicas: 3 个。

  • 删除 ReplicaSet
kubectl delete -f rs-template.yaml
kubectl get rs
kubectl get pod -owide

 可以看到,删除 ReplicaSet,它所管理的 Pod 资源也会一并被删除。

3.2.2、先有 Pod 后有 ReplicaSet

  • 运行 pod
kubectl apply -f pod-single.yaml
kubectl get pod -owide

  •  运行 ReplicaSet
kubectl apply -f rs-template.yaml

可以看到,ReplicaSet 只会给我们创建 2 个 Pod。因为已经存在一个 pod-single 它的 label 符合 ReplicaSet 的 标签选择器。

  • 删除 ReplicaSet
kubectl delete -f rs-template.yaml
kubectl get pod -owide

 可以看到,删除 ReplicaSet,连同我们单独创建的 pod,也会被一并删除。

四、ReplicaSet 实现 Pod 的动态扩容

假设我们现在有 ReplicaSet 帮我们创建的 3 个 pod。

kubectl apply -f rs-template.yaml
kubectl get pod -owide

倘若现在线上流量激增,我们觉得 3 个 pod 太少了,我们可以动态的扩容。比如我们扩容到 4 个。 

 只需要修改 rs-template.yaml,replicas: 3 改为 4

 

  • 重新运行并查看
kubectl apply -f rs-template.yaml
kubectl get pod -owide

 可以看到,ReplicaSet 帮我们新拉起了一个 pod。

五、ReplicaSet 实现 Pod 的动态缩容

倘若现在流量高峰过了,我们不需要 4 个那么多 Pod,我们可以恢复回 3 个。

只需要修改 rs-template.yaml,replicas: 4 改为 3

  • 重新运行并查看
kubectl apply -f rs-template.yaml
kubectl get pod -owide

可以看到,ReplicaSet 又帮我们恢复回原来的 3 个。

 六、ReplicaSet 实现 Pod 的更新

倘若我们现在需要将镜像的版本,从 hellok8s-1.0 升级为 hellok8s-2.0。

 修改 rs-template.yaml,image hellok8s:1.0 改为 hellok8s:2.0

  • 运行并查看
kubectl apply -f rs-template.yaml
kubectl get pod -owide

 发现 pod 并没有什么变化,我们访问一下接口。

 发现接口版本并没有变化。

  •  我们随机删除一个 pod
kubectl delete pod rs-template-dtv4d
kubectl get pod -owide

 ReplicaSet 会帮我们再拉起一个新 Pod rs-template-btfqr,我们访问这个新 Pod 的接口看看。

 可以发现,新拉起的 pod,已经是新的版本了。

从这,我们发现 ReplicaSet 存在的一个问题:

就是它并不能自动地实现声明式(就只更改镜像版本重新 apply)滚动更新,需要人工地删除旧 Pod,ReplicaSet 再重新拉取一个新 Pod,这个时候的新 Pod,才会是新版本。

 这个时候,我们需要一个新的控制器—>Deployment。

 七、总结

  • Replicaset 核心作用在于代用户创建指定数量的 pod 副本,并确保 pod 副本一直处于满足用户期望的数量,起到多退少补的作用,并且还具有自动扩容缩容等机制。
  • 但是它并不能实现声明式滚动更新。

相关文章:

K8S ReplicaSet 控制器

一、理论介绍 今天我们来实验 ReplicaSet 控制器(也叫工作负载)。官网描述如下: 1、是什么? ReplicaSet 副本集, 维护一组稳定的副本 Pod 集合。 2、为什么需要? 解决 pod 被删除了,不能自我恢…...

FreeRTOS学习 --- 任务调度

开启任务调度器 作用:用于启动任务调度器,任务调度器启动后, FreeRTOS 便会开始进行任务调度 该函数内部实现,如下: 1、创建空闲任务(优先级最低) 2、如果使能软件定时器,则创建定…...

【小鱼闪闪】单片机开发工具——米思齐软件下载安装(图文)

浏览器打开网址 mixly.org, 在软件平台选择mixly离线版。 最新版本为3.0,会支持audinio, ESP32、ESP8266 , 可以选择下载安装器或者完整版。 这里选择下载安装器,下载后运行“一键更新.bat”,即可自动下载最新版本的M…...

MFC开发,给对话框添加垂直滚动条并解决鼠标滚动响应的问题

无论在使用QT或者MFC进行界面开发时,都会出现在一个对话框里面存在好多的选项,导致对话框变得非常长或者非常大,就会显现的不美观,在这种情况下通常是添加一个页面的滚动条来解决这个问题,下面我们就来介绍给MFC的对话…...

动态规划DP 最长上升子序列模型 导弹防御模型(题目分析+C++完整代码实现)

概览检索 动态规划DP 最长上升子序列模型 导弹防御系统 原题链接 AcWiing 187. 导弹防御系统 题目描述 为了对抗附近恶意国家的威胁,R国更新了他们的导弹防御系统。 一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。 例如&#xff0…...

LevelDB 源码阅读:写入键值的工程实现和优化细节

读、写键值是 KV 数据库中最重要的两个操作,LevelDB 中提供了一个 Put 接口,用于写入键值对。使用方法很简单: leveldb::Status status leveldb::DB::Open(options, "./db", &db); status db->Put(leveldb::WriteOptions…...

药店药品销售管理系统的设计与实现

标题:药店药品销售管理系统的设计与实现 内容:1.摘要 摘要:本文介绍了药店药品销售管理系统的设计与实现。该系统旨在提高药店的运营效率和管理水平,通过信息化手段实现药品销售、库存管理、财务管理等功能。本文详细阐述了系统的需求分析、设计思路、技…...

人格分裂(交互问答)-小白想懂Elasticsearch

通过交互式追问了解一个中间件 ? 啥是Elasticsearch ! 分布式搜索和分析引擎 ? 为啥是分布式搜索,单体难道用不了吗 ? 实际上是说这个东西可以分布式部署 ! 单机可用但扩展性差,分布式通过分片、副本和负载均衡实现海量数据存储与高并发处理 ? 提…...

【论文投稿-第八届智能制造与自动化学术会议(IMA 2025)】HTML, CSS, JavaScript:三者的联系与区别

大会官网:www.icamima.org 目录 前言 一、HTML(超文本标记语言):网页的骨架 HTML 的作用: 例子: 总结: 二、CSS(层叠样式表):网页的外观设计 CSS 的…...

python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)

python | OpenCV小记(一):cv2.imread(f)读取图像操作 1. 为什么 [:, :, 0] 提取的是第一个通道(B 通道)?OpenCV 的通道存储格式索引操作 [:, :, 0] 的解释常见误解 1. 为什么 [:, :,…...

网络工程师 (9)文件管理

一、树形目录结构 (一)定义与构成 树形目录结构由一个根目录和若干层子文件夹(或称为子目录)组成,它像一棵倒置的树。这棵树的根称为根文件夹(也叫根目录),从根向下,每一…...

Java中的线程池参数(详解)

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {} 此构造方法的参数如下&#xff1a; int corePoolSize&…...

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …...

如何用函数去计算x年x月x日是(C#)

如何用函数去计算x年x月x日是? 由于现在人工智能的普及,我们往往会用计算机去算,或者去记录事情 1.计算某一年某一个月有多少天 2.计算某年某月某日是周几 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threadin…...

开发过程中如何减少属性注释?

一、注释冗余 举个例子&#xff0c;我们在开发项目中肯定会有状态字段&#xff0c;现在有个工单状态枚举 StatusEnum.java package cn.zxj.note;/*** author: Administrator* since: 2025/1/30 14:40* description:*/ public enum StatusEnum {TO_BE_SUBMITTED(1,"待提交…...

NX/UG二次开发—CAM—快速查找程序参数名称

使用UF_PARAM_XXX读取或设置参数时,会发现程序中有一个INT类型参数param_index,这个就是对应程序中的参数,比如读取程序余量,则param_index = UF_PARAM_STOCK_PART,读取程序的加工坐标系则param_index = UF_PARAM_MCS等等。 你需要读取什么参数,只要只能在uf_param_indic…...

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器&#xff0c;网卡绑定有2个ip地址&#xff0c;分别为&#xff1a; A&#xff1a;192.168.111.201 B&#xff1a;192.168.111.202 在这台服务器请求目标地址 C&#xff1a;192.168.111.203 时必须使用B作为源地址才能访问目标地址C&#xff0c;在这台服务器默认…...

访问CMOS RAM

实验内容、程序清单及运行结果 访问CMOS RAM&#xff08;课本实验14&#xff09; 代码如下&#xff1a; assume cs:code data segment time db yy/mm/dd hh:mm:ss$ ;int 21h 显示字符串&#xff0c;要求以$结尾 table db 9,8,7,4,2,0 ;各时间量的存放单元 data ends cod…...

解决AnyConnect开机自启动问题

文章目录 一、问题描述二、解决方案 (Windows)1.开启-设置2.点击“应用”3.点击“启动”&#xff0c;选择“关” 三、参考文章 一、问题描述 学校指定的VPN总是开机自启动&#xff0c;然而 设置-Preferences 中却没有取消开机自启的选项。 似乎开机自启是必然的&#xff0c;我…...

芯片AI深度实战:进阶篇之vim内verilog实时自定义检视

【痛点】 传统Verilog开发中,工程师不断"编码→仿真→查错"的循环。本文整合AST解析与Vim编辑器,在编码阶段即实现: ✔️ 自动标记逻辑问题 ✔️ AI+ 发现涉及多模块逻辑错误 ✔️ 强制代码风格 【解决方案】 1️⃣ 基于AST的精准模式匹配 - 深度集成…...

探索NRBO–CNN–LSTM–Attention在多输入单输出回归预测中的应用

NRBO–CNN–LSTM–Attention&#xff0c;多输入单输出回归预测。 &#xff0c;牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NRBO)是一种新型的元启发式算法&#xff08;智能优化算法&#xff09;&#xff0c;该成果由Sowmya等人于2024年2月发表在中科院2区Top SCI期刊…...

SpringBoot项目整合Redisson实战:从连接池报错到Redis集群健康检查的完整避坑指南

SpringBoot整合Redisson深度实践&#xff1a;连接池优化与集群健康监控全解析 Redis作为分布式系统的核心组件&#xff0c;其Java客户端Redisson的高阶用法一直是开发者关注的焦点。去年某电商平台大促期间&#xff0c;因Redis集群节点闪断导致的分布式锁失效事故&#xff0c;让…...

AI智能体应用工程师:少数人掌握的高薪未来,你离入场还有多远

AI智能体应用工程师 — 国家战略人才项目|企业刚需资质—国务院发布关于实施“人工智能”行动。文中指出:到2027年&#xff0c;率先实现人工智能与6大重点领域广泛深度融合&#xff0c;新一代智能体终端、智能体等应用普及率超过70%。 各地省政府于2025年市级“A1产业”专项基金…...

太阳能电池阵列监测实战:用AMC1301搞定200V共模电压下的单体电压采集

太阳能电池阵列单体电压监测&#xff1a;基于AMC1301的高压隔离采集方案设计指南 光伏电站的电池阵列通常由数十至数百块单体电池串联组成&#xff0c;系统电压可达600-1500V。在这种高压堆叠场景下&#xff0c;如何准确监测每块单体电池的电压&#xff08;通常仅0.5-0.7V&…...

当固体力学遇上AI:Energy-based PINN如何搞定超弹性橡胶材料仿真?

Energy-based PINN&#xff1a;颠覆超弹性材料仿真的无网格革命 橡胶密封圈在高压环境下的变形预测误差超过40%、人工心脏瓣膜材料的疲劳寿命仿真需要72小时计算、柔性电子器件在弯曲状态下的应力分布难以精确建模——这些困扰研究者的难题&#xff0c;正在被一种结合深度学习和…...

# 发散创新:基于 Rust的分布式数据库架构设计与实战演练在当前云原生和微服务架

发散创新&#xff1a;基于 Rust 的分布式数据库架构设计与实战演练 在当前云原生和微服务架构盛行的背景下&#xff0c;分布式数据库已成为高并发、高可用系统的核心基础设施。本文将深入探讨如何使用 Rust 编程语言构建一个轻量级但功能完整的分布式数据库原型&#xff0c;重点…...

Mplus路径系数差异比较实战:两种方法详解与选择指南

Mplus路径系数差异比较实战&#xff1a;两种方法详解与选择指南 在结构方程模型分析中&#xff0c;研究者常常需要比较不同路径系数或中介效应是否存在显著差异。比如&#xff0c;你可能想知道性别对工作满意度的直接影响是否显著大于其对组织承诺的影响&#xff0c;或者比较两…...

C语言数组操作:3种移除元素方法实战对比(附LeetCode真题解析)

C语言数组操作&#xff1a;3种移除元素方法实战对比&#xff08;附LeetCode真题解析&#xff09; 在算法面试和日常编程中&#xff0c;数组操作是最基础也最常考察的技能点之一。移除数组中特定元素这类看似简单的任务&#xff0c;却能很好地检验程序员对内存管理、算法效率和…...

什么是 Harness Engineering?把 Prompt、Workflow、Eval 串成系统的那层骨架

点击上方 前端Q&#xff0c;关注公众号回复加群&#xff0c;加入前端Q技术交流群上一篇我们先把问题抛出来了&#xff1a; 为什么现在大家都在聊 Agent、Workflow、AI Coding&#xff0c;可真正决定系统上限的&#xff0c;往往不是模型本身&#xff0c;而是模型外那层工程骨架。…...

ER-Save-Editor:艾尔登法环存档修改工具全解析

ER-Save-Editor&#xff1a;艾尔登法环存档修改工具全解析 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor ER-Save-Editor是一款开源的艾尔登法…...