k8s 副本控制器(Replication Controller&Replica Set)
Replication Controller
介绍
Replication Controller 会持续监控正在运行的pod列表, 并保证相应 ” 类型” 的 pod的数目与期望相符(多了删除,少了新增)。所谓的类型就是通过标签选择器监控模板中指定标签的pod的数量。
注意:在新版本的k8s中的副本控制器为Replica Set 完全替代了Replication Controller。在kubectl 命令中 Replication Controller 可简写为rc ,Replica Set 为rs。
ReplicationController的三部分
• label selector ( 标签选择器), 用于确定ReplicationController作用域中有哪些pod
• replica count (副本个数), 指定应运行的pod 数量
• pod template (pod模板), 用于创建新的pod 副本
Tips:
1、ReplicationController 的副本个数、标签选择器,甚至是 pod模板都可以随时修改,但只有副本数目的变更会影响现有的 pod。
2、更改标签选择器和pod模板对现有 pod 没有影响。在创建 pod后,RC也不关心其 pod的实际 “ 内容 ”(容器镜像、 环境变量及其他)。因此更改模板仅影响由此RC 创建的新pod例如在模板中添加标签不会立马给现有Pod 添加,而是新建新的Pod 的时候会添加这个新的标签。
3、修改Pod 的标签,pod 就会脱离了RC控制,然后PC 会新建一个pod,给pod 添加新的标签不影响RC对pod 的管理。
4、修改了 ReplicationController 的标签选择器,那么原有的pod 脱离RC控制,然后RC会新创建几个新的 pod。
作用
1、人为删除、增加pod后,副本控制器就会根据模板中定义的数量通过创建/删除来维持应有的数量,或者pod 异常丢失停止都会根据模板创建新的pod
2、集群节点发生故障时, 它将为故障节 点 上运行的所有 pod (即受ReplicationController 控制的节点上的那些 pod) 创建替代副本。
3、根据使用需求它能轻松实现 pod的水平伸缩,手动和自动都可以。
相关操作
创建副本控制器
vi rs.yaml apiVersion: v1 kind: ReplicaSet #资源类型为rc metadata: name: asdf spec: replicas: 2 selector: # pod 选择器决定了 RC 的操作对象 app: pay template: #创建新 pod 所用的pod 模板 metadata: labels: app: pay pod-template-hash: c6f6fdd spec: containers: - name: app1 image: luksa/asdf ports: 8090
编辑副本控制器
kubectl edit rc rc-name -n namespace 将你的默认文本编辑器中打开RC的YAML配置。找到要配置的部分编辑完成后保存更改并退出编辑器后,kubectl将更新RC并打印以下消息: replicationcontroller " kubsdf" edited
通过更改副本控制器可以完成以下任务:
1、扩缩Pod数量
2、更改pod 标签
3、更改副本编辑器的标签选择器
pod 扩容/缩容
方式一 kubectl scale rc kusdf --replicas=8 方式二 kubectl edit re kubia #找到 spec.replicas字段并将其值更改为8,保存该文件并关闭编辑器, ReplicationController会更新并立即将pod的数量增加到8
查看控制器
kubectl get rc NAME DESIRED CURRENT READY AGE adsf 8 8 4 10m
删除副本控制器
kubectl delete rc kubia --cascade=false #如果不加--cascade=false 那么就会连同pod 也一起删除
ReplicaSet 和 ReplicationController 的比较
ReplicaSet 的行为与ReplicationController 完全相同, 但pod 选择器的表达能力更强。 虽然 ReplicationController 的标签选择器只允许包含某个标签的匹配 pod, 但ReplicaSet 的选择器还允许匹配缺少某个标签的 pod, 或包含特定标签名的 pod, 不管其值如何。
另外, 举个例子, 单个RC 无法将 pod与标签 env=prd与env=dev同时匹配它只能匹配带有 env=devel 标签的 pod 或带有env=devel 标签的 pod。 但是一个ReplicaSet 可以匹配两组 pod 并将它们视为一个大组。同样, 无论ReplicationController 的值如何, ReplicationController 都无法仅基于标签名的存在来匹配 pod, 而ReplicaSet 则可以。 例如, ReplicaSet 可匹配所有包含名为 env 的标签的 pod, 无论ReplicaSet 的实际值是什么(可以理解为 env= *)。
ReplicaSet
创建一个RS
首先要注意的是ReplicaSet不是v1 API的一部分,因此你需要确保在创建资源时指定正确的apiVersion。你正在创建一个类型为ReplicaSet的资源,它的内容与你之前创建的ReplicationController的内容大致相同。
唯一的区别在选择器中。不必在selector属性中直接列出pod需要的标签,而是在selector.matchLabels下指定它们。这是在ReplicaSet中定义标签选择器的更简单(也更不具表达力)的方式。之后,你会看到表达力更强的选项。
其他操作
与ReplicationController 命令格式相似,只是资源名称由rc 变为rs即可。另外由于rs 的标签选择器更强大所以在标签选择器配置时会有更多的表达方式可以参考标签的博文来配置rs 中的标签选择器。