1 ReplicaSet简介

ReplicaSet是Kubernetes用来保持一组相同Pod副本始终处于期望数量的控制器,它只负责副本数的增减,不处理滚动升级/回滚。
ReplicaSet平时很少单独用到,因为下一章要讲的Deployment控制器内部包含一个ReplicaSet,用来实现滚动升级/回滚,日常运维中,99%用Deployment,ReplicaSet通常由Deployment自动创建和管理。

2 ReplicaSet控制器使用

2.1 ReplicaSet控制器资源清单文件

下面是一个基于nginx镜像的ReplicaSet控制器资源清单文件。
注意第一行是为了方便显示该文件的所在目录和文件名,不是资源清单文件的一部分。

[root@master k8s-test]# cat nginx-replicas.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27.3

这个清单文件的含义是,nginx-rs控制器持续监控集群中标签为app=nginx的Pod数量,如果少于3个就新建,多于3个就删除,永远保持3个副本。
各字段的具体含义如下:

字段 含义
apiVersion: apps/v1 使用apps/v1 API版本。
kind: ReplicaSet 创建的对象类型是ReplicaSet。
metadata.name: nginx-rs ReplicaSet的名字叫nginx-rs。
spec.replicas: 3 期望副本数=3。
selector.matchLabels.app: nginx 只管理带有app=nginx标签的Pod。
template 当需要新建Pod时,按这个模板生成。
template.metadata.labels.app: nginx 新Pod会被自动打上app=nginx标签,与selector对应。
template.spec.containers 模板里的容器列表(只有一个)。
containers[0].name: nginx 容器名字叫nginx。
containers[0].image: nginx:1.27.3 使用镜像nginx:1.27.3。

2.2 ReplicaSet控制器的各种操作

2.2.1 ReplicaSet控制器创建

使用资源清单文件创建ReplicaSet控制器

[root@master k8s-test]# kubectl apply -f nginx-replicas.yaml
replicaset.apps/nginx-rs created
2.2.2 ReplicaSet控制器查看
[root@master k8s-test]# kubectl get replicaset
NAME       DESIRED   CURRENT   READY   AGE
nginx-rs   3         3         3       8s
[root@master k8s-test]# kubectl get rs
NAME       DESIRED   CURRENT   READY   AGE
nginx-rs   3         3         3       9s

控制器创建成功,名字为nginx-ns,期望3个pod副本,目前已经创建了3个。rs是replicaset的缩写。

查看pod,发现目前自动创建了三个pod,pod名的前两个字段为ReplicaSet控制器的名字,即nginx-rs

[root@master k8s-test]# kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-2q7jl   1/1     Running   0          11s
nginx-rs-48wk6   1/1     Running   0          11s
nginx-rs-hbrkb   1/1     Running   0          11s

ReplicaSet控制器保证pod副本不增不减
此时我们删除一个pod,看会发生什么现象

[root@master k8s-test]# kubectl delete pod nginx-rs-2q7jl
pod "nginx-rs-2q7jl" deleted

刚才的pod删除失败,再次查看pod,发现有一个新的pod被创建,这从AGE上也能看出来,刚运行5s。
这就是ReplicaSet控制器的作用,当pod增加或减少时,ReplicaSet控制器会做出相应动作,使pod数量始终保持3个。

[root@master k8s-test]# kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-48wk6   1/1     Running   0          28s
nginx-rs-5pwdn   1/1     Running   0          5s
nginx-rs-hbrkb   1/1     Running   0          28s
2.2.3 ReplicaSet控制器动态调整pod数量

ReplicaSet支持通过命令行控制pod副本数量,这个叫做副本的扩容和缩容。
副本扩容到5个

[root@master k8s-test]# kubectl scale rs nginx-rs --replicas=5
replicaset.apps/nginx-rs scaled

可以看到增加到了5个

[root@master k8s-test]# kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-48wk6   1/1     Running   0          54s
nginx-rs-4sm9c   1/1     Running   0          3s
nginx-rs-5pwdn   1/1     Running   0          31s
nginx-rs-hbrkb   1/1     Running   0          54s
nginx-rs-k7bdh   1/1     Running   0          3s

副本缩容到1个(也支持副本缩容到0个,没有pod在运行)

[root@master k8s-test]# kubectl scale rs nginx-rs --replicas=1
replicaset.apps/nginx-rs scaled

可以看到只有一个pod

[root@master k8s-test]# kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
nginx-rs-5pwdn   1/1     Running   0          39s
2.2.4 ReplicaSet控制器删除
[root@master k8s-test]# kubectl delete rs nginx-rs
replicaset.apps "nginx-rs" deleted
[root@master k8s-test]# kubectl get rs
No resources found in default namespace.

ReplicaSet资源删除之后可以看到pod也随之删除

[root@master k8s-test]# kubectl get pods
No resources found in default namespace.

3 ReplicaSet控制器应用场景

任何需要永远保持N个一模一样Pod副本的纯副本需求,都可以直接用ReplicaSet,尤其在不需要滚动升级、回滚、版本管理的场合。
尽管生产业务绝大多数场景使用Deployment包装ReplicaSet,以获得滚动升级、回滚、探针、策略等附加能力,但ReplicaSet仍有其真实可落地的场景。例如:

  • 一次性批处理集群:临时跑50个计算Pod,任务完成后直接删除ReplicaSet,无需版本控制。
  • 灰度/金丝雀的底层副本:先用ReplicaSet生成金丝雀版本100个Pod,验证无误后整体替换Deployment。
  • 静态演示/培训环境:快速演示3个nginx,用ReplicaSet一行命令拉起即可。
  • 低依赖边缘设备:资源受限的边缘节点只跑kubelet,不跑Deployment控制器,用极简ReplicaSet维持副本数量。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐