当前位置: 首页 > news >正文

Kubernetes 系列【10】控制器:ReplicaSet(副本集)

文章目录

  • 1. 概述
  • 2. 工作原理
    • 2.1 配置必填字段
    • 2.2 调谐循环逻辑(控制器持续执行)
    • 2.3 Pod 归属与接管规则
  • 3. 资源清单编写规范
    • 3.1 通用顶层基础规范
    • 3.2 Pod 模板硬性约束
    • 3.3 标签选择器规则
    • 3.4 副本数字段规则
  • 4. 使用示例
    • 4.1 部署、查看、调试
    • 4.2 删除
    • 4.3 脱离 RS 管控
    • 4.4 缩容 Pod 删除优先级
      • 示例 1:删除成本注解使用
      • 示例2:缩容演示
    • 4.5 Pod 终止机制
    • 4.6 HPA 自动扩缩容
  • 5. 替代方案对比

1. 概述

ReplicaSet(副本集,简称RS),核心能力是持续维持集群内指定数量、配置一致Pod正常运行。

唯一目标:集群里一直保持replicas指定数量的可用Pod,不关心版本更新、灰度发布,只做「数量对齐」。

ReplicaSet仅负责保证固定数量Pod持续运行;而Deployment是更高层级的控制器,内置管理ReplicaSet的能力,支持声明式滚动更新、版本回滚等大量生产必备特性。

2. 工作原理

2.1 配置必填字段

三大必填字段各自作用:

  1. spec.selector:标签选择器,匹配接管对应标签Pod
  2. spec.replicas:期望Pod副本数,默认1
  3. spec.templatePod模板,数量不足时按此新建Pod

2.2 调谐循环逻辑(控制器持续执行)

控制器不停做对比运算:

  1. 统计集群内所有匹配selectorPod
  2. 区分两类Pod
    • 自有Pod:带有ownerReferences指向当前RS
    • Pod:无归属、仅标签匹配;
  3. 分三种情况处理:
    • 总数 <replicas:按template创建新Pod,自动给新Pod打上ownerReferences
    • 总数 >replicas:删除多余Pod,优先按内置删除策略清理;
    • Pod正常运行但进程崩溃 / 节点失联:视为失效Pod,标记销毁,再新建补齐数量。

2.3 Pod 归属与接管规则

每个Podmetadata.ownerReferences是一段资源标记,记录这个Pod是哪个ReplicaSet创建的。

ownerReferences归属绑定规则:

  1. RS通过这个字段识别自己创建的Pod
  2. RS新建Pod时,自动写入该字段,记录父资源为当前RS
  3. RS场景下,每个RS只信任带有自己归属标记的Pod,互不混淆;
  4. Pod没有此字段,属于无主资源。

RS会自动捞走匹配标签的裸Pod,判断条件同时满足就接管:

  • Pod没有ownerReferences(无控制器)
  • Pod标签和RSspec.selector完全对上

场景1RS期望副本数replicas=3,但RS已有3个正常Pod,手动新建2个同标签裸Pod

此时:

总 Pod=3(RS 亲生)+2(裸 Pod)=5,超过目标数量

RS调谐逻辑:多出来的要删掉 → 直接销毁2个裸Pod,维持总数3

场景2,先手动建2个同标签裸Pod,再创建replicas=3RSRS启动扫描到2个匹配裸Pod,直接接管(给Pod打上归属标记)。当前总数2< 期望3RS再按模板新建1Pod,凑够3个。

RS认两件事:

  • 归属标记区分亲生Pod
  • 标签匹配就抢无主Pod,只保证数量达标,不统一Pod内部配置。

3. 资源清单编写规范

最简合规RS模板(对照规范):

apiVersion:apps/v1kind:ReplicaSetmetadata:name:demo-rs# DNS标签规范命名spec:replicas:3# 可选,不写默认1selector:matchLabels:app:demotemplate:metadata:labels:app:demo# 和selector标签完全一致spec:restartPolicy:Always# 仅允许该值containers:-name:demoimage:nginx

3.1 通用顶层基础规范

  1. 强制三要素缺一不可:apiVersionkindmetadata
  2. RS专属固定值:
    • apiVersion: apps/v1
    • kind: ReplicaSet,不可修改
  3. metadata.name约束:
    • 遵循DNS标签命名规范,控制平面会用RS名称作为Pod名称前缀;
    • 命名不规范会导致Pod主机名解析异常。

3.2 Pod 模板硬性约束

  1. 标签强一致性校验:模板内metadata.labels必须和spec.selector.matchLabels完全相同,API服务端会做校验,不一致直接拒绝创建RS
  2. 重启策略限制:
    • spec.template.spec.restartPolicy仅允许 Always,不支持OnFailure/Never
    • 原因:RS 的职责是长期常驻副本,Pod 退出后必须自动重建,一次性任务由Job/CronJob负责。

3.3 标签选择器规则

spec.selector

  1. 作用:筛选集群内可纳入统计的Pod范围;
  2. RSselector隔离机制:
    • 多个RS配置一模一样的选择器、但Pod模板不同时,不会争抢Pod
    • 区分逻辑:依靠PodownerReferences归属标记,每个RS只管理自己创建、带自身归属标记的Pod
    • Pod才会被最先匹配到的RS接管。

3.4 副本数字段规则

spec.replicas

  1. 功能:定义集群需要维持的目标Pod数量;
  2. 默认值:字段省略时自动填充replicas: 1
  3. 控制器行为:持续对比实际Pod总数与期望值,自动增删Pod对齐数量。

4. 使用示例

4.1 部署、查看、调试

  1. 创建RS资源清单nginx-rs.yaml
# K8s API 版本,ReplicaSet 归属 apps/v1 组apiVersion:apps/v1# 资源类型:副本集 ReplicaSetkind:ReplicaSet# 元数据:资源名称、标签标识metadata:# ReplicaSet 名称,遵循DNS标签规范,用于生成Pod前缀name:nginx-rs# RS自身标签,用于筛选、分组管理资源labels:app:nginx# ReplicaSet 核心业务配置段spec:# replicas:期望运行的Pod副本数量,省略默认值1replicas:3# 标签选择器,筛选本RS管控的Podselector:matchLabels:# 匹配Pod模板内定义的标签,必须与template.labels完全一致app:nginx# Pod模板:副本不足时,以此模板新建Podtemplate:metadata:# Pod标签,和上方selector.matchLabels保持统一,API强制校验labels:app:nginxspec:# Pod容器列表containers:# 容器名称,Pod内唯一标识-name:nginx# 官方Nginx轻量镜像image:nginx:1.24-alpine# 容器暴露端口ports:-containerPort:80
  1. 应用清单创建RS
kubectl apply-fnginx-rs.yaml

  1. 查看集群所有副本集:
kubectl get rs

输出示例:

NAME DESIRED CURRENT READY AGE nginx-rs 3 3 3 6s


字段解释:

  • DESIRED:期望副本数
  • CURRENT:当前运行总实例数
  • READY:就绪可用实例数
  • AGE:资源创建时长
  1. 查看RS详细信息:
kubectl describe rs/nginx-rs

输出关键信息解读:

  • Selector:匹配标签app=nginx
  • Replicas:当前3个 / 期望3
  • Pods Status:运行中/等待/执行成功/失败Pod数量
  • Pod Template:创建Pod使用的Nginx镜像、容器端口配置
  • Events:控制器创建Pod的操作日志
  1. 查看RS管理的Pod
kubectl get pods

输出类似:

NAME READY STATUS RESTARTS AGE nginx-rs-xxxxxx 1/1 Running 0 20s nginx-rs-yyyyyy 1/1 Running 0 20s nginx-rs-zzzzzz 1/1 Running 0 20s
  1. 验证Pod的归属引用ownerReferences
# 替换为实际Pod名称kubectl get pods nginx-rs-xxxxxx-oyaml

Pod元数据中ownerReferences会记录所属ReplicaSet,标识该PodRS全权管理。

4.2 删除

删除RS连带删除Pod(默认):

kubectl delete rs nginx-rs
  • 只删RS、保留Pod(孤儿Pod):
kubectl delete rs nginx-rs--cascade=orphan

4.3 脱离 RS 管控

现有Nginx RSreplicas:3,标签app:nginx3Pod正常运行。

  1. 查看Pod
kubectl get pods --show-labels

输出:

nginx-rs-7x9sf 1/1 Running 0 20m app=nginx nginx-rs-2dfvj 1/1 Running 0 20m app=nginx nginx-rs-5tn8g 1/1 Running 0 20m app=nginx
  1. 修改其中一个Pod标签,脱离RS管控:
kubectl label pod nginx-rs-7x9sfapp=nginx-test--overwrite
  1. 现象:
    • Pod标签变为app=nginx-test,不再匹配RS selector,脱离RS管理;
    • RS检测当前匹配Pod只剩2个,不足3副本,立刻新建一个nginx-rs-xxxx补齐至3个;
    • 现在集群一共4Pod1个脱离管控的旧Pod + RS管理的3个标准Pod

4.4 缩容 Pod 删除优先级

示例 1:删除成本注解使用

Pod打上低数值注解,缩容时优先删掉它:

# 给Pod设置删除成本-100,优先销毁kubectl annotate pod nginx-rs-2dfvj controller.kubernetes.io/pod-deletion-cost=-100

其他Pod无注解默认0,缩容时会先删-100Pod

示例2:缩容演示

RS副本3个,执行缩容到2个:

kubectl scale rs nginx-rs--replicas=2

控制器判断删除顺序:

  1. 如果有Pending未调度Pod,优先删;
  2. -100注解的Pod第二个删;
  3. 同一节点Pod更多的实例次之;
  4. 刚创建不久的新Pod
  5. 全部条件一致随机删。

4.5 Pod 终止机制

终止机制:

  • 缩容、删除时Pod进入终止状态,销毁耗时较长,期间集群总Pod数量会临时超过replicas
  • 可通过RSstatus.terminatingReplicas查看正在销毁的实例。
  • 开启方式:API Serverkube-controller-manager配置特性门控DeploymentReplicaSetTerminatingReplicas
  1. 缩容命令:
kubectl scale rs nginx-rs--replicas=1
  1. 观察现象:
kubectl get pods

会看到2Pod状态为Terminating,此时集群总Pod数量=3,大于目标replicas=1

  1. 查看终止中副本数量:
kubectl get rs nginx-rs-oyaml

status.terminatingReplicas字段能看到正在销毁的Pod个数,等待优雅停止完成后数量回归1。

4.6 HPA 自动扩缩容

RS可作为HPA伸缩目标,自动调整副本数:

apiVersion:autoscaling/v1kind:HorizontalPodAutoscalerspec:scaleTargetRef:apiVersion:apps/v1kind:ReplicaSetname:frontend minReplicas:3maxReplicas:10targetCPUUtilizationPercentage:50

快捷命令:

kubectl autoscale rs frontend--min=3--max=10--cpu=50%

5. 替代方案对比

控制器核心能力使用场景
裸 Pod(无控制器)无自愈,故障不重建本地临时测试,禁止线上使用
ReplicaSet仅保证固定Pod数量,无发布更新几乎不用,仅底层支撑Deployment
Deployment复用RS能力,支持滚动更新、回滚、版本管理无状态业务(Web、API服务)首选
StatefulSet稳定网络标识、有序创建/删除、专属持久存储,有状态实例MySQL、Redis集群、Zookeeper、Elasticsearch等有状态中间件
DaemonSet每节点运行1个Pod日志、监控、节点代理
Job/CronJob一次性任务,执行完成即退出离线批处理、定时任务
ReplicationControllerRS前身,仅等值标签选择器,已淘汰新项目不使用

官方建议:优先使用 Deployment,不直接操作 ReplicaSet

http://www.jsqmd.com/news/1163953/

相关文章:

  • 架构师和项目经理:两个角色的分工协作
  • 2026年7月最新金华宇舶官方售后客户服务热线与维修网点地址汇总 - 亨得利官方服务中心
  • 2026年7月最新上海雅典官方售后客服电话及服务网点地址查询 - 亨得利官方服务中心
  • Elasticsearch:V7.17.15部署
  • 怎么寄快递才能便宜呢?2026年7月寄快递省钱攻略 - 生活情报姬
  • HS2汉化补丁终极指南:一键解锁Honey Select 2完整中文体验
  • Windows 命令提示符(CMD)恶意脚本分析篇
  • Agent Runtime 不是一个库,是一个你要运维的进程
  • 2026长春雅思培训主流机构综合实力排行参考 - 互联网科技品牌测评
  • Linux ftpcount命令详解|实时统计FTP在线用户数与并发上限
  • 开源软件供应链安全:openEuler来源安全保障的3个关键检查点
  • Cocos Creator游戏提审避坑指南:性能优化、内存管理与平台兼容性实战
  • 2026年7月最新徐州伯爵官方售后联系电话与客户服务中心网点地址 - 亨得利钟表维修中心
  • 揭秘openeuler/security-baseline架构:从配置加固到持续监测的实现原理
  • 互联网大厂 Java 求职面试:从音视频到微服务
  • 2026 年 AI 修图工具排名|不会 PS 也能出大片,Imagegood 强势上榜 - 米諾
  • openEuler GCC优化从未如此简单:A-FOT自动反馈优化工作原理详解
  • HarmonyOS 6.1 隐式Want跳转实战 — 用action+uri打通应用间调用
  • 2026年永嘉水下打捞电话排行榜,这5家最靠谱! - GrowUME
  • 官网发布|2026江诗丹顿官方售后细则,保养收费表、维修周期、正规网点 - 江诗丹顿官方维修中心
  • LensVLM选择性上下文展开:突破高分辨率图像处理计算瓶颈
  • openEuler SDS SIG:如何参与SDS社区贡献完整指南
  • AI 驱动的独立产品冷启动:从种子用户到增长飞轮
  • 深入理解secDetector驱动模块:cases特性集与core框架开发
  • 2026沈阳除甲醛测评:本地民意推荐,专业服务不玩套路 - 米諾
  • OSAPIChecker开发者指南:如何扩展和定制检查规则
  • Codex配置体系:分层隔离与worktree工程实践
  • Linux Shell 编程基础 —— 更多 bash shell 命令 课堂笔记
  • 构建企业级工业监控系统:FUXA开源SCADA平台架构解析
  • 天线详解(二)