【k8s系列十一】k8s控制器 之 ReplicaSet

107 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

ReplicaSet

ReplicaSet, 简称RS. 在新版本的 Kubernetes 中建议使用 rs 来取代 rc 。rs 跟 rc 没有本质的不同,只是名字不一样,并且 rs 支持集合式的 selector;

1) rs控制器案例

第一步: 创建资源清单

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-controller
  namespace: chapter08
spec:
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      namespace: chapter08
      labels:
        tier: frontend
    spec:
      containers:
        - name: myapp
          image: wangyanglinux/myapp:v1
          env:
            - name: GET_HOSTS_FROM
              value: dns
          ports:
            - containerPort: 80

资源清单解析:

  • 首先明确这时要创建一个ReplicaSet类型的控制器, 控制器的名字是rs-controller.

  • spec是这个控制器的期望

    • replicas:期望这个rs控制器有三个pod副本
    • selector: 指定控制器的选择器. 这里指定控制器是以匹配标签类型. 匹配的关键字是tier: frontend. 如果不知道这个标签怎么用,可以通过命令查看. kubectl explain rs.spec.selector, 具体含义看下面的描述。这里要匹配的标签是tier=frontend. 也就是匹配k-v是tier=frontend的pod, 并且维持pod的副本数是3.
    • 剩下的不说了, 和rc一样.

第二步: 创建rs

kubectl create -f rs-controller.yaml

image

我们可以删除一个pod, 在查看pod

image 我们看到 rs会主动维护副本数保持3个.

2) rs的选择器

rs 在标签选择器上,除了可以定义键值对的选择形式,还支持 matchExpressions 字段,可以提供多种选择。 目前支持的操作包括:

  • In:label 的值在某个列表中
  • NotIn:label 的值不在某个列表中
  • Exists:某个 label 存在
  • DoesNotExist:某个 label 不存在

下面来看看api中是如何定义的. 通过explain查看:

kubectl explain rs.spec.selector

image

这个选择器就是rs和rc的不同, rc只有k=v的全量匹配, 而rs有两种选择.

  • 第一个是: matchExpressions. 这是一个表达式匹配, 值是一个对象. 来看看, 值可以怎么写.
kubectl explain rs.spec.selector.matchExpressions

image

他有3个属性,

一个是key,必填的. key是选择器应用到的标签. 一个是operator操作符.必填. 这个操作符指定了key对应value的匹配关系. 可选值有In, NotIn, Exists 和 DoesNotExists. 一个是values, 操作符里的值. 这个值是一个字符串类型的数组. 如果操作符是In或者NotIn, 数组不能为空. 如果是Exists或者DoesNotExist, 数组必须是空.

  • 第二个是: matchLabels. 是k-v对的映射。 matchLabels 映射中的单个 {key,value} 相当于 matchExpressions 的一个元素,其key字段为“key”值,运算符为“In”,values 数组仅包含“value”值。

举个例子: 案例一:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-controller-2
spec:
  selector:
    matchExpressions:
      - key: app
        operator: Exists
  template:
    metadata:
      labels:
        app: spring-k8s
    spec:
      containers:
        - name: rs-c1
          image: wangyanglinux/myapp:v1
          ports:
            - containerPort: 80

这里定义了一个选择器, 使用的matchExpressions. 这是什么含义呢?

spec:
  selector:
    matchExpressions:
      - key: app
        operator: Exists

这个表示,当前要匹配的表达式key是app, operator是Exists. 表示只要key存在就匹配成功.

案例二:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-demo
spec:
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
        - spring-k8s
        - hahahah
  template:
    metadata:
      labels:
        app: spring-k8s
    spec:
      containers:
        - name: rs-c1
          image: wangyanglinux/myapp:v1
          ports:
            - containerPort: 80

这里定义的的选择器如下

spec:
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
        - spring-k8s
        - hahahah

这个是什么意思呢? 它要求匹配的pod的key必须是app, 而value在{'spring-k8s', 'hahahah'}中的一个就匹配成功.