ReplicaSet
ReplicaSet是ReplicationController的替代资源,所以以后优先使用ReplicaSet,不要使用ReplicationController。
通常我们也不会直接创建ReplicaSet,而是创建Deployment资源,由Deployment间接创建ReplicaSet来接管Pod。
ReplicaSet与ReplicationController差别
两者顾名思义,都是用来负责管理Pod副本的,所以ReplicaSet拥有ReplicationController的所有功能。
ReplicaSet与ReplicationController两者的最大的差别在于标签匹配,RS具有更高级的标签选择器,功能比RC更强大。
例如,RC只能匹配包含某个具体标签的Pod(env=test
和env=prod
只能匹配其中一组),而RS可以仅根据标签的键进行匹配(相当于env=*
)。不仅如此,RS配合标签匹配表达式,能够实现更为复杂的标签匹配规则。
创建ReplicaSet
使用YAML配置文件创建该资源,在该资源文件中,需要关注的主要有以下三个部分:
spec.replicas
:Pod实例的副本数;spec.selector
:标签选择器,决定匹配的带有哪些标签的Pod。spec.selector.matchLabels
:可以用来匹配标签,与RC中的类似;spec.selector.matchExpressions
:利用匹配表达式,可以实现更为复杂的匹配规则;
spec.template
:创建新Pod所用的模板;
下面展示一个具体的例子:
apiVersion: apps/v1 # 注意版本,老版的K8s可能在 apps/v1beta2 中,可以用 kubectl explain replicaset来确认此处的版本
kind: ReplicaSet
metadata:
name: kubia
spec:
replicas: 3
selector: # (必须)注意与RC不同,这里的selector下面还有两种可选的标签选择器
matchLabels: # 这种是比较普通的,与RC类似,直接匹配指定的标签键值
app: kubia
matchExpressions: # 这种更富表达力,可将标签的键值分开匹配
- key: app # 必须有一个名为app的标签
operator: In # app标签的值是value中的任意一个
value:
- kubia # 标签的值为"kubia"(由于value只有一个,所以相当于匹配app: kubia标签)
template: # Pod的模板
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: luksa/kubia
通过kubectl get rs
可以看到创建出来的RS资源的名字为kubia
,再通过kubectl get pods
可以看到创建出来的Pods的名字为kubia-xxxx
(xxxx为自动生成的值)。
Tips:在创建完成RS后,若想修改其spec.selector
,会报field is immutable
错误,这是因为一旦创建完,是不允许用户修改标签选择器的。所以只能将该RS删除,修改之后,再重新创建一个新的RS资源。
matchExpressions标签匹配表达式
在上面的例子中,我们看到可以通过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:kubectl scale rs kubia --replicas=10
水平缩放是声明式的,即告诉Kubernetes目标副本数为x,而不告诉它该如何做,只是指定期望状态。
删除ReplicaSet
同时删除接管的Pod
直接使用kubectl delete
不仅仅会删除RS,同时会删除被其接管的Pod。例如删除名为kubia这个RS:
kubectl delete rs kubia
不删除接管的Pod
加上--cascade=false
可以在删除RS的同时,不删除被其接管的Pod。例如删除名为kubia这个RS的同时,不删除被其接管的Pod:
kubectl delete rs kubia --cascase=false
Last updated
Was this helpful?