ReplicaSet
Last updated
Was this helpful?
Last updated
Was this helpful?
ReplicaSet是ReplicationController的替代资源,所以以后优先使用ReplicaSet,不要使用ReplicationController。
通常我们也不会直接创建ReplicaSet,而是创建资源,由Deployment间接创建ReplicaSet来接管Pod。
两者顾名思义,都是用来负责管理Pod副本的,所以ReplicaSet拥有ReplicationController的所有功能。
ReplicaSet与ReplicationController两者的最大的差别在于标签匹配,RS具有更高级的标签选择器,功能比RC更强大。
例如,RC只能匹配包含某个具体标签的Pod(env=test
和env=prod
只能匹配其中一组),而RS可以仅根据标签的键进行匹配(相当于env=*
)。不仅如此,RS配合标签匹配表达式,能够实现更为复杂的标签匹配规则。
使用YAML配置文件创建该资源,在该资源文件中,需要关注的主要有以下三个部分:
spec.replicas
:Pod实例的副本数;
spec.selector
:标签选择器,决定匹配的带有哪些标签的Pod。
spec.selector.matchLabels
:可以用来匹配标签,与RC中的类似;
spec.selector.matchExpressions
:利用匹配表达式,可以实现更为复杂的匹配规则;
spec.template
:创建新Pod所用的模板;
下面展示一个具体的例子:
通过kubectl get rs
可以看到创建出来的RS资源的名字为kubia
,再通过kubectl get pods
可以看到创建出来的Pods的名字为kubia-xxxx
(xxxx为自动生成的值)。
Tips:在创建完成RS后,若想修改其spec.selector
,会报field is immutable
错误,这是因为一旦创建完,是不允许用户修改标签选择器的。所以只能将该RS删除,修改之后,再重新创建一个新的RS资源。
在上面的例子中,我们看到可以通过spec.selector.matchExpressions
使用标签匹配表达式进行标签匹配。
matchExpressions
是一个列表,列表中的每一个元素有三个主要内容:
key
:对应标签中的键;
values
:对应标签中的值,是一个列表,表示可以对应多个值(根据operator
的不同,该字段不一定需要指定);
operator
:运算符,不同的运算符对应了不同的功能:
In
:匹配那些标签的值在values
列表中的Pod;
NotIn
:匹配那些标签的值不在values
列表中的Pod;
Exists
:匹配那些标签的键与key
相同的Pod,不需要指定values
字段;
DoesNotExist
:匹配那些标签的键与key
不相同的Pod,不需要指定values
字段;
可以通过三种方式更新:
修改RS的YAML配置文件中的spec.replicas
字段:
通过kubectl edit
命令在线修改RS的YAML配置文件;
直接修改RS的配置文件,然后通过kubectl apply -f
使之生效;
通过kubectl scale
命令修改。例如将kubia这个RS的副本数调整为10:
水平缩放是声明式的,即告诉Kubernetes目标副本数为x,而不告诉它该如何做,只是指定期望状态。
直接使用kubectl delete
不仅仅会删除RS,同时会删除被其接管的Pod。例如删除名为kubia这个RS:
加上--cascade=false
可以在删除RS的同时,不删除被其接管的Pod。例如删除名为kubia这个RS的同时,不删除被其接管的Pod: