一、ReplicationController¶
Replication Controller(复制控制器,RC)和 ReplicaSet(复制集,RS)是两种简单部署 Pod 的方式。在生产环境中,主要使用更高级的 Deployment 等方式进行 Pod 的管理和部署,所以这里简单了解即可。
Replication Controller 确保在任何时候都有特定数量的 Pod 副本处于运行状态。 换句话说,Replication Controller 确保一个 Pod 或一组同类的 Pod 总是可用的。
1.1 Replication Controller如何工作¶
当 Pod 数量过多时,Replication Controller 会终止多余的 Pod。当 Pod 数量太少时,Replication Controller 将会启动新的 Pod。 与手动创建的 Pod 不同,由 Replication Controller 创建的 Pod 在失败、被删除或被终止时会被自动替换。
1.2 Replication Controller 示例说明¶
本示例ReplicationController 配置运行 nginx Web 服务器的三个副本。
1.定义一个yaml文件
$ vim rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
2.运行示例任务
$ k create -f rc.yml
replicationcontroller/nginx created
3.查看 ReplicationController 的状态
$ k describe replicationcontroller/nginx

4.以机器可读的形式列出属于 ReplicationController 的所有 Pod
$ pods=$(kubectl get pods --selector=app=nginx --output=jsonpath={.items..metadata.name})
$ echo $pods
nginx-bvrtn nginx-jfplf nginx-kzvkh
上面参数说明:
- --selector=app=nginx:指定标签app=nginx
- --output=jsonpath={.items..metadata.name}):指定了一个表达式,仅从返回列表中的每个 Pod 中获取名称
二、ReplicaSet¶
ReplicaSet 是支持基于集合的标签选择器的下一代 Replication Controller,主要被 Deployment用来作为一种编排 Pod 创建、删除及更新的机制。 请注意,我们推荐使用 Deployment 而不是直接使用 ReplicaSet,除非你需要自定义更新编排或根本不需要更新。
2.1 ReplicaSet的工作原理¶
ReplicaSet 是通过一组字段来定义的,包括一个用来识别可获得的 Pod 的集合的选择算符、一个用来标明应该维护的副本个数的数值、一个用来指定应该创建新 Pod 以满足副本个数条件时要使用的 Pod 模板等等。 每个 ReplicaSet 都通过根据需要创建和删除 Pod 以使得副本个数达到期望值, 进而实现其存在价值。当 ReplicaSet 需要创建新的 Pod 时,会使用所提供的 Pod 模板。
ReplicaSet 通过 Pod 上的 metadata.ownerReferences字段连接到附属 Pod,该字段给出当前对象的属主资源。 ReplicaSet 所获得的 Pod 都在其 ownerReferences 字段中包含了属主 ReplicaSet 的标识信息。正是通过这一连接,ReplicaSet 知道它所维护的 Pod 集合的状态, 并据此计划其操作行为。
ReplicaSet 使用其选择算符来辨识要获得的 Pod 集合。如果某个 Pod 没有 OwnerReference 或者其 OwnerReference 不是一个控制器, 且其匹配到某 ReplicaSet 的选择算符,则该 Pod 立即被此 ReplicaSet 获得。
2.2 ReplicaSet示例说明¶
本示例ReplicaSet创建三个前端。
1.定义一个yaml文件
$ vim rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: php-redis
image: gcr.io/google_samples/gb-frontend:v3
2.运行示例任务
$ k create -f rs.yml
replicaset.apps/frontend created
3.查看Pod信息
$ k get pods
[root@k8s-master01 prac]# k get pods
NAME READY STATUS RESTARTS AGE
frontend-njw9z 1/1 Running 0 2m6s
frontend-slr6h 1/1 Running 0 2m6s
frontend-xrdjw 1/1 Running 0 2m6s
2.3 小结¶
Replication Controller 和 ReplicaSet 的创建删除和 Pod 并无太大区别,Replication Controller 目前几乎已经不在生产环境中使用,ReplicaSet 也很少单独被使用,都是使用更高级的资源 Deployment、DaemonSet、StatefulSet 进行管理 Pod。