Kubernetes工作负载资源之RC、RS

这里将介绍Kubernetes工作负载资源中的RC、RS

abstract.png

RC:ReplicationController

ReplicationController,简称RC。作为K8s中的一种资源,其可确保在任何时候都有指定数量的Pod副本处于运行状态。当Pod 数量过多时,ReplicationController会终止多余的Pod;当Pod数量太少时,ReplicationController将会启动新的Pod

创建RC

我们可以通过Yaml配置文件创建RC,如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: v1
# 资源类型
kind: ReplicationController
metadata:
# RC名称
name: my-kubia-rc-1
spec:
# Pod副本数量
replicas: 3
# 标签选择器
selector:
app: my-kubia
# Pod模板
template:
metadata:
# 标签信息
labels:
app: my-kubia
spec:
# 容器信息
containers:
- name: my-kubia-1
image: luksa/kubia
# 仅用于展示容器所使用的端口
ports:
- containerPort: 8080
protocol: TCP

利用kubectl create命令创建RC资源,并可以利用下述命令查看

1
2
# 查看RC资源
kubectl get rc

效果如下所示,可以看到该RC会根据配置文件自动创建3个Pod副本

figure 1.jpeg

RC创建的Pod并不是直接绑定到RC上的。RC是通过标签选择器来管理其下所属的Pod。故在RC的配置文件中,必须保证selector标签选择器与Pod模板中的标签信息相匹配,否则会导致RC无休止的创建Pod。下面我们将名为my-kubia-rc-1-2fs96的Pod的标签信息修改为app=my-foo。此时由于满足app=my-kubia标签的Pod数 少于 RC所期望的Pod副本数。故RC会再次自动创建一个Pod。如下名为my-kubia-rc-1-q9fwm的Pod所示

figure 2.jpeg

水平缩放

可以通过修改RC中replicas字段的值,实现动态调整Pod副本的数量。具体地,执行下述命令,打开Vim编辑器后修改spec.replicas字段值为5

1
kubectl edit rc <RC的名称>

效果如下所示,Pod的数量已经扩容为5个

figure 3.jpeg

此外,还可以通过kubectl scale命令实现对RC中replicas字段的值修改

1
2
# 将指定RC期望的Pod副本数 设置为 指定值
kubectl scale rc <RC的名称> --replicas=<Pod的副本数>

效果如下所示

figure 4.jpeg

删除RC

当我们直接删除RC时,其相应的Pod也会全部被自动删除。事实上,kubectl会先将RC缩放为0并等待,以便在删除RC自身之前先删除全部Pod

1
2
# 删除RC
kubectl delete rc <RC的名称>

效果如下所示

figure 5.jpeg

如果期望只删除RC自身,而不删除相应的Pod。可在删除时使用 —cascade=orphan 选项

1
2
# 只删除RC自身,而不删除相应的Pod
kubectl delete rc my-kubia-rc-1 --cascade=orphan

效果如下所示

figure 6.jpeg

RS:ReplicaSet

ReplicaSet简称RS。其与RC的功能基本一致,可以将其视为对RC的升级

创建RS

我们可以通过Yaml配置文件创建RS,如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# API组、版本
apiVersion: apps/v1
# 资源类型
kind: ReplicaSet
metadata:
# RS名称
name: my-kubia-rs-3
spec:
# 副本数量
replicas: 5
# 标签选择器
selector:
# matchLabels 选择器
matchLabels:
company: Microsoft
# Pod 模板
template:
metadata:
# 标签信息
labels:
company: Microsoft
spec:
# 容器信息
containers:
- name: my-kubia-3
image: luksa/kubia
# 仅用于展示容器所使用的端口
ports:
- containerPort: 8080
protocol: TCP

效果如下所示,可以看到该RS会根据配置文件自动创建5个Pod副本

figure 7.jpeg

标签选择器

RS相比较于RC,主要的改进是它更具表现力的标签选择器。上文的示例我们使用了等值条件的matchLabels选择器。这里我们介绍下RS的matchExpressions标签选择器,其支持更丰富的运算符

1. Exists

1
2
3
4
5
6
7
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 需要包含指定名称的标签, 不论该标签的值
- operator: Exists
key: company

2. DoesNotExist

1
2
3
4
5
6
7
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 不得包含指定名称的标签, 不论该标签的值
- operator: DoesNotExist
key: company

3. In

1
2
3
4
5
6
7
8
9
10
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 包含指定名称的标签, 且该标签的值必须与其中一个指定的values匹配
- operator: In
key: company
values:
- Apple
- LinkedIn

4. NotIn

1
2
3
4
5
6
7
8
9
10
11
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 要么 不存在指定名称的标签,
# 要么 存在指定名称的标签,但该标签的值与所有指定的values均不匹配
- operator: NotIn
key: company
values:
- Apple
- LinkedIn

此外如果使用matchExpressions选择器指定了多个表达式时,则各表达式间的关系为and与。即所有表达式的结果都必须为true,才能使标签选择器与Pod匹配。类似地,如果同时使用matchExpressions选择器、matchLabels选择器,则二者的关系也是and与

参考文献

  1. Kubernetes in Action中文版 Marko Luksa著
  2. 深入剖析Kubernetes 张磊著
0%