目录在这里嗷~,如有问题请私信我进行修改~
- 概述
- ReplicaSet的作用
- ReplicaSet资源配置文件详解
- 创建ReplicaSet
- 验证ReplicaSet的副本管理
- 验证Replicaset的扩缩容
- Replicaset的标签选择器
- 管理Replicaset
概述
ReplicaSet
简称rs
,其主要作用和ReplicationController
一样,保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。
相较于ReplicationController而言,ReplicaSet更加轻量级,且功能更强大,支持正则匹配Pod。
想要学习ReplicationController可以查看这篇文章:K8s新手系列之ReplicationController资源
ReplicaSet的作用
-
副本管理:ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。
-
集群扩容和缩容:用户可以通过修改 ReplicaSet 中的副本数量来轻松地对应用进行扩容或缩容。
-
灵活的标签选择器
-
集合式选择器:与 ReplicationController 仅支持等式选择器不同,ReplicaSet 支持更灵活的集合式选择器,如 in、notin、exists 等。这使得 ReplicaSet 能够更精确地选择要管理的 Pod,提高了标签选择的灵活性和表达能力。
-
动态匹配 Pod:通过标签选择器,ReplicaSet 可以动态地匹配符合条件的 Pod。即使在 ReplicaSet 创建之后,只要有新的 Pod 被创建且其标签符合 ReplicaSet 的选择器,这些 Pod 就会被纳入 ReplicaSet 的管理范围。
-
ReplicaSet资源配置文件详解
可以通过kubectl explain rs
查看创建ReplicaSet需要的字段
示例:
[root@node01 ~]# kubectl explain rs | |
KIND: ReplicaSet | |
VERSION: apps/v1 | |
DESCRIPTION: | |
ReplicaSet ensures that a specified number of pod replicas are running at | |
any given time. | |
# fileds字段中的内容已进行截取 | |
FIELDS: | |
apiVersion <string> | |
kind <string> | |
metadata <Object> | |
spec <Object> | |
status <Object> |
通过上述可以发现定义ReplicaSet的资源文件和定义Pod一样,也需要apiVersion、kind、metadata、spec等字段。
但是spec字段中有三个字段,需要注意,分别是replicas、selector、template。如下:
[root@node01 ~]# kubectl explain rs.spec | |
KIND: ReplicaSet | |
VERSION: apps/v1 | |
RESOURCE: spec <Object> | |
DESCRIPTION: | |
Spec defines the specification of the desired behavior of the ReplicaSet. | |
More info: | |
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status | |
ReplicaSetSpec is the specification of a ReplicaSet. | |
FIELDS: | |
minReadySeconds <integer> | |
# minReadySeconds 规定了一个时间阈值,只有当 Pod 保持就绪状态的时间达到或者超过这个阈值,并且在此期间 Pod 内的任何容器都没有崩溃,这个 Pod 才会被视为可用。 | |
replicas <integer> | |
# 定义Pod的副本数量 | |
selector <map[string]string> | |
# 标签选择器,这里指定Pod定义的标签 | |
template <Object> | |
# 定义Pod的模板 |
创建ReplicaSet
这里我们创建三个Pod副本
示例:
# 定义资源文件 | |
[root@node01 ~/rs]# cat rs-nginx.yaml | |
apiVersion: apps/v1 | |
kind: ReplicaSet | |
metadata: | |
name: rs-nginx-1 | |
namespace: default | |
labels: | |
app: rs-nginx | |
spec: | |
# 定义Pod的副本数量 | |
replicas: 3 | |
# 标签选择器,这里和Pod的Label保持一致 | |
selector: | |
# 匹配Pod的Label | |
matchLabels: | |
app: nginx | |
# 定义Pod的模板,只需要定义metadata和spec两个字段即可 | |
template: | |
metadata: | |
name: pod-nginx | |
labels: | |
app: nginx | |
spec: | |
restartPolicy: Always | |
containers: | |
- name: nginx | |
image: nginx:latest | |
# 创建ReplicaSet | |
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml |
查看对应的ReplicaSet和Pod
查看ReplicaSet
[root@node01 ~/rs]# kubectl get rs | |
NAME DESIRED CURRENT READY AGE | |
rs-nginx-1 3 3 3 93s |
查看Pod
[root@node01 ~/rs]# kubectl get po | grep rs-nginx | |
rs-nginx-1-6rb9p 1/1 Running 0 2m | |
rs-nginx-1-ssdhv 1/1 Running 0 2m | |
rs-nginx-1-vzn2x 1/1 Running 0 2m |
验证ReplicaSet的副本管理
ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。
当我们删除创建好的Pod时,Replicaset会发生什么呢?
# 删除上面创建的所有Pod | |
[root@node01 ~/rs]# kubectl delete po rs-nginx-1-6rb9p rs-nginx-1-ssdhv rs-nginx-1-vzn2x | |
pod "rs-nginx-1-6rb9p" deleted | |
pod "rs-nginx-1-ssdhv" deleted | |
pod "rs-nginx-1-vzn2x" deleted | |
# 查看rs,发现其副本数量还是3个 | |
[root@node01 ~/rs]# kubectl get rs | |
NAME DESIRED CURRENT READY AGE | |
rs-nginx-1 3 3 3 5m17s | |
# 查看Pod,发现对应的Pod还是3个,通过AGE字段发现是新创建的 | |
[root@node01 ~/rs]# kubectl get po | grep rs-nginx | |
NAME READY STATUS RESTARTS AGE | |
rs-nginx-1-6h7fv 1/1 Running 0 22s | |
rs-nginx-1-fhkm9 1/1 Running 0 22s | |
rs-nginx-1-l5njb 1/1 Running 0 22s |
验证Replicaset的扩缩容
验证扩容
我们将rs的副本数量调整成5,看看会发生什么?
[root@node01 ~/rs]# cat rs-nginx.yaml | |
apiVersion: apps/v1 | |
kind: ReplicaSet | |
metadata: | |
name: rs-nginx-1 | |
namespace: default | |
labels: | |
app: rs-nginx | |
spec: | |
# 将副本数量修改成5 | |
replicas: 5 | |
selector: | |
matchLabels: | |
app: nginx | |
template: | |
metadata: | |
name: pod-nginx | |
labels: | |
app: nginx | |
spec: | |
restartPolicy: Always | |
containers: | |
- name: nginx | |
image: nginx:latest | |
# 重新应用它 | |
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml | |
replicaset.apps/rs-nginx-1 configured |
查看一下Pod的变化:
[root@node01 ~/rs]# kubectl get po | grep rs-nginx | |
NAME READY STATUS RESTARTS AGE | |
rs-nginx-1-6h7fv 1/1 Running 0 4m17s | |
rs-nginx-1-fhkm9 1/1 Running 0 4m26s | |
rs-nginx-1-l5njb 1/1 Running 0 4m26s | |
rs-nginx-1-t75z7 1/1 Running 0 8s | |
rs-nginx-1-tdvbr 1/1 Running 0 8s |
通过上述发现Pod副本数量由3个变成了5个,查看AGE字段,发现有两个Pod是新建的状态。
验证缩容
同理,我们将副本数量调整成1,看看会发生什么?
[root@node01 ~/rs]# cat rs-nginx.yaml | |
apiVersion: apps/v1 | |
kind: ReplicaSet | |
metadata: | |
name: rs-nginx-1 | |
namespace: default | |
labels: | |
app: rs-nginx | |
spec: | |
# 将Pod数量调整成1 | |
replicas: 1 | |
selector: | |
matchLabels: | |
app: nginx | |
template: | |
metadata: | |
name: pod-nginx | |
labels: | |
app: nginx | |
spec: | |
restartPolicy: Always | |
containers: | |
- name: nginx | |
image: nginx:latest | |
# 重新应用它 | |
[root@node01 ~/rs]# kubectl apply -f rs-nginx.yaml | |
replicaset.apps/rs-nginx-1 configured | |
查看一下:
# 查看rs | |
[root@node01 ~/rs]# kubectl get rs | |
NAME DESIRED CURRENT READY AGE | |
rs-nginx-1 1 1 1 11m | |
# 查看Pod | |
[root@node01 ~/rs]# kubectl get po | grep rs-nginx | |
rs-nginx-1-fhkm9 1/1 Running 0 6m33s |
通过上述发现,Pod的数量由5个缩减成1个
Replicaset的标签选择器
Replicaset的标签选择器分为两类,一类是等式选择器,另一类是集合选择器
等式选择器
等式选择器通过 =、==(两者含义相同)或者 != 来筛选标签。其通过spec.selector.matchLabels
来实现。
示例:
apiVersion: apps/v1 | |
kind: ReplicaSet | |
metadata: | |
name: rs-nginx-1 | |
namespace: default | |
labels: | |
app: rs-nginx | |
spec: | |
replicas: 1 | |
selector: | |
# 等式选择器 | |
matchLabels: | |
app: nginx | |
template: | |
metadata: | |
name: pod-nginx | |
labels: | |
app: nginx | |
spec: | |
restartPolicy: Always | |
containers: | |
- name: nginx | |
image: nginx:latest |
集合选择器
集合选择器借助 in、notin、exists、DoesNotExist 这些操作符来筛选标签。
- in:用于选取标签值在指定集合内的 Pod。
- notin:用于选取标签值不在指定集合内的 Pod。
- exists:用于选取具有指定标签的 Pod,不考虑标签的值。
- DoesNotExist:用于选取不具有指定标签的 Pod,不考虑标签的值。
其通过spec.selector.matchExpressions
来实现
示例:
apiVersion: apps/v1 | |
kind: ReplicaSet | |
metadata: | |
name: nginx-replicaset-set | |
spec: | |
replicas: 3 | |
selector: | |
# 集合选择器 | |
matchExpressions: | |
# key:指定Label的key,operator:表示操作符,value:表示Label的value | |
- {key: app, operator: In, values: [nginx]} | |
- {key: env, operator: NotIn, values: [development, testing]} | |
template: | |
metadata: | |
labels: | |
app: nginx | |
env: production | |
spec: | |
containers: | |
- name: nginx | |
image: nginx:1.14.2 | |
ports: | |
- containerPort: 80 |
管理Replicaset
查看Replicaset
语法:
kubectl get rs <rs-name> -n <namespace-name> |
示例:
[root@node01 ~/rs]# kubectl get rs | |
NAME DESIRED CURRENT READY AGE | |
rs-nginx-1 1 1 1 25m |
修改Replicaset
由两种方式,一种是通过kubectl edit rc <rc-name>
来进行修改,会打开一个类似vim
的界面,修改其对应的值即可,最后wq
保存即可应用你的配置.
另一种方式则是修改对应的资源文件,最后使用kubectl apply -f <file>
即可。
删除Replicaset
语法:
kubectl delete rc <rc-name> -n <namespace-name> |