# 3.3.1 ReplicaSet概述

`ReplicaSet`与`ReplicationController`类似，它也用于管理一类Pod对象，保证Pod副本数量始终维持在期望值。

## ReplicaSet配置

一个简单的`ReplicaSet`配置如下所示：

```
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-runs-pod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19.0
```

该`ReplicaSet`配置确保集群中始终运行3个拥有`app: nginx`标签的Pod副本，如果副本数量不足3个，则使用Pod模版`spec.template`创建Pod，如果副本数量多于3个，则删除多余的副本。

`ReplicaSet`配置中最核心的三个要素如下：

* `spec.selector`用于查找集群中存在的Pod；
* `spec.replicas`用于指定期望的Pod副本数；
* `spec.template`用于指定Pod模版，当副本数不足时将使用该模版创建新的Pod。

## ReplicaSet与ReplicationController的区别

`ReplicationController`和`ReplicaSet`都属于Pod控制器，其设计初衷几乎完全相同，都是确保指定类型的Pod副本数维持在期望值，`ReplicationController`出现时间比`ReplicaSet`要早，那么为什么已经有了`ReplicationController`的情况下，还要再设计一个`ReplicaSet`呢？二者到底有什么区别呢？

二者的主要区别在于标签选择器，`ReplicaSet`拥有更先进的标签选择器，`ReplicationController`只支持旧式的标签选择器，而`ReplicaSet`不仅支持旧式选择器，还支持新式选择器。

`ReplicationController`支持的选择器称为`Equality-based`选择器，即基于等值的选择器：

```
Selector map[string]string
```

`ReplicaSet`不仅支持`Equality-based`选择器，还支持`Set-based`选择器，即基于集合的选择器：

```
type LabelSelector struct {
    MatchLabels map[string]string
    MatchExpressions []LabelSelectorRequirement
}
```

`ReplicationController`特性演进到V1时还没有支持`Set-based`选择器，而Kubernetes又希望推出一款支持`Set-based`选择器的Pod控制器，为了不破坏API兼容性，不得已才推出了`ReplicaSet`控制器来替代`ReplicationController`。

## 延伸阅读

* 《ReplicaSet》<https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/>
