9. k8s-ReplicaSets介绍

k8s-ReplicaSets介绍

    • [一、ReplicaSet 概述](#一、ReplicaSet 概述)
      • [1.1 定义与本质](#1.1 定义与本质)
      • [1.2 与 ReplicationController(RC)的关系](#1.2 与 ReplicationController(RC)的关系)
    • [二、ReplicaSet 工作机制](#二、ReplicaSet 工作机制)
      • [2.1 三大要素](#2.1 三大要素)
      • [2.2 自愈演示](#2.2 自愈演示)
    • [三、ReplicaSet YAML 规范(完整注释)](#三、ReplicaSet YAML 规范(完整注释))
    • [四、ReplicaSet 操作指南](#四、ReplicaSet 操作指南)
      • [4.1 创建](#4.1 创建)
      • [4.2 查看](#4.2 查看)
      • [4.3 扩缩容](#4.3 扩缩容)
      • [4.4 删除](#4.4 删除)
    • [五、ReplicaSet 的局限性](#五、ReplicaSet 的局限性)
    • [六、ReplicaSet 与 Deployment 的关系](#六、ReplicaSet 与 Deployment 的关系)
      • [6.1 设计哲学](#6.1 设计哲学)
      • [6.2 能力对比](#6.2 能力对比)
      • [6.3 生产建议](#6.3 生产建议)
    • [七、ReplicaSet 的合理使用场景](#七、ReplicaSet 的合理使用场景)
    • 八、故障排查
      • [8.1 Pod 数量不符合预期](#8.1 Pod 数量不符合预期)
      • [8.2 Pod 创建失败](#8.2 Pod 创建失败)
      • [8.3 无法扩缩容](#8.3 无法扩缩容)
    • 九、总结
    • 范例

一、ReplicaSet 概述

K8S官方推荐直接使用Deploymen,单独介绍RS,是为了让用户明白维持pod副本数量的原理。

1.1 定义与本质

ReplicaSet(RS) 是 Kubernetes 中用于确保指定数量 Pod 副本始终运行的控制器资源。

核心职责:

  • 副本数维持:监控 Pod 数量,实际 ≠ 期望时自动创建/删除
  • 自愈能力:Pod 故障、节点宕机时自动重建
  • 水平扩缩:修改 replicas 字段即可实现弹性伸缩

设计定位:

plain 复制代码
ReplicaSet → Pod 的"保险员"

1.2 与 ReplicationController(RC)的关系

维度 ReplicationController(RC) ReplicaSet(RS)
选择器支持 仅等式匹配(=!= 集合匹配(InNotInExists
状态 已废弃(v1.2+) 标准控制器
实际使用 不推荐 不直接使用(由 Deployment 管理)

核心演进:ReplicaSet 完全替代 RC,提供更灵活的标签选择能力。


二、ReplicaSet 工作机制

2.1 三大要素

要素 作用 示例
replicas 期望运行的 Pod 副本数 replicas: 3
selector 标签选择器,确定管理的 Pod 集合 matchLabels: app: nginx
template Pod 模板,用于创建新 Pod 定义容器、镜像、端口等

工作流程:

  1. ReplicaSet 通过 selector 查询当前运行的 Pod
  2. 计算 实际数量spec.replicas 的差值
  3. 差值 > 0 → 根据 template 创建 Pod
  4. 差值 < 0 → 删除多余的 Pod

2.2 自愈演示

初始状态:

bash 复制代码
# 创建 3 个副本
kubectl apply -f rs.yaml
kubectl get pod
NAME                      READY   STATUS
nginx-replicaset-abc01    1/1     Running
nginx-replicaset-abc02    1/1     Running
nginx-replicaset-abc03    1/1     Running

手动删除一个 Pod:

bash 复制代码
kubectl delete pod nginx-replicaset-abc01

自动重建(数秒内):

bash 复制代码
kubectl get pod
NAME                      READY   STATUS
nginx-replicaset-abc02    1/1     Running
nginx-replicaset-abc03    1/1     Running
nginx-replicaset-xyz99    1/1     Running   # 新 Pod,名称不同

结论:ReplicaSet 持续监控,始终维持期望副本数。


三、ReplicaSet YAML 规范(完整注释)

yaml 复制代码
apiVersion: apps/v1          # API 版本(apps 组,v1)
kind: ReplicaSet            # 资源类型
metadata:
  name: nginx-replicaset    # RS 名称
  labels:                   # RS 自身的标签
    app: nginx
    tier: frontend
spec:
  # ---------- 副本数控制 ----------
  replicas: 3              # 【必填】期望的 Pod 副本数量

  # ---------- 选择器(核心) ----------
  selector:                # 【必填】标签选择器
    matchLabels:          # 等式匹配模式
      app: nginx         # 必须与 template.metadata.labels 一致
    # matchExpressions:   # 集合匹配模式(更灵活)
    # - key: app
    #   operator: In      # In, NotIn, Exists, DoesNotExist
    #   values:
    #   - nginx

  # ---------- Pod 模板 ----------
  template:                # 【必填】Pod 生成模板
    metadata:
      labels:             # 必须与 selector.matchLabels 匹配
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

关键约束:

  • spec.selector 必须匹配 spec.template.metadata.labels
  • 不匹配时 API Server 拒绝创建

四、ReplicaSet 操作指南

4.1 创建

bash 复制代码
kubectl apply -f rs.yaml

4.2 查看

bash 复制代码
# 查看 ReplicaSet 列表
kubectl get rs

# 查看详细信息(包含期望/当前/就绪副本数)
kubectl get rs nginx-replicaset -o wide

# 查看 RS 控制的 Pod
kubectl get pods -l app=nginx

4.3 扩缩容

方法一:直接编辑

bash 复制代码
kubectl edit rs nginx-replicaset
# 修改 spec.replicas 字段

方法二:命令式扩缩

bash 复制代码
kubectl scale rs nginx-replicaset --replicas=5

方法三:声明式更新 YAML

bash 复制代码
# 修改 replicas 后重新 apply
kubectl apply -f rs.yaml

4.4 删除

bash 复制代码
# 删除 ReplicaSet(同时删除其管理的 Pod)
kubectl delete rs nginx-replicaset

# 仅删除 RS,保留 Pod(孤儿 Pod)
kubectl delete rs nginx-replicaset --cascade=orphan

五、ReplicaSet 的局限性

限制 说明 生产影响
无滚动更新 修改 Pod template 不会自动更新已有 Pod 需手动删除重建,造成停机
无版本回滚 不保留历史版本 无法快速回退故障版本
无暂停/恢复 不支持蓝绿、金丝雀发布 发布策略受限
无声明式更新 镜像升级需多步操作 运维效率低

根本原因:ReplicaSet 只关注副本数量,不关注 Pod 内容变更。


六、ReplicaSet 与 Deployment 的关系

6.1 设计哲学

plain 复制代码
Deployment(声明式部署)
        │
        ├─ 管理 ReplicaSet v1(当前)
        ├─ 管理 ReplicaSet v2(新版本)
        └─ 保留 ReplicaSet v0(历史)
        
ReplicaSet(副本控制)
        │
        └─ 管理 Pod 实例

6.2 能力对比

能力 直接使用 ReplicaSet 使用 Deployment(推荐)
副本数维持 ✅(通过 RS)
自愈能力 ✅(通过 RS)
水平扩缩 ✅(通过 RS)
滚动更新 ❌ 需手动 ✅ 自动
版本回滚 ❌ 需手动 rollout undo
版本历史 ❌ 无 ✅ 保留历史 RS
暂停/恢复 ❌ 无 rollout pause/resume
声明式配置 ⚠️ 部分支持 ✅ 完整支持

6.3 生产建议

✅ 推荐:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment      # 使用 Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:           # Pod 模板
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25

❌ 不推荐:

yaml 复制代码
kind: ReplicaSet      # 直接使用 ReplicaSet
# ... 其他配置同上

核心原则:

永远不要直接使用 ReplicaSet 管理业务 Pod------Deployment 提供了完整生命周期管理,ReplicaSet 是其内部实现细节。


七、ReplicaSet 的合理使用场景

尽管 Deployment 是标准方案,ReplicaSet 在以下特殊场景仍有价值:

场景 说明
学习与理解 深入理解控制器模式的工作原理
自定义控制器 开发 Operator 时,直接控制 ReplicaSet 而非 Deployment
无需更新的静态负载 极少变更的稳定服务(理论上,仍推荐 Deployment)
离线环境/边缘节点 极端简化场景,减少控制平面开销

仍建议:即使上述场景,优先使用 Deployment,仅将 ReplicaSet 作为内部实现。


八、故障排查

8.1 Pod 数量不符合预期

bash 复制代码
# 1. 查看 RS 状态
kubectl describe rs <rs-name>

# 2. 检查标签匹配
kubectl get pods --show-labels
kubectl get rs <rs-name> -o yaml | grep selector

# 3. 查看是否有其他控制器管理相同标签
kubectl get deployment,rs,statefulset -l app=nginx

8.2 Pod 创建失败

bash 复制代码
# 查看 RS 事件
kubectl describe rs <rs-name>

# 常见原因:
# - 镜像不存在或拉取失败
# - 资源不足(CPU/内存)
# - PVC 绑定失败
# - 节点污点不匹配

8.3 无法扩缩容

bash 复制代码
# 检查资源配额
kubectl describe quota -n <namespace>

# 检查节点资源
kubectl top nodes

九、总结

维度 核心结论
定义 确保指定数量 Pod 始终运行的控制器
核心机制 selector + replicas + template
自愈能力 ✅ Pod 故障自动重建
水平扩缩 ✅ 修改 replicas 即时生效
滚动更新 ❌ 不支持(Deployment 提供)
版本回滚 ❌ 不支持(Deployment 提供)
生产定位 Deployment 的内部实现,不直接使用

一句话总结:

ReplicaSet 是 Kubernetes 副本控制的核心实现,但 Deployment 是其标准生产接口------直接使用 ReplicaSet 如同驾驶无方向盘汽车,虽能前进却无法优雅转向。

范例

yaml 复制代码
apiVersion: apps/v1 # api版本
kind: ReplicaSet # 产品类型
metadata:
  name: nginx-replicaset
  labels:
    app: nginx
spec:
  replicas: 3 # 设置你想要维持的Pod副本数量
  selector:
    matchLabels:
      app: nginx # 定义选择器,用于确定哪些Pod属于此ReplicaSet
  template: # 这是创建新Pod时使用的模板
    metadata:
      labels:
        app: nginx # 确保Pod标签与选择器匹配
    spec:
      containers:
        - name: nginx
          image: nginx # 使用Nginx镜像
          imagePullPolicy: IfNotPresent #定义镜像下载策略
          ports:
            - containerPort: 80 # 容器监听的端口
plain 复制代码
kubectl apply -f rs-test.yaml

这个时候k8s按照我们的预期,创建了3个pod,如果因为意外或者其他原因,部分pod被删除,那么这个rs的控制器则会自动补齐对应的个数,这样他就通过这个方式来提高了我们的业务的高可用。始终按照我们的预期的方式运行。

shell 复制代码
kubectl get pod
shell 复制代码
kubectl  delete pod nginx-replicaset-tj728
shell 复制代码
kubectl get pod
相关推荐
识途老码2 小时前
8.k8s-node组件介绍
kubernetes·node
没有bug.的程序员2 小时前
容器网络深度探究:从 CNI 插件选型内核到 K8s 网络策略安全防护实战指南
java·网络·安全·kubernetes·k8s·cni·容器网络
人间打气筒(Ada)2 小时前
k8s:认证、授权、准入控制
云原生·容器·kubernetes·云计算·k8s认证·k8s授权·k8s准入控制
A-刘晨阳20 小时前
K8S 之 DaemonSet
运维·云原生·容器·kubernetes·daemonset
切糕师学AI1 天前
Kubernetes 中的 Volume(存储卷)
云原生·容器·kubernetes
ghostwritten1 天前
worker01 NotReady 排查与修复步骤
云原生·kubernetes
zmjjdank1ng2 天前
创建 NodePort 类型的 Service
运维·kubernetes
努力搬砖的咸鱼2 天前
Kubernetes Service :ClusterIP、NodePort、LoadBalancer
微服务·云原生·容器·架构·kubernetes
文静小土豆2 天前
K8s Gateway API 全面指南:从入门到实践
kubernetes·gateway