RC:ReplicationController
ReplicationController,简称RC。作为K8s中的一种资源,其可确保在任何时候都有指定数量的Pod副本处于运行状态。当Pod 数量过多时,ReplicationController会终止多余的Pod;当Pod数量太少时,ReplicationController将会启动新的Pod来维持所需的副本数量。 ReplicationController是Kubernetes中一种经典的资源控制器,用于管理和持续监控Pod副本的数量。
ReplicationController通过指定一个副本数量(Replica)来确保在集群中始终运行指定数量的Pod副本。当Pod发生故障或从集群中删除时,ReplicationController会自动启动新的Pod副本以替代它们,以保持指定数量的Pod副本。
除了确保Pod副本数量的稳定性外,ReplicationController还负责实现水平扩展和自动伸缩。通过调整ReplicationController中指定的副本数量,可以实现Pod的自动伸缩,以满足流量负载的变化。
ReplicationController是Kubernetes早期版本中的概念,后续版本中逐渐被Deployment所取代。尽管如此,理解和了解ReplicationController仍然是很有用的,因为它是Deployment的基础组件之一。
创建ReplicationController (RC) 的方式是通过使用 YAML 配置文件进行定义。下面是一个示例的 YAML 配置文件:
yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: my-kubia-rc-1
spec:
replicas: 3
selector:
app: my-kubia
template:
metadata:
labels:
app: my-kubia
spec:
containers:
- name: my-kubia-1
image: luksa/kubia
ports:
- containerPort: 8080
protocol: TCP
通过运行 kubectl create
命令来创建 RC 资源,并使用以下命令查看 RC 资源:
bash
# 查看 RC 资源
kubectl get rc
通过这个命令,您将能够看到根据配置文件创建的三个 Pod 副本的效果。
如果将名为 my-kubia-rc-1-2fs96
的 Pod 的标签信息修改为 app=my-foo
,这样就会导致 app=my-kubia
标签的 Pod 数量少于 ReplicationController 期望的 Pod 副本数量。因此,ReplicationController 会自动创建一个新的 Pod,其名称可能为 my-kubia-rc-1-q9fwm
。
ReplicationController 会根据 selector 标签选择器来管理其所属的 Pod。为了确保 RC 能够管理正确的 Pod,RC 的配置文件中的 selector 标签选择器必须与 Pod 模板中的标签信息一致。这样 RC 才能识别出哪些 Pod 属于它所管理的副本集。
请注意,当使用 RC 进行 Pod 管理时,确保 selector 标签选择器和 Pod 模板的标签信息保持一致,以避免出现意外的 Pod 创建行为。
可以通过修改 ReplicationController (RC) 中的 replicas
字段的值来实现水平缩放(横向扩展) Pod 的副本数量。
您可以使用以下命令来编辑 RC 的配置:
xml
kubectl edit rc <RC的名称>
将会打开一个编辑器(如 Vim 编辑器),可以在其中修改 RC 的配置。找到 spec.replicas
字段,并将其值修改为您期望的副本数量,比如 5。
保存并关闭编辑器后,RC 将会自动更新,并开始根据新的副本数量进行扩展。这意味着系统将启动额外的 Pod,以使总副本数量达到所设置的值(例如,5个)。
在修改之后,可以通过运行以下命令来验证 Pod 的数量是否已经成功扩容到所需的数量:
arduino
kubectl get pod
将看到新启动的 Pod 数量已经达到了您设置的值(5个)的效果。
此外,还可以通过kubectl scale命令实现对RC中replicas字段的值修改
ini
# 将指定RC期望的Pod副本数 设置为 指定值
kubectl scale rc <RC的名称> --replicas=<Pod的副本数>
删除RC
当我们直接删除RC时,其相应的Pod也会全部被自动删除。事实上,kubectl会先将RC缩放为0并等待,以便在删除RC自身之前先删除全部Pod
perl
# 删除RC
kubectl delete rc <RC的名称>
RS:ReplicaSet
ReplicaSet(RS)可以被视为对 ReplicationController(RC)的升级。ReplicaSet 是用于在 Kubernetes 集群中管理 Pod 副本数量的控制器。
与 RC 类似,RS 也具有类似的功能,比如指定 Pod 副本数量,自动替换由于故障导致的 Pod 终止,以及根据标签选择器来管理 Pod。
然而,相比于 RC,RS 具有一些扩展功能和增强的选择器表达式。RS 支持更强大的选择器,可以使用集合操作符(如 in
、notIn
、exists
、doesNotExist
)来指定更复杂的标签选择条件。此外,RS 还增加了对弹性伸缩和滚动更新的支持。
当需要使用更复杂的标签选择器、进行滚动更新或应对高伸缩需求时,推荐使用 ReplicaSet。对于简单的副本管理,仍然可以使用 ReplicationController。
从 Kubernetes 1.18 版本开始,建议使用 Deployment 资源来管理 Pod 副本,而不是直接使用 ReplicaSet 或 ReplicationController。Deployment 是一个更高级别的控制器,用于对 Pod 进行声明式的、滚动的更新和回滚操作。
创建RS
我们可以通过Yaml配置文件创建RS,如下所示
yaml
# 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副本
标签选择器
RS 的 matchExpressions 标签选择器相比于 RC 的 matchLabels 选择器更加灵活和强大。matchExpressions 选择器支持更多的运算符,可以定义更复杂的标签选择条件。
下面是对不同运算符的示例说明:
-
Exists 运算符:
-
Pod 需要包含指定名称的标签,而不论该标签的值是什么。
-
示例:
yamlspec: selector: matchExpressions: - operator: Exists key: company
-
-
DoesNotExist 运算符:
-
Pod 不得包含指定名称的标签,而不论该标签的值是什么。
-
示例:
yamlspec: selector: matchExpressions: - operator: DoesNotExist key: company
-
-
In 运算符:
-
Pod 包含指定名称的标签,并且该标签的值必须与指定的 values 中的至少一个相匹配。
-
示例:
yamlspec: selector: matchExpressions: - operator: In key: company values: - Apple - LinkedIn
-
-
NotIn 运算符:
-
Pod 要么不存在指定名称的标签,要么存在指定名称的标签,但该标签的值与所有指定的 values 均不匹配。
-
示例:
yamlspec: selector: matchExpressions: - operator: NotIn key: company values: - Apple - LinkedIn
-
当使用 matchExpressions 选择器时,如果指定了多个表达式,它们之间的关系是 "与"(AND)关系。也就是说,所有表达式的结果都必须为 true,才能使标签选择器与 Pod 匹配。类似地,在使用 matchExpressions 选择器和 matchLabels 选择器时,它们之间的关系也是 "与"(AND)关系。