RC(ReplicationController)

Replication Controller主要作用是用来确保容器应用的副本数和用户设置的副本数一致。如果用容器异常退出,会自动创建新的Pod来替代,而如果异常多出来的容器则会自动回收。
如下图所示,为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它,保持总数为3.如下面的动画所示:

03d07039d9fc80c0f692d6176f65936e.7af9fab5.gif
如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod,这个特性在执行滚动升级时很有用。

RS(ReplicaSet)

ReplicaSet 和RC没有本质的不同,唯一的区别是ReplicaSet支持标签选择器(Selector)。
ReplicaSet由3个部分组成:
标签选择器(label selector): 确定 ReplicaSet 作用域中有哪些 Pod
副本个数(replica count): 指定应运行的 Pod 数量
Pod 模板(pod template): 用于创建新的 Pod 副本
eg:

  1. apiVersion: apps/v1
  2. kind: ReplicaSet
  3. metadata:
  4. name: nginx
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: nginx
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx:latest

执行

  1. $ kubectl create -f nginx-replicaset.yaml
  2. replicaset.apps/nginx created

查看pod

  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-4cw6k 1/1 Running 0 5m29s
  4. nginx-54ljh 1/1 Running 0 5m29s
  5. nginx-m9wct 1/1 Running 0 5m29s

查看rs

  1. $ kubectl get rs
  2. NAME DESIRED CURRENT READY AGE
  3. nginx 3 3 3 5m52s

查看rs 详细信息

  1. $ kubectl describe rs
  2. Name: nginx
  3. Namespace: default
  4. Selector: app=nginx
  5. Labels: <none>
  6. Annotations: <none>
  7. Replicas: 3 current / 3 desired
  8. Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
  9. Pod Template:
  10. Labels: app=nginx
  11. Containers:
  12. nginx:
  13. Image: nginx:latest
  14. Port: <none>
  15. Host Port: <none>
  16. Environment: <none>
  17. Mounts: <none>
  18. Volumes: <none>
  19. Events:
  20. Type Reason Age From Message
  21. ---- ------ ---- ---- -------
  22. Normal SuccessfulCreate 6m37s replicaset-controller Created pod: nginx-4cw6k
  23. Normal SuccessfulCreate 6m37s replicaset-controller Created pod: nginx-54ljh
  24. Normal SuccessfulCreate 6m37s replicaset-controller Created pod: nginx-m9wct

删除rs, 在删除 nginx ReplicaSet 时也会删除对应匹配的所有 Pod。

  1. $ kubectl delete rs nginx
  2. replicaset.apps "nginx" deleted

注意

尽管RS都可以单独使用,但是一般实际应用中建议使用Deployment来自动管理ReplicaSet,Deployment管理ReplicaSet并为Pod和ReplicaSet提供声明性更新以及许多其他有用的功能,因此在实际使用中,使用Deployment代替ReplicaSet。