Replication Controller定义了预期的场景,包括几个部分:
Pod期待的副本数(replicas)
筛选目标Pod的Label Selector
当Pod的副本数量小于预期数量时,用于创建新Pod的Pod模板
RC的完整定义
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
spec:
replicas: 1
selector:
tier: frontend
template:
metadata:
labels:
app: app-demo
tier: frontend
spec:
containers:
- name: tomcat-demo
image: tomcat
imagePullPolicy: IfNotPresent
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
动态扩容
可以通过修改RC的副本数量,实现Pod的动态缩放,比如可以使用kubectl scale
命令
kubectl scale rc redis-slave --replicas=3
删除RC
删除RC并不会影响已经创建好的Pod。为了删除所有Pod,可以设置replicas的值为0.
此外kubectl提供stop和delete命令可以一次性删除RC和RC控制的全部Pod。
滚动升级
当应用升级时,通常会通过Build一个新的Docker镜像,并用新的镜像版本替代旧的版本的方式达到目的。
通过RC机制,Kubernetes很容易实现这种滚动升级。
Replication Set
由于Replication Controller与Kubernetes代码中的模块Replication Controller同名,自Kubernetes 1.2开始,它升级为另一个概念Replica Set。与RC的区别是,RS支持基于集合的Label selector,而RC只支持基于等式的Label Selector。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 1
selector:
matchLabels:
tier: frontend
matchExpressions:
- {key: tier,operator:In,values:[frontend]}
template:
metadata:
labels:
app: app-demo
tier: frontend
spec:
containers:
- name: tomcat-demo
image: tomcat
imagePullPolicy: IfNotPresent
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 80
实际上,也很少单独使用Replica Set,而主要使用Deployment。
总之,Replica Set与Deployment这两个重要资源对象正在逐步替换RC作用,是自Kubernetes 1.3开始,Pod自动扩容的实现基础。