这里将介绍Kubernetes工作负载资源中的RC、RS
RC:ReplicationController
ReplicationController,简称RC。作为K8s中的一种资源,其可确保在任何时候都有指定数量的Pod副本处于运行状态。当Pod 数量过多时,RC会终止多余的Pod;当Pod数量太少时,RC将会启动新的Pod
创建RC
我们可以通过Yaml配置文件创建RC,如下所示
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资源,并可以利用下述命令查看
# 查看RC资源
kubectl get rc
效果如下所示,可以看到该RC会根据配置文件自动创建3个Pod副本
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所示
水平缩放
可以通过修改RC中replicas字段的值,实现动态调整Pod副本的数量。具体地,执行下述命令,打开Vim编辑器后修改spec.replicas字段值为5
kubectl edit rc <RC的名称>
效果如下所示,Pod的数量已经扩容为5个
此外,还可以通过kubectl scale命令实现对RC中replicas字段的值修改
# 将指定RC期望的Pod副本数 设置为 指定值
kubectl scale rc <RC的名称> --replicas=<Pod的副本数>
效果如下所示
删除RC
当我们直接删除RC时,其相应的Pod也会全部被自动删除。事实上,kubectl会先将RC缩放为0并等待,以便在删除RC自身之前先删除全部Pod
# 删除RC
kubectl delete rc <RC的名称>
效果如下所示
如果期望只删除RC自身,而不删除相应的Pod。可在删除时使用 –cascade=orphan 选项
# 只删除RC自身,而不删除相应的Pod
kubectl delete rc my-kubia-rc-1 --cascade=orphan
效果如下所示
RS:ReplicaSet
ReplicaSet简称RS。其与RC的功能基本一致,可以将其视为对RC的升级
创建RS
我们可以通过Yaml配置文件创建RS,如下所示
# 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相比较于RC,主要的改进是它更具表现力的标签选择器。上文的示例我们使用了等值条件的matchLabels选择器。这里我们介绍下RS的matchExpressions标签选择器,其支持更丰富的运算符
「1. Exists」
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 需要包含指定名称的标签, 不论该标签的值
- operator: Exists
key: company
「2. DoesNotExist」
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 不得包含指定名称的标签, 不论该标签的值
- operator: DoesNotExist
key: company
「3. In」
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 包含指定名称的标签, 且该标签的值必须与其中一个指定的values匹配
- operator: In
key: company
values:
- Apple
- LinkedIn
「4. NotIn」
spec:
# 标签选择器
selector:
matchExpressions:
# Pod 要么 不存在指定名称的标签,
# 要么 存在指定名称的标签,但该标签的值与所有指定的values均不匹配
- operator: NotIn
key: company
values:
- Apple
- LinkedIn
此外如果使用matchExpressions选择器指定了多个表达式时,则各表达式间的关系为and与。即所有表达式的结果都必须为true,才能使标签选择器与Pod匹配。类似地,如果同时使用matchExpressions选择器、matchLabels选择器,则二者的关系也是and与
参考文献
-
Kubernetes in Action中文版 Marko Luksa著 -
深入剖析Kubernetes 张磊著
原文始发于微信公众号(青灯抽丝):Kubernetes工作负载资源之RC、RS
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/42053.html