ReplicaRet
文章目录
一、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、示例
bash
[root@master ~]# cat rs.yaml
apiVersion: "v1"
kind: Namespace
metadata:
name: nginx-latest
---
apiVersion: "apps/v1"
kind: ReplicaSet
metadata:
name: frontend
namespace: nginx-latest
labels:
app: guestbook
tier: frontend
spec:
# 按照你的实际情况修改副本数
replicas: 3
# 定义标签选择:表示这个 ReplicaSet 将管理标签带有 tier=frontend 的Pod
# 可以通过 kubectl get pod -A l tier=frontend 查看带有此标签的Pod
selector:
matchLabels:
tier: frontend
# 定义容器模板
template:
metadata:
labels:
tier: frontend
spec:
# 只要容器退出就自动重启
restartPolicy: Always
containers:
- name: nginx-80
image: nginx:latest
# 定义拉取策略
imagePullPolicy: IfNotPresent
- 将此清单保存到
rs.yaml
中,并将其提交到kubernetes集群,就能创建yaml文件所定义的ReplicaSet及其管理的Pod
bash
[root@master ~]# kubectl apply -f rs.yaml
- 你可以通过下面的命令查看被部署的ReplicaSet
bash
[root@master ~]# kubectl get rs -n nginx-latest
NAME DESIRED CURRENT READY AGE
frontend 3 3 3 65s
- 你也可以通过以下命令获取
ReplicaSet
的详细信息
bash
[root@master ~]# kubectl describe rs -n nginx-latest
Name: frontend
Namespace: nginx-latest
Selector: tier=frontend
Labels: app=guestbook
tier=frontend
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: tier=frontend
Containers:
nginx-80:
Image: nginx:latest
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 4m42s replicaset-controller Created pod: frontend-qb825
Normal SuccessfulCreate 4m42s replicaset-controller Created pod: frontend-vb77t
Normal SuccessfulCreate 4m42s replicaset-controller Created pod: frontend-ww8g9
- 最后可以查看启动了的Pod的集合
bash
[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
字段中:
bash
[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: frontend
name: frontend-qb825
namespace: nginx-latest
################################################################
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: frontend
uid: c0f64a9f-9032-470b-840e-17c93c392d3d
################################################################
resourceVersion: "5931"
uid: 2897d78c-1646-401f-bdc0-c5b146028645
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: nginx-80
resources: {}
...
三、非模板Po的获得
-
尽管你完全可以直接创建裸的Pod,强烈建议你确保这些裸的Pod并不包含可能与你的某个ReplicaSet的选择算符匹配的标签。原因在于ReplicaSet并不仅限于拥有在其模板中设置的Pod,只要创建的裸Pod的标签和ReplicaSet标签一样,那么这个裸Pod将由ReplicaSet管理。
-
在以下清单中指定这些裸Pod:
bash
[root@master ~]# cat pod.yaml
apiVersion: "v1"
kind: Pod
metadata:
name: pod1
namespace: nginx-latest
labels:
tier: frontend
spec:
containers:
- name: hello1
image: nginx
# 容器十分钟后自动退出
command: ["/bin/sh","-c","sleep 600"]
---
apiVersion: "v1"
kind: Pod
metadata:
name: pod2
namespace: nginx-latest
labels:
tier: frontend
spec:
containers:
- name: hello2
image: nginx
# 容器十分钟后自动退出
command: ["/bin/sh","-c","sleep 600"]
- 由于这些Pod没有控制器(Controller,或其他对象)作为其属主引用,并且其标签与frontend ReplicaSet的标签匹配,他们会立即被该ReplicaSet获取。
- 假定你在frontend ReplicaSet已经被部署之后创建Pod,并且你已经在ReplicaSet中设置了其初始的Pod的腹板以满足其副本计数需要:
bash
[root@master ~]# kubectl apply -f pod.yaml
- 新的Pod会被该ReplicaSet获取,并立即被ReplicaSet终止,因为它们的存在会使得ReplicaSet中Pod个数超出其期望值。
- 取回Pod
- 输出显示新的Pod或者已经被终止,或者处于终止过程中:
bash
[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
bash
# 先把之前创建的 ReplicaSet删除
# 提示:因为pod的标签和ReplicaSet的标签一样,所以删除ReplicaSet就将会删除Pod
[root@master ~]# kubectl delete -f rs.yaml
bash
# Pod需要在顶部额外添加名称空间
[root@master ~]# cat pod.yaml
apiVersion: "v1"
kind: Namespace
metadata:
name: nginx-latest
bash
[root@master ~]# kubectl apply -f pod.yaml
- 之后再创建ReplicaSet
bash
[root@master ~]# kubectl apply -f rs.yaml
- 你会看到ReplicaSet已经获得了该Pod,并仅根据其规约创建新的Pod,直到新的Pod和原来的Pod的总数达到其预期个数。这时取回Pod列表
bash
[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也需要
apiVersion
、kind
、和metadata
字段。对于ReplicaSet而言,其kind始终是Replicaset
bash
kind: ReplicaSet
- 当控制平台为ReplicaSet创建的新的Pod时,ReplicaSet的
.metadata.name
是命名这些Pod的部分基础。ReplicaSet的名称必须是一个合法的DNS 子域值
,但这可能对Pod的主机名产生以外的结果。为获得最佳兼容性,名称应遵循更严格的DNS 标签规则。 - ReplicaSet也需要
.spec
部分
bash
metadata:
name: frontend
4.2、Pod模板
.spec.template
是一个Pod模板,要求设置标签。在rs.yaml
示例中,我们指定了标签tier: frontend
。注意不要将标签与其他控制器的选择标签重叠,否则那些控制器会尝试收养此Pod。
bash
template:
metadata:
labels:
tier: frontend
- 对于模板的重启策略字段,
.spec.template.spec.restartPolicy
,唯一允许的取值是Always
,这也是默认值。
bash
spec:
template:
spec:
imagePullPolicy: IfNotPresent
4.3、Pod选择标签
.spec.selector
字段是一个标签选择算符。如前文中所讨论的,这些是用来标识要被获取的Pod的标签。在签名的rs.yaml
示例中,选择算符为:- 在ReplicaSet中,
.spec.template.metadata.labels
的值必须与spec.selector
值相匹配,是否该配置会被API拒绝
bash
matchLabels:
tier: frontend
metadata:
labels:
tier: frontend
4.4、ReplicaSet扩缩容
- 你可以通过设置
.spec.replicas
来指定要同时运行的Pod的个数。 - ReplicaSet创建、删除Pod以与此值匹配
- 如果你没有指定
.spec.replicas
,那么默认值为1,也就是容器1个Pod
bash
spec:
# 按照你的实际情况修改副本数
replicas: 3
4.5、删除ReplicaSet
bash
[root@master ~]# kubectl delete -f rs.yaml
4.6、只删除ReplicaSet
- 你可以只删除ReplicaSet而不影响它的各个Pod,方法是使用
kubectl delete
命令并设置--cascade=orphan
选项
bash
[root@master ~]# kubectl delete rs frontend --cascade=orphan -n nginx-latest
- 查看ReplicaSet将看到如下内容
bash
[root@master ~]# kubectl get rs -n nginx-latest
- 查看Pod是否被连着ReplicaSet一起删除
- 由此可见,我们删除了ReplicaSet控制器,但是它所管理的Pod并没有被删除。
bash
[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