持续创作,加速成长!这是我参与「掘金日新计划 · 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
我们可以删除一个pod, 在查看pod
我们看到 rs会主动维护副本数保持3个.
2) rs的选择器
rs 在标签选择器上,除了可以定义键值对的选择形式,还支持 matchExpressions 字段,可以提供多种选择。 目前支持的操作包括:
- In:label 的值在某个列表中
- NotIn:label 的值不在某个列表中
- Exists:某个 label 存在
- DoesNotExist:某个 label 不存在
下面来看看api中是如何定义的. 通过explain查看:
kubectl explain rs.spec.selector
这个选择器就是rs和rc的不同, rc只有k=v的全量匹配, 而rs有两种选择.
- 第一个是: matchExpressions. 这是一个表达式匹配, 值是一个对象. 来看看, 值可以怎么写.
kubectl explain rs.spec.selector.matchExpressions
他有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'}中的一个就匹配成功.