ReplicaSet

ReplicaSet是ReplicationController的替代资源,所以以后优先使用ReplicaSet,不要使用ReplicationController

通常我们也不会直接创建ReplicaSet,而是创建Deployment资源,由Deployment间接创建ReplicaSet来接管Pod。

ReplicaSet与ReplicationController差别

两者顾名思义,都是用来负责管理Pod副本的,所以ReplicaSet拥有ReplicationController的所有功能。

ReplicaSet与ReplicationController两者的最大的差别在于标签匹配,RS具有更高级的标签选择器,功能比RC更强大。

例如,RC只能匹配包含某个具体标签的Pod(env=testenv=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为自动生成的值)。

matchExpressions标签匹配表达式

在上面的例子中,我们看到可以通过spec.selector.matchExpressions使用标签匹配表达式进行标签匹配。

matchExpressions是一个列表,列表中的每一个元素有三个主要内容:

  • key:对应标签中的

  • values:对应标签中的,是一个列表,表示可以对应多个(根据operator的不同,该字段不一定需要指定);

  • operator:运算符,不同的运算符对应了不同的功能:

    • In:匹配那些标签的values列表中的Pod;

    • NotIn:匹配那些标签的不在values列表中的Pod;

    • Exists:匹配那些标签的key相同的Pod,不需要指定values字段

    • DoesNotExist:匹配那些标签的key不相同的Pod,不需要指定values字段

Tips:

  1. 如果有多个matchExpressions,则必须匹配了所有的选择器的Pod才能被接管;

  2. 如果同时指定了matchLabelsmatchExpressions,则同样匹配所有的选择器的Pod才能被接管;

通过kubectl get rs -o wide可以看到其SELECTOR一列匹配的标签。

水平缩放

可以通过三种方式更新:

  1. 修改RS的YAML配置文件中的spec.replicas字段:

    • 通过kubectl edit命令在线修改RS的YAML配置文件;

    • 直接修改RS的配置文件,然后通过kubectl apply -f使之生效;

  2. 通过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?