ReplicaSet 副本控制器

ReplicaSet(简称 RS)负责保证指定数量的 Pod 副本一直存在:多了就删、少了就按模板补建,Pod 被删或节点宕机都会自动重建。它是副本管理的最小控制器,也是 Deployment 等上层控制器的基础组件。

核心机制

ReplicaSet 由三个核心字段驱动:replicas(期望副本数)、selector(认领哪些 Pod)、template(不足时用什么模板创建)。它通过标签选择器识别"归自己管"的 Pod,不认创建方式——哪怕 Pod 是手工建的,只要标签匹配且数量不足,也会被纳入计数。

YAML 骨架

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
  labels:
    app: nginx
spec:
  replicas: 3               # 期望 3 个副本
  selector:                 # 认领条件,创建后不可改
    matchLabels:
      app: nginx
  template:                 # Pod 模板
    metadata:
      labels:
        app: nginx          # 必须与 selector 匹配
    spec:
      containers:
        - name: nginx
          image: nginx:1.27
kubectl apply -f rs.yaml
kubectl get rs,pods
# NAME            DESIRED   CURRENT   READY   AGE
# nginx-rs        3         3         3       10s
kubectl delete pod nginx-rs-xxxxx     # 手动删一个
kubectl get pods                      # RS 立即按模板补了一个新的

ReplicaSet 与 Deployment 的关系

实际使用中 RS 很少被直接创建,它通常由 Deployment 间接管理:

  • 每次 kubectl apply / rollout 产生新版本,Deployment 就创建一个新 RS。
  • 发布过程中新旧两个 RS 同时存在、按策略增减,发布完成后旧的缩到 0 但保留在历史里,供回滚使用。
kubectl get rs -l app=nginx
# NAME                 DESIRED   CURRENT   READY   AGE
# nginx-7d9c5d6b9f     3         3         3       10m   # 新版本 RS
# nginx-5b8c6f4d2e     0         0         0       2d    # 旧版本 RS 保留待回滚

直接使用 RS 的场景

裸 RS 没有滚动更新、回滚、暂停等能力,直接创建它一般只用于这些情况:

  • 想精确控制"某组 Pod 恒定 N 个"且不需要发布能力。
  • 学习副本机制、做实验。

需要"更新镜像还能回滚",就应使用 Deployment——修改镜像版本这类操作实际也是落在 Deployment 上,由它驱动底层 RS 完成:

kubectl set image deployment nginx nginx=nginx:1.28
# deployment.apps/nginx image updated
# 真正干活的是新创建的 RS:先起新副本,再逐步缩掉旧的

小结:ReplicaSet 是"保副本数"的最小控制器,靠 replicas + selector + template 三个字段工作;Deployment 通过管理 RS 获得滚动更新与回滚能力。日常请直接使用 Deployment,RS 更多是发布历史中"替身"般的存在。

笔记加载中…