概念介绍
Replication Controller (简称 RC ) 是 Kubernates 系统中的核心概念之一,简单的说,它其实定义了一个期望的场景,即声明某种Pod的副本数量再任意时刻都符合某个预期值
- Replication Controller 保证了在所有时间内,都有特定数量的Pod副本正在运行,如果太多了,Replication Controller就杀死几个,如果太少了,Replication Controller会新建几个,和直接创建的pod不同的是,Replication Controller会替换掉那些删除的或者被终止的pod,不管删除的原因是什么(维护阿,更新啊,Replication Controller都不关心)。
- 基于这个理由,我们建议即使是只创建一个pod,我们也要使用Replication Controller。Replication Controller 就像一个进程管理器,监管着不同node上的多个pod,而不是单单监控一个node上的pod,Replication Controller 会委派本地容器来启动一些节点上服务(Kubelet ,Docker)。
- Replication Controller只会对那些RestartPolicy = Always的Pod的生效,(RestartPolicy的默认值就是Always),Replication Controller 不会去管理那些有不同启动策略pod
主要定义
基于对RC描述,RC 的定义包括以下几个部分:
- Pod 期待的副本数量
- 用于筛选目标 Pod 的 Label Selector
- 当 Pod 的副本数量小于预期数量时,用于创建新 Pod 的 Pod 模板(template)
主要用途
- 多数情况下,我们通过定义一个 RC 实现 Pod 的创建及副本数量的自动控制
- 在 RC 里包括完整的 Pod 定义模板
- RC 通过 Label Selector 机制实现对Pod副本的自动控制
- 通过改变 RC里的 副本数量, 可以实现 Pod 的扩容或缩容
- 通过改变 RC 里 Pod模板中的镜像版本,可以实现Pod的滚动升级
示例
- 定义
# tomcat-demo-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend # Label
spec:
replicas: 1 # 定义Pod副本数量
selector:
tier: frontend # 设置标签选择表达式
template: # 设置Pod模板
metadata:
labels:
app: app-demo
tier: frontend
spec:
containers:
- name: tomcat-demo
image: tomcat
imagePullPolicy: IfNotPresent
env:
- name: GET_HOST_FROM
value: dns
ports:
- containerPort: 80
- 创建 RC
[root@hoas kubernates]# kubectl create -f tomcat-demo-rc.yaml
replicationcontroller "frontend" created
[root@hoas kubernates]# kubectl get rc
NAME DESIRED CURRENT READY AGE
frontend 1 1 0 25s
注:删除 RC 并不会影响通过该 RC 已创建好的Pod。为了删除所有 Pod, 可以设置 replicas 值为 0, 然后更新该 RC。 另外 kubectl 提供了 stop 和 delete 命令来一次性删除 RC 和 RC 控制的全部 Pod。
特性
- 动态缩放(Scalling)
在运行时,我们可以通过修改RC的副本数量,来实现Pod的动态缩放(Scalling)
以下代码通过 kubectl scale rc frontend --replicas=3
动态给名为 frontend 的 RC 动态扩容到3个Pod。
[root@hoas kubernates]# kubectl scale rc frontend --replicas=3
replicationcontroller "frontend" scaled
[root@hoas kubernates]#
[root@hoas kubernates]# kubectl get rc
NAME DESIRED CURRENT READY AGE
frontend 3 3 0 8m
[root@hoas kubernates]# kubectl get pods
NAME READY STATUS RESTARTS AGE
frontend-9p3fl 0/1 ContainerCreating 0 15s
frontend-fxp42 0/1 ContainerCreating 0 15s
frontend-zkh82 0/1 ContainerCreating 0 8m
- 滚动升级(Rolling Update)
在应用升级时,通常会使用一个新的容器镜像版本代替旧版本。我们希望系统平滑升级,比如,当前应用中有10个对应的旧版本的Pod,则最佳的升级方式是旧版本的Pod每停止一个,就同时创建一个新版本的Pod,再这个升级过程中此消彼长,而运行中的Pod始终是10个,几分钟后,当所有的Pod都是最新版本时,希望升级完成。通过 RC 机制, Kubernates 很容易就实现了这种高级实用的特性,称之为“滚动升级”(Rolling Update)
Replication Controller & Replica Set
- Replica Set,官方解释为“下一代 RC”,定义与 kubernate 1.2中。
- RC 只支持基于等式的 Label Selector (equality-based selector),而 Replica Set 支持基于集合的 Label Selector(Set-based selector),这使得 Replica Set 功能更强。
我们当前很少单独使用 Replica Set,它主要被 Deployment 这个更高层的资源对象所使用,从而形成一整套 Pod 创建、删除、更新的编排机制。
我们在使用Deployment 时,无需关心它如何创建和维护 Replica Set 的,这一切都是自动发生的。
Replica Set 与 Deployment 这两个重要的资源对象逐步代替了之前的 RC 的作用,是 Kubernates 1.3 里的 Pod 自动扩容(伸缩)这个告警功能实现的基础,也将继续在 Kubernates 未来的版本中发挥重要的作用
参考:
https://www.kubernetes.org.cn/replication-controller-kubernetes