Kubernetes & Replication Controller
RC是Kubernetes系统中的核心概念之一,简单来说,它其实定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,所以RC的定义包括如下几个部分。
- ◎ Pod期待的副本数量。
- ◎ 用于筛选目标Pod的Label Selector。
- ◎ 当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板(template)。
如下所示:
apiVersion: v1
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
在我们定义了一个RC
并将其提交到Kubernetes集群中后,Master上的Controller Manager
组件就得到通知,定期巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于此RC的期望值
,如果有过多的Pod副本在运行,系统就会停掉一些Pod,否则系统会再自动创建一些Pod。
可以说,通过RC,Kubernetes实现了用户应用集群的高可用性,并且大大减少了系统管理员在传统IT环境中需要完成的许多手工运维工作(如主机监控脚本、应用监控脚本、故障恢复脚本等)。
此外,在运行时,我们可以通过修改RC的副本数量,来实现Pod的动态缩放(Scaling)
# 查看rc数量
roverliang@roverliangdeMac-mini ~ % kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 5h56m
myweb 5 5 5 5h37m
#调整Rc数量
roverliang@roverliangdeMac-mini ~ % kubectl scale rc myweb --replicas=3
replicationcontroller/myweb scaled
#查看RC数量
roverliang@roverliangdeMac-mini ~ % kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 5h56m
myweb 3 3 3 5h37m
需要注意的是,删除RC并不会影响通过该RC已创建好的Pod。为了删除所有Pod,可以设置replicas的值为0,然后更新该RC。另外,kubectl提供了stop
和delete
命令来一次性删除RC和RC控制的全部Pod。
应用升级时,通常会使用一个新的容器镜像版本替代旧版本。我们希望系统平滑升级,比如在当前系统中有10个对应的旧版本的Pod,则最佳的系统升级方式是旧版本的Pod每停止一个,就同时创建一个新版本的Pod,在整个升级过程中此消彼长,而运行中的Pod数量始终是10个,几分钟以后,当所有的Pod都已经是新版本时,系统升级完成。通过RC机制
,Kubernetes
很容易就实现了这种高级实用的特性,被称为“滚动升级
”(Rolling Update
)。
总结一下RC(Replica Set)的一些特性与作用。
-
在大多数情况下,我们通过定义一个RC实现Pod的创建及副本数量的自动控制。
-
RC通过Label Selector机制实现对Pod副本的自动控制。
-
通过改变RC里的Pod副本数量,可以实现Pod的扩容或缩容。
-
通过改变RC里Pod模板中的镜像版本,可以实现Pod的滚动升级。