k8s RC 和 RS
介绍 k8s 中的 rs 和 rc,以及它们的常用命令。
Replication Controller
Replication Controller 的作用是持续监控正在运行的 pod 列表,并保证相应“类型”的 pod 数目与 期望相符。
所谓的类型就是通过标签选择器监控模版中指定标签的 pod 数量。
注意:在新版本中,k8s 的副本控制器是 Replica Set,它完全替代了 Replication Controller。
在 kubectl 命令中 Replication Controller 可简写为 rc,Replica Set 为 rs。
RC 的组成部分
rc 由三部分组成,标签选择器、副本数量 以及 模板:
- label selector(标签选择器),用于 ReplicationController 作用域中有哪些 pod
- replica conut (副本个数),指定应运行的 pod 数量
- pod template(pod 模版),用于创建新的 pod 副本
注意点:
1. rc 的标签选择器、副本个数和 pod 模版都可以随时修改,但是只有副本数目的变更会影响现有的 pod。
意思是,如果只改变 rc 的标签选择器和 pod 模版,会发现现有的 pod 不会发生改变。如果增加了 pod 数量,在新增的 pod 上,rc 新的标签选择器和 pod 模版才会生效。zh
2. 修改了 pod 标签、pod就会脱离 rc 控制,然后 rc 会新建一个 pod。
但为 pod 添加新标签不会影响 rc 对 pod 的管理。
人话就是,rc 是通过标签选择器来控制 pod,如果 pod 的标签不在 rc 的控制下,pod 就脱离了 rc,变成了一个普通的 pod。 但给 pod 添加新标签,那以往的标签还在,rc 还能控制它,所以不影响 rc 对 pod 的管理。
3. 集群节点发生故障时, 它将为 故障节点 上运行的所有 pod (即受 ReplicationController 控制的节点上的那些 pod) 创建替代副本。
这个也很容易理解,节点故障 对于正常节点来说,与删除了该节点上的所有 pod 的效果是一致的。
相关操作
首先,看一下 rc 的配置文件:
vi rc.yaml
apiVersion: v1
kind: ReplicationController -- 资源类型选 rc
metadata:
name: asdf
spec:
replicas: 2
selector: -- pod 选择器决定了 RC 的操作对象
app: pay
template: -- pod 模版
metadata:
labels:
app: pay
pod-template-hash: c6f6fdd
spec:
containers:
- name: app1
image: luksa/asfd
ports: 8090
编辑副本控制器
kubectl edit rc rc-name -n namespace
通过更改副本控制器可以完成以下任务:
- 扩缩 pod 数量
- 更改 pod 标签
- 更改 副本编辑器 的标签选择器
- 更改 pod 模版
上面也说过,如果更改了 pod 标签和模板,它只会在新生成的 pod 中做出改变,并且不会影响你已经存在的 pod 。
pod 扩容/缩容
方式一:
kubectl scale rc rc-name --replicas=8
方式二:
kubectl edit rc rc-name
查看控制器
kubectl get rc
NAME DESIRED CURRENT READY AGE
adsf 8 8 4 10m
删除副本控制器
#如果不加 --cascade=false 那么就会连同 pod 也一起删除
kubectl delete rc rc-name --cascade=false
将 pod 移入或移出 ReplicationController 的作用域
rc 创建的 pod 并不是直接绑定到 rc。rc 只管理与标签选择器匹配的 pod。
因此,通过更改 pod 标签,可以将 pod 从 rc 的作用域中添加或删除。甚至可以从一个 rc 移动到另一个 rc。
ReplicaSet 与 ReplicationController 的比较
RS 的行为与 RC 完全相同,但 RS 对于 pod 选择器的表达能力更强。
RC 的标签选择器只允许包含某个标签的匹配 pod,但 ReplicaSet 的选择器还允许匹配缺少某个标签的 pod,或包含特定标签名的 pod,不管其值如何。
例如: 单个 RC 无法将 pod 与标签 env-prd 与 env=dev 同时匹配,它只能匹配带有 env=devel 标签的 pod 或带有 env = prd 标签的 pod。但是,一个 RS 可以匹配两组 pod 并将它们视为一个大组。
同样的,无论 RC 的值如何,RC 都无法仅基于标签名来匹配 pod,而 RS 可以。例如 RS 可以匹配所有包含名为 env 标签的 pod(可以理解为 env=*)
ReplicaSet
查看一下创建 rs 的描述文件:
apiVersion: apps/v1beta2 # RS 不是 v1 版本 API 的一部分,但属于 apps VPI 组的 v1beta2 版本
kind: ReplicaSet
metadata:
name: kubia
spec:
replicas: 3
selector: # 这里使用了 matchLabels 选择器,类似于 RC 的选择器
matchLabels:
app: kubia
template: # 该模版与 RC 中相同
metadata:
app: kubia
spec:
containers:
- name: kubia
image: luksa/kubia
注意点: ReplicaSet 不是 V1 API 的一部分,因此需要确保在创建资源时指定正确的 apiVersion。
RS 资源内容与之前创建的 RC 的内容大致相同。唯一区别:不必在 selector 属性中直接列出 pod 需要的标签,而是在 selector.matchLabels 下指定它们。
其他操作
与 rc 命令格式相似,只是资源名由 rc 变成 rs 即可。
RS 的标签选择器
RS 相较于 RC 的主要改进是它更具表达力的标签选择器
...
selector:
matchExpressions:
- key: app <-- 选择器要求 pod 要包含名为 app 的标签
operator: In <-- 标签值必须是 kubia
values:
- kubia
...
可以给选择器添加额外的表达式,运算符有以下四个:
In: Label 的值必须与其中一个指定的values匹配
NotIn: Lable 的值与任何指定的values不匹配
Exists: Pod 必须包含一个指定名称的标签,使用此运算符时,不应指定values字段。
DoesNotExist: Pod 不得包含有指定名称的标签。values属性不得指定
如果指定了多个表达式,则所有这些表达式都必须为 true才使选择器与 pod 匹配。
如果同时指定 matchLabels 和 matchExpressions ,则所有标签都必须匹配,并且所有表达式必须计算为 true 以使该 pod 与选择器 匹配。
END
不过,在 k8s 中,我们一般不直接用 rs 或者 rc,都是使用在其基础上封装的 deployment 的。
更多推荐
所有评论(0)