Kubernetes技术详解-从理论到实践-(4)-控制器-ReplicaSet
ReplicaSet是Kubernetes中用于维护固定数量Pod副本的控制器。它通过selector匹配标签来管理Pod,确保实际副本数与期望值一致。虽然日常多使用Deployment(内置ReplicaSet),但ReplicaSet仍适用于批处理任务、灰度测试、演示环境等场景。操作上支持创建、查看、扩缩容和删除,能自动维护Pod数量。典型应用包括临时计算集群、金丝雀部署和资源受限环境,提供简
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维持副本数量。
更多推荐
所有评论(0)