【云原生】ReplicaSet控制器详解

ReplicaRet

文章目录

  • ReplicaRet
    • 一、ReplicaSet介绍
      • 1.1、介绍
      • 1.2、ReplicaSet的工作原理
      • 1.3、何时使用ReplicaSet
    • 二、实战
      • 2.1、示例
    • 三、非模板Po的获得
    • 四、编写ReplicaSet的清单注意事项
      • 4.1、编写注意事项
      • 4.2、Pod模板
      • 4.3、Pod选择标签
      • 4.4、ReplicaSet扩缩容
      • 4.5、删除ReplicaSet
      • 4.6、只删除ReplicaSet

一、ReplicaSet介绍

1.1、介绍

  • ReplicaRet简称RS的目的是维护一组在任何时候都处于运行状态的Pod副本的稳定集合。因此,它通常用来保证给定数量的、完全相同的Pod的可用性。

1.2、ReplicaSet的工作原理

  • ReplicaSet是通过一组字段来定义的,包括一个用来识别可获得的Pod的集合选择标签、一个用来表明应该维护的副本个数的数值、一个用来指定应该创建新的Pod以满足副本个数条件时要使用的Pod的模板等等。每个ReplicaSet都通过根据需要创建和删除Pod以使得副本个数达到期望值,进而实现其存在价值。当ReplicaSet需要创建新的Pod 时,会使用所提供得Pod模板。
  • ReplicaSet通过Pod上的metadata.ownerReferences字段连接到附属Pod,该字段给出当前对象得属主资源。ReplicaSet所获得得Pod都在其ownerReferneces字段中包含了属主ReplicaSet的标识信息。正是通过这一连接,ReplicaSet知道它所维护的Pod的状态,并据此计划其操作行为。
  • ReplicaSet使用其选择标签来辨识要获得的Pod的集合。如果某个Pod没有OwnerReference或则其OwnerReference不是一个控制器,且其匹配到某个ReplicaSet的选择算符,则该Pod立即被此ReplicaSet获得。

1.3、何时使用ReplicaSet

  • ReplicaSet确保何时时间都有指定熟练的Pod副本在运行。然而,Deployment是一个更高级的概念,它管理ReplicaSet,并向Pod提供声明式的更新以及许多其他有用的功能。因此,我们建议使用Deployment而不是直接使用ReplicaSet,除非你需要自定义更新业务芮城或根据不需要更新。
  • 这实际上意味着,你可能永远不需要操作ReplicaSet对象:而是使用Deployment,并在spec部署定义你的引用。

二、实战

2.1、示例

[root@master ~]# cat rs.yaml 
apiVersion: "v1"
kind: Namespace
metadata:name: nginx-latest---apiVersion: "apps/v1"
kind: ReplicaSet
metadata:name: frontendnamespace: nginx-latestlabels:app: guestbooktier: frontend
spec:# 按照你的实际情况修改副本数replicas: 3# 定义标签选择:表示这个 ReplicaSet 将管理标签带有 tier=frontend 的Pod # 可以通过 kubectl get pod -A l tier=frontend 查看带有此标签的Podselector:matchLabels:tier: frontend# 定义容器模板template:metadata:labels:tier: frontendspec:# 只要容器退出就自动重启restartPolicy: Alwayscontainers:- name: nginx-80image: nginx:latest# 定义拉取策略imagePullPolicy: IfNotPresent
  • 将此清单保存到rs.yaml中,并将其提交到kubernetes集群,就能创建yaml文件所定义的ReplicaSet及其管理的Pod
[root@master ~]# kubectl apply -f rs.yaml 
  • 你可以通过下面的命令查看被部署的ReplicaSet
[root@master ~]# kubectl get rs -n nginx-latest 
NAME       DESIRED   CURRENT   READY   AGE
frontend   3         3         3       65s
  • 你也可以通过以下命令获取ReplicaSet的详细信息
[root@master ~]# kubectl describe rs -n nginx-latest 
Name:         frontend
Namespace:    nginx-latest
Selector:     tier=frontend
Labels:       app=guestbooktier=frontend
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:Labels:  tier=frontendContainers:nginx-80:Image:        nginx:latestPort:         <none>Host Port:    <none>Environment:  <none>Mounts:       <none>Volumes:        <none>
Events:Type    Reason            Age    From                   Message----    ------            ----   ----                   -------Normal  SuccessfulCreate  4m42s  replicaset-controller  Created pod: frontend-qb825Normal  SuccessfulCreate  4m42s  replicaset-controller  Created pod: frontend-vb77tNormal  SuccessfulCreate  4m42s  replicaset-controller  Created pod: frontend-ww8g9
  • 最后可以查看启动了的Pod的集合
[root@master ~]# kubectl get pod -n nginx-latest 
NAME             READY   STATUS    RESTARTS   AGE
frontend-qb825   1/1     Running   0          5m27s
frontend-vb77t   1/1     Running   0          5m27s
frontend-ww8g9   1/1     Running   0          5m27s
  • 你也可以通过以下命令以YAML格式输出Pod的详细信息,输出将类似这样,frontend ReplicaSet的信息被设置在metadata的ownerReferences字段中:
[root@master ~]# kubectl get pod frontend-qb825 -n nginx-latest -o yaml
apiVersion: v1
kind: Pod
metadata:creationTimestamp: "2024-07-25T08:39:51Z"generateName: frontend-labels:tier: frontendname: frontend-qb825namespace: nginx-latest
################################################################ ownerReferences:- apiVersion: apps/v1blockOwnerDeletion: truecontroller: truekind: ReplicaSetname: frontenduid: c0f64a9f-9032-470b-840e-17c93c392d3d
################################################################resourceVersion: "5931"uid: 2897d78c-1646-401f-bdc0-c5b146028645
spec:containers:- image: nginx:latestimagePullPolicy: IfNotPresentname: nginx-80resources: {}
...

三、非模板Po的获得

  • 尽管你完全可以直接创建裸的Pod,强烈建议你确保这些裸的Pod并不包含可能与你的某个ReplicaSet的选择算符匹配的标签。原因在于ReplicaSet并不仅限于拥有在其模板中设置的Pod,只要创建的裸Pod的标签和ReplicaSet标签一样,那么这个裸Pod将由ReplicaSet管理。

  • 在以下清单中指定这些裸Pod:

[root@master ~]# cat pod.yaml 
apiVersion: "v1"
kind: Pod 
metadata:name: pod1namespace: nginx-latestlabels:tier: frontend
spec:containers:- name: hello1image: nginx# 容器十分钟后自动退出command: ["/bin/sh","-c","sleep 600"]---apiVersion: "v1"
kind: Pod 
metadata:name: pod2namespace: nginx-latestlabels:tier: frontend
spec:containers:- name: hello2image: nginx # 容器十分钟后自动退出command: ["/bin/sh","-c","sleep 600"]
  • 由于这些Pod没有控制器(Controller,或其他对象)作为其属主引用,并且其标签与frontend ReplicaSet的标签匹配,他们会立即被该ReplicaSet获取。
  • 假定你在frontend ReplicaSet已经被部署之后创建Pod,并且你已经在ReplicaSet中设置了其初始的Pod的腹板以满足其副本计数需要:
[root@master ~]# kubectl apply -f pod.yaml
  • 新的Pod会被该ReplicaSet获取,并立即被ReplicaSet终止,因为它们的存在会使得ReplicaSet中Pod个数超出其期望值。
  • 取回Pod
  • 输出显示新的Pod或者已经被终止,或者处于终止过程中:
[root@master ~]# kubectl get pod -n nginx-latest 
NAME             READY   STATUS        RESTARTS   AGE
frontend-qb825   1/1     Running       0          24m
frontend-vb77t   1/1     Running       0          24m
frontend-ww8g9   1/1     Running       0          24m
pod1             1/1     Terminating   0          35s
pod2             1/1     Terminating   0          35s
  • 如果你先创建Pod
# 先把之前创建的 ReplicaSet删除
# 提示:因为pod的标签和ReplicaSet的标签一样,所以删除ReplicaSet就将会删除Pod
[root@master ~]# kubectl delete -f rs.yaml
# Pod需要在顶部额外添加名称空间
[root@master ~]# cat pod.yaml 
apiVersion: "v1"
kind: Namespace
metadata:name: nginx-latest
[root@master ~]# kubectl apply -f pod.yaml
  • 之后再创建ReplicaSet
[root@master ~]# kubectl apply -f rs.yaml
  • 你会看到ReplicaSet已经获得了该Pod,并仅根据其规约创建新的Pod,直到新的Pod和原来的Pod的总数达到其预期个数。这时取回Pod列表
[root@master ~]# kubectl get pod -n nginx-latest 
NAME             READY   STATUS    RESTARTS   AGE
frontend-zrj69   1/1     Running   0          67s
pod1             1/1     Running   0          94s
pod2             1/1     Running   0          94s

四、编写ReplicaSet的清单注意事项

4.1、编写注意事项

  • 与所有其他Kubernetes API对象一样,ReplicaSet也需要apiVersionkind、和metadata字段。对于ReplicaSet而言,其kind始终是Replicaset
kind: ReplicaSet
  • 当控制平台为ReplicaSet创建的新的Pod时,ReplicaSet的.metadata.name是命名这些Pod的部分基础。ReplicaSet的名称必须是一个合法的DNS 子域值,但这可能对Pod的主机名产生以外的结果。为获得最佳兼容性,名称应遵循更严格的DNS 标签规则。
  • ReplicaSet也需要.spec部分
metadata:name: frontend

4.2、Pod模板

  • .spec.template是一个Pod模板,要求设置标签。在rs.yaml示例中,我们指定了标签tier: frontend。注意不要将标签与其他控制器的选择标签重叠,否则那些控制器会尝试收养此Pod。
template:metadata:labels:tier: frontend
  • 对于模板的重启策略字段,.spec.template.spec.restartPolicy,唯一允许的取值是Always,这也是默认值。
spec:template:spec:imagePullPolicy: IfNotPresent

4.3、Pod选择标签

  • .spec.selector字段是一个标签选择算符。如前文中所讨论的,这些是用来标识要被获取的Pod的标签。在签名的rs.yaml示例中,选择算符为:
  • 在ReplicaSet中,.spec.template.metadata.labels的值必须与spec.selector值相匹配,是否该配置会被API拒绝
matchLabels:tier: frontendmetadata:labels:tier: frontend

4.4、ReplicaSet扩缩容

  • 你可以通过设置.spec.replicas来指定要同时运行的Pod的个数。
  • ReplicaSet创建、删除Pod以与此值匹配
  • 如果你没有指定.spec.replicas,那么默认值为1,也就是容器1个Pod
spec:# 按照你的实际情况修改副本数replicas: 3

4.5、删除ReplicaSet

[root@master ~]# kubectl delete -f rs.yaml

4.6、只删除ReplicaSet

  • 你可以只删除ReplicaSet而不影响它的各个Pod,方法是使用kubectl delete命令并设置--cascade=orphan选项
[root@master ~]# kubectl delete rs frontend --cascade=orphan -n nginx-latest
  • 查看ReplicaSet将看到如下内容
[root@master ~]# kubectl get rs -n nginx-latest 
  • 查看Pod是否被连着ReplicaSet一起删除
  • 由此可见,我们删除了ReplicaSet控制器,但是它所管理的Pod并没有被删除。
[root@master ~]# kubectl get pod -n nginx-latest 
NAME             READY   STATUS    RESTARTS   AGE
frontend-582rl   1/1     Running   0          3m22s
frontend-rqw86   1/1     Running   0          3m22s
frontend-xxcnh   1/1     Running   0          3m22s

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

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

相关文章

单证不一致清关难题 | 国际贸易综合服务平台 | 箱讯科技

什么是单证一致&#xff1f; 单证一致出口方所提供的所有单据要严格符合进口方开证银行所开信用证的要求&#xff0c;或者说出口方制作和提供的所有与本项货物买卖有关的单据&#xff0c;与进口方申请开立的信用证对单据的要求完全吻合&#xff0c;没有矛盾。 添加图片注释&am…

【Stable Diffusion】(基础篇四)—— 模型

模型 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 本文主要讲解如何下载和使…

Spire.PDF for .NET【文档操作】演示:在 PDF 中添加、隐藏或删除图层

PDF 图层是一种将 PDF 文件的内容按图层排列的功能&#xff0c;允许用户在同一个 PDF 文件中选择性地将某些内容设置为可见&#xff0c;将其他内容设置为不可见。PDF 图层是分层艺术品、地图和 CAD 图纸中使用的常见元素。本文将演示如何使用Spire.PDF for .NET以编程方式在 PD…

golang中运行main下存在多个文件方式

golang中运行main下存在多个文件方式 1.问题描述:2.正常方式3.解决13.解决2 1.问题描述: 在编写某些功能时候 main包下面存在多个程序 例如 web |----main.go---含有main函数 |----routes.go都属于mian包 那么该怎么运行呢?? main.go package main func main() {//用route…

分类常用的评价指标-二分类/多分类

二分类常用的性能度量指标 精确率、召回率、F1、TPR、FPR、AUC、PR曲线、ROC曲线、混淆矩阵 「精确率」查准率 PrecisionTP/(TPFP) 「召回率」查全率RecallTP/(TPFN) 「真正例率」即为正例被判断为正例的概率TPRTP/(TPFN) 「假正例率」即为反例被判断为正例的概率FPRFP/(TNFP)…

唯众物联网(IOT)全功能综合实训教学解决方案

一、引言 在信息技术日新月异的今天&#xff0c;物联网&#xff08;IoT&#xff09;作为推动数字化转型的关键力量&#xff0c;其触角已延伸至我们生活的方方面面&#xff0c;深刻地重塑了工作模式、生活习惯乃至社会结构的每一个角落。面对这一前所未有的变革浪潮&#xff0c…

Java的类加载机制

Java的类加载机制是指将类的字节码文件&#xff08;.class文件&#xff09;加载到JVM中并将其转换为Class对象的过程。这个过程由类加载器&#xff08;ClassLoader&#xff09;完成。Java的类加载机制具有动态性和灵活性&#xff0c;使得Java能够支持动态加载类、实现模块化开发…

day4 vue2以及ElementUI

创建vue2项目 可能用到的命令行们 vue create 项目名称 // 创建项目 cd 项目名称 // 只有进入项目下&#xff0c;才能运行 npm run serve // 运行项目 D: //切换盘符 更改 Vue项目的端口配置 基础语法 项目创建完成之后&#xff0c;会有一个组件HelloWorld.vue&#xff0c;…

推动智慧交通建设,边缘计算赋能交通信号灯数据处理与决策能力

随着智慧城市建设的快速发展&#xff0c;智慧交通已成为城市发展的重要组成项目。智慧交通旨在通过大数据、人工智能、物联网等先进技术&#xff0c;实现交通系统的全面感知、智能分析、主动服务和协同管理。边缘计算在交通信号灯物联网应用中展现了交通信号灯数据处理与决策能…

手机怎么设置不同的ip地址

在数字化日益深入的今天&#xff0c;智能手机已成为我们生活、工作和学习中不可或缺的设备。然而&#xff0c;随着网络应用的广泛和深入&#xff0c;我们有时需要为手机设置不同的IP地址来满足特定需求。比如&#xff0c;避免网络限制、提高网络安全、或者进行网络测试等。本文…

内网对抗-隧道技术篇防火墙组策略HTTP反向SSH转发出网穿透CrossC2解决方案

知识点&#xff1a; 1、C2/C2上线-CrossC2插件-多系统平台支持 2、隧道技术篇-应用层-SSH协议-判断&封装&建立&穿透 3、隧道技术篇-应用层-HTTP协议-判断&封装&建立&穿透隧道技术主要解决网络通讯问题&#xff1a;遇到防火墙就用隧道技术&#xff0c;…

Ubuntu设置网络

进入网络配置文件夹 cd /etc/netplan 使用 vim 打开下的配置文件 打开后的配置 配置说明&#xff1a; network:# 网络配置部分ethernets:# 配置名为ens33的以太网接口ens33:addresses:# 为ens33接口分配IP地址192.168.220.30&#xff0c;子网掩码为24位- 192.168.220.30/24n…

软考-软件设计师(3)-数据结构与算法:树、图、队列、查找算法、排序算法、霍夫曼编码/树、环路复杂性、算法/时间复杂度/空间复杂度等高频考点

场景 软考-软件设计师-数据结构与算法模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 树:节点的度、树的度、深度、高度、满二叉树、完全二叉树、平衡二叉树、B树…

【iOS】——Block概要和使用规范

Block概要和使用规范 Block定义 Block是带有自动变量的匿名函数&#xff0c;这里的自动变量是局部变量&#xff0c;匿名函数是说不需要知道该函数的名称也可以调用。无需提前声明或命名就能作为参数传递给其他函数或方法&#xff0c;或者作为变量保存和执行 Block的语法 完…

利用宝塔部署前后端分离springboot项目,以EasyPan为例

前置准备 服务器购买 请参考其他教程&#xff0c;这里不再赘述。 项目 部署到服务器前请确保项目在本地运行正常 安装宝塔面板 宝塔Linux面板的安装配置以及基本使用教程&#xff08;超详细&#xff09;_宝塔linux面板新手使用教程-CSDN博客 sql文件 IDEA中怎样导出数据…

删除的视频怎样才能恢复?详尽指南

在日常生活中&#xff0c;我们有时会不小心删除一些重要的视频文件&#xff0c;或者在整理存储空间时不慎丢失了珍贵的记忆片段。这时候&#xff0c;我们可以通过一些数据恢复工具和技巧&#xff0c;找回这些被删除的视频。本文将详细介绍几种常见且有效的视频恢复方法&#xf…

docker 安装jenkins详细步骤教程

Jenkins 是一个开源的持续集成(CI)和持续部署(CD)工具,用于自动化软件开发过程中的构建、测试和部署。 特点和功能: 持续集成:Jenkins 可以自动触发构建过程,检查代码变更并进行构建、测试和部署,以确保团队的代码始终保持可集成状态。 插件生态系统:Jenkins 拥有丰富…

Vue与ASP.NET Core Web Api设置localhost与本地ip地址皆可访问

Vue的设置 我们创建并启动一个Vue项目&#xff0c;如下所示&#xff1a; 打开cmd&#xff0c;输入ipconfig查询本地ip地址&#xff1a; 想通过本地ip地址访问&#xff0c;把localhost改成本地ip地址&#xff0c;发现打不开&#xff1a; 这是因为Vue项目默认只有localhost&…

【Linux】进程IO|重定向|缓冲区|dup2|dup|用户级缓冲区|模拟缓冲区

目录 前言 重定向 实验一 为什么log.txt文件的文件描述符是1 为什么向stdout打印的信息也出现在文件中 实验二 用户级缓冲区 为什么要有用户级缓冲区 系统调用 dup 为什么close(fd1)之后还能向log.txt写入数据&#xff1f; dup2 缓冲区 观察现象 测试1 测试2 测…

【Pytorch实战教程】Pytorch中保存和加载模型的详细介绍

文章目录 保存模型方法一:只保存模型参数方法二:保存整个模型加载模型方法一:加载模型参数(推荐)方法二:加载整个模型训练时保存模型加载并继续训练总结在PyTorch中,保存和加载模型是非常重要的步骤,尤其是在训练大规模模型或需要多次重复实验时。 保存模型 在PyTorch…