(一)、概述

说到ReplicaSet对象,得先说说ReplicationController(简称为RC)。在旧版本的Kubernetes中,只有ReplicationController对象。它的主要作用是确保Pod以你指定的副本数运行,即如果有容器异常退出,会自动创建新的 Pod 来替代;而异常多出来的容器也会自动回收。可以说,通过ReplicationController,Kubernetes实现了集群的高可用性。
在新版本的 Kubernetes 中建议使用 ReplicaSet(简称为RS )来取代 ReplicationController。ReplicaSet 跟 ReplicationController 没有本质的不同,只是名字不一样,并且 ReplicaSet 支持集合式的 selector(ReplicationController 仅支持等式)。

虽然 ReplicaSet 也可以独立使用,但建议使用 Deployment 来自动管理 ReplicaSet,这样就无需担心跟其他机制的不兼容问题(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且Deployment还支持版本记录、回滚、暂停升级等高级特性。Deployment 的详细介绍和使用方法参见。

(二)、ReplicationController的创建

[root@k8s-master rs]# cat 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
[root@k8s-master rs]# kubectl apply -f rc.yml
replicationcontroller/nginx created
[root@k8s-master rs]# kubectl get rc/nginx
NAME    DESIRED   CURRENT   READY   AGE
nginx   3         3         3       26s
[root@k8s-master rs]# kubectl get pod
NAME                                  READY   STATUS      RESTARTS      AGE
nginx-5vxzv                           1/1     Running     0             40s
nginx-6m64m                           1/1     Running     0             40s
nginx-9f8n8                           1/1     Running     0             40s
  • kind字段代表你要新建的对象类型。此处指定为ReplicationController。
  • spec.selector字段指定为你需要管理的Pod的label(label的意义体现在此处)。这儿将spec.selector设置为app: nginx,意味着所有包含label:app: nginx的Pod都将被这个RC管理。
  • spec.replicas字段代表了受此RC管理的Pod,需要运行的副本数。
  • template模块用于定义Pod,包括Pod的名字,Pod拥有的label以及Pod中运行的应用。
    上面的RC通过kubectl apply命令创建成功后,Kubernetes会在所有可用的Node上,新建三个Pod。每个Pod都有一个app: nginx的label,并且每个Pod中都运行一个nginx容器。一旦其中某个Pod发生故障停止运行了,Controller Manager都能够及时发现,然后根据当前RC定义,创建出一个新的Pod,从而使包含label:app: nginx的Pod的运行副本数始终为3。

    (三)、ReplicaSet的创建

    Kubernetes官方强烈建议避免直接使用ReplicaSet,而应该通过Deployment来创建RS和Pod。
    由于ReplicaSet是ReplicationController的代替物,因此用法基本相同,唯一的区别在于ReplicaSet支持集合式的selector。一个典型的RS描述文件如下:

    
    [root@k8s-master rs]# cat rs.yml
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
    name: frontend
    labels:
    app: guestbook
    tier: frontend
    spec:
    replicas: 3
    selector:
    matchLabels:
    tier: frontend
    matchExpressions:
  • {key: tier,operator: In, values: [frontend]}
    template:
    metadata:
    labels:
    app: guestbook
    tier: frontend
    spec:
    containers:
  • name: php-redis
    image: nginx
    resources:
    requests:
    cpu: 100m
    memory: 200Mi
    env:
  • name: GET_HOSTS_FROM
    value: dns
    ports:
  • containerPort: 80
    [root@k8s-master rs]# kubectl apply -f rs.yml
    replicaset.apps/frontend created
    [root@k8s-master rs]# kubectl get rs
    NAME DESIRED CURRENT READY AGE
    frontend 3 3 3 15s
    nfs-pvc-587bdcb574 3 3 0 9d
    [root@k8s-master rs]# kubectl get pod
    NAME READY STATUS RESTARTS AGE
    frontend-2vwrk 1/1 Running 0 19s
    frontend-4sclq 1/1 Running 0 19s
    frontend-z8wbz 1/1 Running 0 19s