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

【k8s系列】Kubernetes ReplicaSet 原理机制与基础应用要点

一、前言

在当下容器化技术蓬勃发展的时代,Kubernetes 作为容器编排领域的主流平台,其重要性不言而喻。而在 Kubernetes 的众多核心组件中,ReplicaSet 占据着关键地位。作为集群资源管理的重要一环,ReplicaSet 负责确保应用程序在集群中始终保持预期数量的副本运行,为应用的高可用性和负载均衡提供了坚实保障。​

本文将结合自己的一些使用经理分享一些关于 ReplicaSet 的工作原理,并详细阐述基础应用的关键要点,帮助正在学习k8s的小伙伴们在 Kubernetes 环境中精准运用 ReplicaSet,提升技术能力与工作效率。

二、ReplicaSet 的工作原理

ReplicaSet 主要靠几个关键设置来干活。​

选择算符(Selector)

它就像个聪明的筛子,能按照咱们设定的标签(Label)等条件,从一堆 Pod 里挑出符合要求的。比如说,咱们给处理用户请求的 Pod 都贴上 “app=web-server” 的标签,那 ReplicaSet 用这个选择算符,就能快速找到这些属于 “web-server” 应用的 Pod。​

副本数(Replicas)

这就是个明确的数字,告诉 ReplicaSet 任何时候要保证有多少个 Pod 副本在运行。要是设定副本数是 3,那 ReplicaSet 就得想尽办法,不管出啥状况,都得让 3 个符合条件的 Pod 正常工作。​

Pod 模板(Pod Template)

当 ReplicaSet 发现 Pod 副本数量不够,需要建新 Pod 时,就按这个模板来生成新的。这个模板就像详细的施工图纸,新 Pod 的各种配置,像容器用啥镜像版本、要多少资源、环境变量咋设置,都写得明明白白。比如在有好多微服务的 K8s 集群里,针对某个微服务的 Pod 模板,会清楚写上这个微服务容器的镜像地址,还有每个容器要多少 CPU、内存等资源。​

ReplicaSet 最厉害的地方,就是能自动保持 Pod 副本数量稳定。它会一直盯着实际在运行的 Pod 数量,一旦发现和设定的副本数不一样,马上就行动。要是实际 Pod 数量比设定的少,就按 Pod 模板创建新的;要是多了,就把多余的 Pod 删掉,总之得让副本数量一直和设定的一样。​

ReplicaSet 和 Pod 是咋关联起来的呢?

靠 Pod 上的 metadata.ownerReferences 字段。这个字段就像个 “家族标记”,说明这个 Pod 归谁管。ReplicaSet 管理的每个 Pod,在 ownerReferences 字段里都会有对应的 ReplicaSet 标识。有了这个关联,ReplicaSet 就能随时知道它管的 Pod 们运行得咋样,不管是正常、启动中还是出故障了,都能掌握,然后决定下一步咋做,比如要不要建新 Pod 替换出故障的。​

Pod 是咋被 ReplicaSet 管起来的呢?

ReplicaSet 用选择算符来找到要管的 Pod。要是一个 Pod 没有 OwnerReference,或者它的 OwnerReference 不是指向某个控制器,还能和某个 ReplicaSet 的选择算符对上,那这个 Pod 马上就会被这个 ReplicaSet 管起来。这就像新来了个 “自由人”,只要符合特定的 “招募条件”(选择算符),就会被相应的 “团队”(ReplicaSet)收编,接受统一管理和调度。​

 三、ReplicaSet 的核心功能与定位

所以结合它的工作原理其实我们不难发现,其实ReplicaSet 作为 Kubernetes 集群中保障应用稳定性与弹性的关键组件,其核心功能聚焦于确保在任意时刻,都存在指定数量的 Pod 副本处于稳定运行状态。这一核心功能的实现,主要还是依赖于以下三种精细且高效的机制协同运作:

自愈能力:自动检测并替换故障 Pod(如节点宕机、容器崩溃);

在复杂的生产环境中,故障随时可能发生。 ReplicaSet 拥有敏锐的故障检测机制,能够自动且实时地监测 Pod 的运行状态。一旦察觉到有 Pod 出现故障,比如因节点突然宕机,导致 Pod 失去运行载体,或者容器内部进程崩溃,使得容器无法正常提供服务等异常情况,它便会立即启动自愈流程。通过快速创建新的 Pod 实例,来无缝替换出现故障的 Pod,从而保证整个应用系统的服务连续性,最大程度减少故障对业务的影响。

动态扩缩容:根据 replicas 字段调整 Pod 数量;

业务负载并非一成不变,在不同的时段、面对不同的业务场景,对资源的需求差异显著。 ReplicaSet 巧妙地依据 replicas 字段来灵活调整 Pod 的数量。当业务流量激增,现有 Pod 副本数量难以承载时,它能够迅速响应,按照预设的规则增加 Pod 的数量,为应用提供充足的计算资源,确保服务的高效运行。反之,当业务负载下降,多余的 Pod 副本造成资源浪费时,它又能精准地减少 Pod 数量,优化资源配置,降低成本。这种动态扩缩容机制,让应用能够像一位训练有素的舞者,灵活应对业务负载的变化旋律。

标签选择器:基于集合型(Set-based)选择器(如 matchExpressions)精准筛选目标 Pod。

在 Kubernetes 集群这个庞大的资源海洋中,精准定位目标 Pod 至关重要。 ReplicaSet 支持使用多种复杂逻辑操作符,诸如 In、NotIn 等。举例来说,若要筛选出所有属于特定版本或者特定环境的 Pod,通过巧妙组合这些操作符,就能构建出精准的筛选规则,极大提升了筛选的灵活性和准确性。

四、ReplicaSet与 Deployment 的协同关系

Deployment 主要负责策略层面的定义,类似于指挥官角色,精细规划应用的滚动更新、回滚等高级操作流程。

以滚动更新为例,Deployment 会精确设定每次更新时允许同时替换的 Pod 数量、更新时间间隔等关键参数,以此在更新过程中,最大程度降低对业务的影响,并高效推进新版本的部署。

回滚策略同样由 Deployment 制定,明确触发回滚的条件,如新版本出现严重故障时,以及回滚的具体步骤和目标版本。​

ReplicaSet 则负责具体的执行任务,如同执行力极强的执行者,专注于 Pod 副本的生命周期管理。它严格遵循 Deployment 下达的指令,认真执行创建、监控及销毁 Pod 副本的操作。

当 Deployment 触发镜像更新时,协同流程便会有序展开。Deployment 首先基于新的镜像配置创建全新的 ReplicaSet,新的 ReplicaSet 随即启动并开始创建新的 Pod 副本。同时,它会依照 Deployment 预先设定的滚动更新节奏,逐步替换旧版本的 Pod 副本。

在此过程中,旧的 ReplicaSet 不会立即被拆除,而是被妥善保留。这是因为一旦新镜像部署出现问题,需要进行回滚操作,旧的 ReplicaSet 就能迅速恢复工作,将 Pod 副本恢复到之前稳定的版本状态,确保应用的正常运行不受过多干扰。

通过 Deployment 制定策略、ReplicaSet 负责执行的高效协作模式,Kubernetes 集群得以实现应用的平滑升级、可靠运行以及灵活的版本管理。

但是实际上,Deployment 是一个可以拥有 ReplicaSet 并使用声明式方式在服务器端完成对 Pod 滚动更新的对象。 尽管 ReplicaSet 可以独立使用,目前它们的主要用途是提供给 Deployment 作为编排 Pod 创建、删除和更新的一种机制。所以一般我们使用 Deployment配置就OK了,我们不必关心如何管理它所创建的 ReplicaSet。

五、ReplicaSet的基础使用示例

这里我们使用 vim 创建配置文件:

root@master01:/opt/cri-docker-file# vim frontend-rs.yaml

以nginx镜像为例,输入以下内容(注意缩进和符号):

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend-rs
  labels:
    env: production
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values: [web, api]
      - key: env
        operator: NotIn
        values: [test]
  template:
    metadata:
      labels:
        app: web
        env: production
        version: v1.2.0
    spec:
      containers:
      - name: nginx
        image: nginx:1.23.4-alpine
        resources:
          limits:
            memory: "256Mi"
            cpu: "500m"
        readinessProbe:
          httpGet:
            path: /healthz
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10

应用配置并验证:

root@master01:/opt/cri-docker-file# kubectl apply -f frontend-rs.yaml

# 查看创建结果(注意READY列显示3/3)
root@master01:/opt/cri-docker-file# kubectl get rs frontend-rs -o wide
NAME          DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES                   SELECTOR
frontend-rs   3         3         3       27s   nginx        nginx:1.23.4-alpine      app in (web,api),env notin (test)

配置说明 

matchExpressions:
  - key: app
    operator: In
    values: [web, api]  # 同时捕获 web 和 api 两类应用
  - key: env
    operator: NotIn
    values: [test]      # 排除测试环境Pod

当需要跨多个微服务管理副本时(如同时管理订单服务和支付服务),该配置可避免创建多个重复的 ReplicaSet。

资源配额检查

# 查看当前命名空间配额限制
root@master01:/opt/cri-docker-file# kubectl describe quota -n production
Name:            mem-cpu-quota
Resource         Used  Hard
--------         ---   ---
limits.cpu       1500m 2000m
limits.memory    768Mi 1Gi

若配额不足,会出现类似错误事件:

FailedCreate: pods "frontend-rs-xxxx" is forbidden: exceeded quota...

紧急扩容操作

# 从3副本扩展到5副本(应对突发流量)
root@master01:/opt/cri-docker-file# kubectl scale rs frontend-rs --replicas=5

# 观察Pod启动过程(注意STATUS列变化)
root@master01:/opt/cri-docker-file# watch kubectl get pods -l app=web
NAME                READY   STATUS              RESTARTS   AGE
frontend-rs-aaaaa   1/1     Running             0          2m
frontend-rs-bbbbb   1/1     Running             0          2m
frontend-rs-ccccc   1/1     Running             0          2m
frontend-rs-ddddd   0/1     ContainerCreating   0          5s
frontend-rs-eeeee   0/1     Pending             0          3s

声明式缩容(GitOps 实践)

# 修改副本数为2并应用变更
root@master01:/opt/cri-docker-file# kubectl patch rs frontend-rs -p '{"spec":{"replicas":2}}'

# 查看变更事件(关键信息过滤)
root@master01:/opt/cri-docker-file# kubectl describe rs frontend-rs | grep -A5 Events
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulDelete  42s   replicaset-controller  Deleted pod: frontend-rs-ccccc
  Normal  SuccessfulDelete  42s   replicaset-controller  Deleted pod: frontend-rs-ddddd

接管现有 Pod

# 手动创建符合标签规则的Pod(模拟意外创建的实例)
root@master01:/opt/cri-docker-file# kubectl run rogue-pod --image=nginx:1.23.4-alpine --labels="app=web,env=production"

# 观察ReplicaSet的自我调节
root@master01:/opt/cri-docker-file# kubectl get pods -l app=web --show-labels
NAME                READY   LABELS
frontend-rs-aaaaa   1/1     app=web,env=production,version=v1.2.0
frontend-rs-bbbbb   1/1     app=web,env=production,version=v1.2.0
rogue-pod           1/1     app=web,env=production  # 10秒后该Pod消失

下线操作

# 保留Pod删除控制器(用于迁移到新版本)
root@master01:/opt/cri-docker-file# kubectl delete rs frontend-rs --cascade=orphan

# 验证控制器已删除但Pod仍在运行
root@master01:/opt/cri-docker-file# kubectl get rs 2>/dev/null; kubectl get pods -l app=web
No resources found in default namespace.  # ReplicaSet已删除

NAME                READY   STATUS    RESTARTS   AGE
frontend-rs-aaaaa   1/1     Running   0          8m
frontend-rs-bbbbb   1/1     Running   0          8m

Pod隔离

# 修改Pod标签使其脱离ReplicaSet管控
root@master01:/opt/cri-docker-file# kubectl label pod frontend-rs-aaaaa app=legacy --overwrite

# 观察ReplicaSet自动补充新Pod
root@master01:/opt/cri-docker-file# kubectl get pods -l app=web
NAME                READY   STATUS        LABELS
frontend-rs-aaaaa   1/1     Terminating   app=legacy,env=production
frontend-rs-fffff   1/1     Running       app=web,env=production

健康检查验证

# 进入容器禁用健康检查端点(模拟故障)
root@master01:/opt/cri-docker-file# kubectl exec -it frontend-rs-aaaaa -- sh -c "mv /usr/share/nginx/html/healthz /tmp/"

# 观察readinessProbe失败现象
root@master01:/opt/cri-docker-file# kubectl describe pod frontend-rs-aaaaa | grep -A10 "Readiness"
……
Readiness probe failed: HTTP probe failed with statuscode: 404

六、总结

在 Kubernetes 的生态体系里,ReplicaSet 堪称保障应用弹性的坚固基石。其核心价值主要还是体现在以下3点:

  1. 稳定性:通过副本控制确保服务可用性;
  2. 灵活性:支持复杂标签选择与非模板 Pod 管理;
  3. 可扩展性:与 HPA、Deployment 等组件无缝协作。

尽管 Deployment 在大多数场景中更易用,但理解 ReplicaSet 的底层机制仍是一个技术人员排查问题、优化性能的关键。例如,当 Deployment 在执行滚动更新过程中出现异常,如更新进度停滞、新老版本 Pod 交替失败等情况时,直接深入检查与之关联的 ReplicaSet 事件,往往能够快速找到问题的突破口。

通过分析 ReplicaSet 创建新 Pod 副本时遇到的错误信息、旧 Pod 副本的删除状态以及与其他组件的交互日志,我们能够精准定位问题根源,无论是资源配置不足、镜像拉取失败,还是网络连接异常等,进而采取针对性的措施加以解决,确保应用的稳定运行与持续优化。


http://www.kler.cn/a/592336.html

相关文章:

  • 【QT 多线程示例】两种多线程实现方式
  • Redis 面试思路
  • 【算法day15】最接近的三数之和
  • Spring Boot 启动参数终极解析:如何优雅地控制你的应用?
  • Unity Shader Graph高级节点逻辑设计:程序化噪声生成技术详解
  • 【后端】【Djagno】【ORM】models.ManyToManyField 多对多字段类型全解
  • 目标检测——清洗数据
  • 进程控制~
  • 第6章:Dockerfile最佳实践:多阶段构建与镜像优化
  • 【Java】——方法的使用(从入门到进阶)
  • 人工智能助力家庭机器人:从清洁到陪伴的智能转型
  • 计算机网络基础:展望未来网络发展趋势
  • 自然语言处理入门4——RNN
  • Java 的 正则表达式
  • 【海螺AI视频】蓝耘智算 | AI视频新浪潮:蓝耘MaaS与海螺AI视频创作体验
  • 基于Spring Boot的项目申报系统的设计与实现(LW+源码+讲解)
  • JVM的一些知识
  • 浏览器工作原理深度解析(阶段四):排版系统与布局计算一、引言
  • 基于百度翻译的python爬虫示例
  • C++高频(五)之虚函数