【云原生】ReplicaSet控制器详解

server/2024/9/24 10:47:19/

ReplicaRet

文章目录

ReplicaSet_5">一、ReplicaSet介绍

1.1、介绍

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

ReplicaSet_11">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获得。

ReplicaSet_17">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
[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_250">四、编写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

ReplicaSet_303">4.4、ReplicaSet扩缩容

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

ReplicaSet_315">4.5、删除ReplicaSet

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

ReplicaSet_321">4.6、只删除ReplicaSet

  • 你可以只删除ReplicaSet而不影响它的各个Pod,方法是使用kubectl delete命令并设置--cascade=orphan选项
[root@master ~]# kubectl delete rs frontend --cascade=orphan -n nginx-latest
[root@master ~]# kubectl get rs -n nginx-latest 
[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.ppmy.cn/server/90684.html

相关文章

防火墙简单学习

文章目录 防火墙主要功能防火墙类型 防火墙主要功能 防火墙是一种网络安全设备&#xff0c;它通过监控和控制进出网络的数据包来保护内部网络不受外部攻击和威胁。防火墙的主要功能包括&#xff1a; 访问控制&#xff1a;防火墙可以限制哪些设备和用户可以访问网络资源&#x…

分布式事务——2PC 代码示例

一 2PC代码示例 在Java中实现两阶段提交&#xff08;2PC, Two-Phase Commit&#xff09;协议通常涉及多个组件&#xff0c;包括事务协调者&#xff08;Transaction Coordinator&#xff09;和多个资源管理器&#xff08;Resource Managers&#xff0c;如数据库&#xff09;。在…

Java常见的面试二

1、普通类和抽象类有那些区别 普通类中不能有抽象方法&#xff0c;抽象类中可以有抽象方法普通类可以直接实例化&#xff0c;抽象类不能直接实例化 2、抽象类能够使用final修饰吗 不能&#xff0c;抽象类是由子类继承的&#xff0c;但是final修饰的类不能被继承。两者矛盾所以…

【C++】特殊类的设计

目录 类的对象只能在堆上创建 类的对象只能在栈上创建 类只能创建一个对象&#xff08;单例模式&#xff09; 饿汉 懒汉 本篇博客就是说给一个需求&#xff0c;然后根据需求和类的一些语法规则设计出符合要求的类&#xff0c;比如说我们之前的不能拷贝的类&#xff1a;C98…

vue3项目报错集合

目录 一、does not provide an export named default 一、does not provide an export named default 报错截图&#xff1a; 原因&#xff1a; vite对commonjs兼容性太差&#xff0c;导致无法引入jsoneditor&#xff0c;可以使用originjs/vite-plugin-commonjs插件解决。&am…

分布式搜索引擎ES--Elasticsearch集群

1.Elasticsearch集群的概念 分片机制&#xff1a;每个索引都可以被分片 索引my_doc只有一个主分片&#xff1b;索引shop有三个主分片&#xff1b;索引shop2有5个主分片;(参考前面案例) 每个主分片都包含索引的数据&#xff0c;由于目前是单机&#xff0c;所以副分片是没有的&a…

Llama + Dify,在你的电脑搭建一套AI工作流

theme: smartblue 点赞 关注 收藏 学会了 本文简介 最近字节在推Coze&#xff0c;你可以在这个平台制作知识库、制作工作流&#xff0c;生成一个具有特定领域知识的智能体。 那么&#xff0c;有没有可能在本地也部署一套这个东西呢&#xff1f;这样敏感数据就不会泄露了&…

Nginx负载均衡策略

upstream机制提供了负载均衡的功能,可以讲请求负载分担到集群服务器的某个服务器上 打包时候到时一个8085 一个8090 一个8095 nohup /usr/local/develop/jdk-17.0.10/bin/java -Xmx256m -Xms256m -jar nginx-demo-8085.jar > server8085.log 2>&1 & nohup /u…