控制器-ReplicaSet(rs)
ReplicaSet概述
ReplicaSet(副本集)是 Kubernetes 中的核心控制器,其首要任务是确保指定数量的 Pod 副本始终在集群中运行。 它常作为 Deployment 的幕后支撑,负责维护应用的稳定副本数,是 Kubernetes 实现高可用性和自我修复能力的基础。
ReplicaSet 的核心机制
ReplicaSet 自动为您处理副本数量的“多退少补”,具体包含以下核心能力:
- 确保副本数量:您只需在 YAML 中通过
replicas字段声明需要的 Pod 数量,ReplicaSet 便会持续监控,当Pod被误删或节点故障时自动创建新Pod,维持预期数量。 - 自我修复能力:能自动发现并替换失败或失联的 Pod,无需管理员介入。
- 声明式扩缩容:支持水平扩展,直接修改
replicas或运行kubectl scale命令,即可实时调整实例数量以应对负载变化。 - 灵活的标签选择:采用
matchLabels(基于键值对)的标签选择器来管理 Pod,增强了资源匹配的灵活性。 - 支持自动伸缩:可以与水平Pod自动伸缩器配合,根据 CPU 等指标动态调整副本数,实现弹性伸缩。
ReplicaSet 的资源清单示例
YAML 文件是操作 ReplicaSet 的主要方式之一。以下是一个维护 3 个 Nginx Pod 副本的完整示例:
Yaml
apiVersion: apps/v1 # 指定 API 版本
kind: ReplicaSet # 资源类型为 ReplicaSet
metadata:
name: nginx-replicaset # ReplicaSet 的名称
labels:
app: nginx
spec:
replicas: 3 # 定义 3 个 Pod 副本
selector: # 指定管理哪些 Pod
matchLabels:
app: nginx # 必须匹配下方模板中的 labels
template: # Pod 模板
metadata:
labels:
app: nginx # 此 labels 必须与 selector.matchLabels 一致
spec:
containers:
- name: nginx
image: nginx:1.21ReplicaSet 与 Deployment 的关系
在生产环境中,我们通常不直接使用 ReplicaSet,而是使用 Deployment 来间接管理它。
| 特性 | ReplicaSet | Deployment |
|---|---|---|
| 角色 | 底层副本管理模块 | 高层部署管理工具 |
| 滚动更新 | 不支持 | 支持,确保应用无中断升级 |
| 版本回滚 | 不支持 | 支持,可一键回退到历史版本 |
| 生产建议 | 作为底层构建块 | 直接使用,是生产环境的最佳实践 |
您在 kubectl 中创建 Deployment 时,Kubernetes 会在后台自动创建并管理一个或多个 ReplicaSet,用于支持应用的发布、回滚等操作。
常用 kubectl 操作
除了创建,日常管理中也会经常使用以下命令来与 ReplicaSet 交互:
| 操作 | kubectl 命令 |
|---|---|
| 查看 | kubectl get rs 或 kubectl get replicaset |
| 详情 | kubectl describe rs <rs名称> |
| 扩缩容 | kubectl scale rs <rs名称> --replicas=5 |
| 删除 | kubectl delete rs <rs名称> |
| 自动伸缩 | kubectl autoscale rs <rs名称> --min=3 --max=10 --cpu-percent=50 |
主要限制与使用原则
主要限制:
- 不支持滚动更新:直接修改 ReplicaSet 的 Pod 模板会导致其管理的所有 Pod 被立即且同时重建,这会引发服务中断。
- 不支持版本回滚:ReplicaSet 本身不具备版本管理能力,一旦更新失败,恢复过程复杂。
- 历史版本管理缺失:Deployment 在每次更新时会生成一个新的 ReplicaSet 并保留旧版本,这构成了其回滚功能的基础,而 ReplicaSet 自身没有这种机制。
核心使用原则:
- 尽量使用 Deployment:官方的核心建议是,除非有特殊需求,否则生产环境应始终使用 Deployment 而非直接操作 ReplicaSet。
