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")
    @ResponseBody
    public String sayHello() {
        # 蓝
        return "Hello,I am Blue";
    }
}

hellok8s:2.0

@RestController
public class HelloController {

    @GetMapping("/sayHello")
    @ResponseBody
    public 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: 3
  selector:
    matchLabels:
      app: hellok8s-v1
  template:
    metadata:
      labels:
        app: hellok8s-v1
    spec:
      containers:
      - name: hellok8s
        image: hellok8s:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - 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-single
  labels:
    app: hellok8s-v1
spec:
  containers:
  - name: hellok8s
    image: hellok8s:1.0
    imagePullPolicy: IfNotPresent
    ports:
    - 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 副本一直处于满足用户期望的数量,起到多退少补的作用,并且还具有自动扩容缩容等机制。
  • 但是它并不能实现声明式更新。

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

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

相关文章

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

VUE2双向绑定的原理

文章目录 VUE2双向绑定的原理1. 什么是双向绑定2. 双向绑定的原理2.1 ViewModel的重要作用2.2 双向绑定的流程 3. 双向绑定的实现3.1 data响应化处理3.2 Compile编译3.3 依赖收集 VUE2双向绑定的原理 1. 什么是双向绑定 讲双向绑定先讲单项绑定,啥叫单项绑定&…

入行FPGA设计工程师需要提前学习哪些内容?

FPGA作为一种灵活可编程的硬件平台,广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师,但对于新手来说,可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备,本文将详细介绍入行FPGA设计工程…

Mac M1 ComfyUI 中 AnyText插件安装问题汇总?

Q1:NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月,该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求,必须降级transformors &#…

深度学习 Pytorch 神经网络的学习

本节将从梯度下降法向外拓展,介绍更常用的优化算法,实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型,可能会有数百个 w w w的存在,同时如果我们使用的是像交叉熵这样…

Java 大视界 -- 深度洞察 Java 大数据安全多方计算的前沿趋势与应用革新(52)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Docker使用指南(二)——容器相关操作详解(实战案例教学,创建/使用/停止/删除)

目录 1.容器操作相关命令​编辑 案例一: 案例二: 容器常用命令总结: 1.查看容器状态: 2.删除容器: 3.进入容器: 二、Docker基本操作——容器篇 1.容器操作相关命令 下面我们用两个案例来具体实操一…

【C++】STL——list的使用

目录 💕1.带头双向链表List 💕2.list用法介绍 💕3.list的初始化 💕4.size函数与resize函数 💕5.empty函数 💕6.front函数与back函数 💕7.push_front,push_back,pop_front,pop_back函数…

Java面试题集合篇5:10道基础面试题

文章目录 前言41、多线程使用 ArrayList42、List 和 Set 区别43、HashSet 实现原理44、HashSet检查重复和保证数据不可重复45、BlockingQueue46、Map接口46.1、HashMap实现原理46.2、HashMap在JDK1.7和JDK1.8中不同点46.3、JDK1.7 VS JDK1.8 比较 47、HashMap的put方法流程48、…

控件【QT】

文章目录 控件QWidgetenabledgeometrysetGeometry qrcwindowOpacityQPixmapfonttoolTipfocusPolicystyleSheetQPushButtonRadio ButtionCheck Box显示类控件QProgressBarcalendarWidget 控件 Qt中已经提供了很多内置的控件了(按钮,文本框,单选按钮,复选按钮,下拉框…

docker pull Error response from daemon问题

里面填写 里面解决方案就是挂代理。 以虚拟机为例,将宿主机配置端口设置,https/http端口设为7899 配置虚拟机的http代理: vim /etc/systemd/system/docker.service.d/http-proxy.conf里面填写,wq保存 [Service] Environment…

linux 进程补充

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 里,但是照样可以链接成功&#…

一文解释pytorch 中的 squeeze() 和 unsqueeze()函数(全网最详细版)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …

QT:对象树

1.概念 Qt 中的对象树是一种以树形结构组织 Qt 对象的方式。当创建一个QObject(Qt 中大多数类的基类)或其派生类的对象时,可以为其指定一个父对象(parent)。这个对象就会被添加到其父对象的子对象列表中,形…

labview通过时间计数器来设定采集频率

在刚接触labview的时候,笔者通常用定时里的等待函数来实现指令的收发,但是当用到的收发消息比较多时就出现了卡顿,卡死的情况,这是因为当用队列框架时,程序卡在了其中的一个分支里,等通过相应的延时后才可以…

2024最新前端面试题(附答案及解析)

文章目录 HTML篇1、HTML5有哪些新特性?2、介绍下 BFC 及其应用3、内元素和块级元素的区别?4、Doctype作用?标准模式与混杂模式如何区分?5、引入样式时,link和import的区别?6、介绍一下你对浏览器内核的理解…

Linux:文件系统(软硬链接)

目录 inode ext2文件系统 Block Group 超级块(Super Block) GDT(Group Descriptor Table) 块位图(Block Bitmap) inode位图(Inode Bitmap) i节点表(inode Tabl…

Java基础面试题50题

1&#xff0c;""空字符串的作用 package com.neuedu.nineteen;public class Test {public static void main(String[] args) {String s"";for (char i a; i < d; i) {ssi;//输出abc // sis;//输出cba}System.out.println(s);} }如题所示&…

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制

【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…

GB/T 44721-2024 与 L3 自动驾驶:自动驾驶新时代的基石与指引

1.前言 在智能网联汽车飞速发展的当下&#xff0c;自动驾驶技术成为了行业变革的核心驱动力。从最初的辅助驾驶功能&#xff0c;到如今不断迈向高度自动化的征程&#xff0c;每一步都凝聚着技术的创新与突破。而在这一进程中&#xff0c;标准的制定与完善对于自动驾驶技术的规…