k8s RC 和 RS

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

通过更改副本控制器可以完成以下任务:

  1. 扩缩 pod 数量
  2. 更改 pod 标签
  3. 更改 副本编辑器 的标签选择器
  4. 更改 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。
 

ReplicaSetReplicationController 的比较

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 的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值