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

K8S中Pod控制器之ReplicaSet(RS)控制器

Pod控制器介绍

在Kubernetes中,Pod是最小的管理单元,用于运行容器。根据Pod的创建方式,可以将其分为两类:

  • 自主式Pod(Stateless Pods):这些Pod是直接由用户或管理员创建的,通常是通过直接使用kubectl run命令或通过YAML文件定义来创建的。这些Pod在创建后由Kubernetes直接管理,但它们的生命周期是独立的。这意味着如果这些Pod被删除,Kubernetes不会自动重建它们。自主式Pod通常用于运行短生命周期的任务或服务,例如批处理作业、数据迁移等。

  • 控制器创建的Pod(Managed Pods):这些Pod是由Kubernetes控制器创建和管理的。控制器是Kubernetes中的高级对象,它们负责根据定义的规则创建、更新和删除Pod。控制器创建的Pod通常是为了实现更复杂的应用部署和管理需求,例如部署、复制集(ReplicaSet)、状态集(StatefulSet)、DaemonSet等。这些Pod的生命周期是由控制器管理的,如果Pod被删除,控制器会根据其配置自动重建Pod,以确保集群中始终有足够数量的Pod在运行。

Pod控制器(Pod Controller)是Kubernetes中的一种对象,用于管理一组具有相同配置的Pod。Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod。

常见使用场景

Pod控制器用于管理一组Pod,确保它们按照预定的规则运行和扩展。以下是Kubernetes中常见的几种Pod控制器及其适用场景的整理:

  • ReplicationController:这是早期用于确保指定数量的Pod副本始终运行的控制器,但现在已经不推荐使用,其功能被ReplicaSet所替代。

  • ReplicaSet:用于保证Pod的副本数量维持在用户指定的数量。它支持Pod数量的扩缩容,以及Pod模板的更新,但不涉及应用状态的管理。

  • Deployment:是ReplicaSet的扩展,提供了应用的声明式更新能力。它允许用户定义应用的期望状态,自动处理Pod的创建、更新和删除,支持滚动更新和版本回退。

  • Horizontal Pod Autoscaler (HPA):根据CPU使用率或其他选择的度量指标自动扩展Pod的数量,适用于需要根据负载动态调整Pod数量的场景。

  • DaemonSet:确保在集群中的每个Node上都运行一个Pod的副本,通常用于运行集群存储、日志收集等守护进程类任务。

  • Job:用于运行批处理任务,即执行一次性任务。当Pod完成其工作后,Job控制器会负责清理这些Pod。

  • CronJob:用于周期性地创建Job对象,执行定时任务,类似于Unix中的crontab。

  • StatefulSet:用于管理有状态的服务,它为Pod提供了稳定的网络标识、顺序部署、缩放以及扩展和滚动更新的能力。

 Pod控制器分类

Kubernetes的控制器分为以下几类:

  • 无状态应用:由Deployment和ReplicaSet管理,适用于不需要持久化存储的应用。

  • 有状态应用:由StatefulSet管理,适用于需要持久化存储和有序部署的应用。

  • 守护型应用:由DaemonSet管理,适用于需要在所有或特定Node上运行的服务。

  • 批处理应用:由Job和CronJob管理,适用于执行一次性或周期性任务。

 Pod与控制器之间的关系

  • Pod与控制器之间的关系是,控制器是Kubernetes中用于管理一组Pod的高级对象,而Pod是Kubernetes中运行容器的最小单元。

  • 控制器通过定义一组标签选择器来跟踪和控制具有这些标签的Pod。

  • 当Pod因故障而终止时,控制器会根据定义的规则自动创建新的Pod来替换它,从而确保应用的持续运行和所需的副本数量

  • 此外,控制器还负责处理Pod的水平扩展、版本更新和滚动升级等运维任务,而Pod本身只负责运行容器化的应用。

  • 控制器为Pod提供了生命周期管理和运维自动化的框架。

image-20240511105927782

 ReplicaSet(RS)控制器

  • ReplicaSet(RS)是一种Kubernetes控制器,用于确保指定数量的Pod副本始终运行,从而提供高可用性和负载均衡。副本集通过监控和管理Pod的副本数量,自动进行Pod的创建、更新和删除,以维护用户定义的副本数量。

image-20240511110654582

 清单文件写法

---
apiVersion: apps/v1  # 版本号
kind: ReplicaSet  # 类型
metadata:    # 元数据
  name: rs-nginx  # rs名称
  namespace: default  # 所属命名空间
  labels:   # 标签
    controller: rs
spec:   # 详情描述
  replicas: 3  # 副本数量
  selector:    # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:
      app: nginx-pod  # Labels匹配规则
    matchExpressions: # Expressions匹配规则
      - {key: app, operator: In, values: [nginx-pod]}  # Expressions匹配规则
  template:        # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
        - name: nginx
          image: nginx:1.17.1
          ports:
            - containerPort: 80

创建ReplicaSet

[root@k8s-master ~]# kubectl apply -f pc-replicaset.yaml 
---
apiVersion: apps/v1   # 指定了API版本,这是ReplicaSet所使用的API版本
kind: ReplicaSet
metadata:
  name: pc-rs
  namespace: test
spec:
  replicas: 3   # 指定了ReplicaSet应该确保在运行的Pod的数量。
  selector:     # 定义了哪些Pod应该被ReplicaSet管理
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
replicaset.apps/pc-rs created
[root@k8s-master ~]# 
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   0/1     ContainerCreating   0          14s   <none>   k8s-node2   <none>           <none>
pc-rs-fs2ml   0/1     ContainerCreating   0          14s   <none>   k8s-node1   <none>           <none>
pc-rs-xzm7s   0/1     ContainerCreating   0          14s   <none>   k8s-node1   <none>           <none>
[root@k8s-master ~]# kubectl get pod -n test -o wide -w
NAME          READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   0/1     ContainerCreating   0          19s   <none>   k8s-node2   <none>           <none>
pc-rs-fs2ml   0/1     ContainerCreating   0          19s   <none>   k8s-node1   <none>           <none>
pc-rs-xzm7s   0/1     ContainerCreating   0          19s   <none>   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running             0          33s   10.244.36.71   k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running             0          33s   10.244.36.72   k8s-node1   <none>           <none>
^C[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS              RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   0/1     ContainerCreating   0          58s   <none>         k8s-node2   <none>           <none>
pc-rs-fs2ml   1/1     Running             0          58s   10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running             0          58s   10.244.36.71   k8s-node1   <none>           <none>

[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE    IP               NODE        NOMINATED NODE   READINESS GATES
pc-rs-d46gm   1/1     Running   0          113s   10.244.169.129   k8s-node2   <none>           <none>
pc-rs-fs2ml   1/1     Running   0          113s   10.244.36.72     k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          113s   10.244.36.71     k8s-node1   <none>           <none>

#查看rs
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES         SELECTOR
pc-rs   3         3         3       2m8s   nginx        nginx:1.17.1   app=nginx-pod

ReplicaSet扩缩容

  • 方法一:编辑ReplicaSet pc-rs

  • 方法二:使用命令修改

[root@k8s-master ~]# kubectl edit rs pc-rs -n test
replicaset.apps/pc-rs edited
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES         SELECTOR
pc-rs   6         6         6       3m    nginx        nginx:1.17.1   app=nginx-pod
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pc-rs-b24tf   1/1     Running   0          35s     10.244.169.131   k8s-node2   <none>           <none>
pc-rs-d46gm   1/1     Running   0          3m16s   10.244.169.129   k8s-node2   <none>           <none>
pc-rs-f7mqb   1/1     Running   0          35s     10.244.36.73     k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running   0          3m16s   10.244.36.72     k8s-node1   <none>           <none>
pc-rs-mqk6x   1/1     Running   0          35s     10.244.169.130   k8s-node2   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          3m16s   10.244.36.71     k8s-node1   <none>           <none>
[root@k8s-master ~]# kubectl scale rs pc-rs --replicas 2 -n test
replicaset.apps/pc-rs scaled
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS        RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
pc-rs-b24tf   0/1     Terminating   0          66s     10.244.169.131   k8s-node2   <none>           <none>
pc-rs-d46gm   0/1     Terminating   0          3m47s   <none>           k8s-node2   <none>           <none>
pc-rs-f7mqb   0/1     Terminating   0          66s     10.244.36.73     k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running       0          3m47s   10.244.36.72     k8s-node1   <none>           <none>
pc-rs-mqk6x   0/1     Terminating   0          66s     <none>           k8s-node2   <none>           <none>
pc-rs-xzm7s   1/1     Running       0          3m47s   10.244.36.71     k8s-node1   <none>           <none>
[root@k8s-master ~]# kubectl get pod -n test -o wide -w
NAME          READY   STATUS        RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-f7mqb   0/1     Terminating   0          69s     10.244.36.73   k8s-node1   <none>           <none>
pc-rs-fs2ml   1/1     Running       0          3m50s   10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running       0          3m50s   10.244.36.71   k8s-node1   <none>           <none>
pc-rs-f7mqb   0/1     Terminating   0          76s     10.244.36.73   k8s-node1   <none>           <none>
pc-rs-f7mqb   0/1     Terminating   0          76s     10.244.36.73   k8s-node1   <none>           <none>
^C[root@k8s-master ~]# kubectl get pod -n test -o wide 
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-fs2ml   1/1     Running   0          4m    10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          4m    10.244.36.71   k8s-node1   <none>           <none>

 

ReplicaSet镜像更新

  • 方法一编辑ReplicaSet pc-rs

[root@k8s-master ~]# kubectl edit rs pc-rs -n test
replicaset.apps/pc-rs edited
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
pc-rs   2         2         2       4m47s   nginx        nginx:1.17.2   app=nginx-pod
[root@k8s-master ~]# kubectl set image rs pc-rs nginx=nginx:1.17.3 -n test
replicaset.apps/pc-rs image updated
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
NAME    DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES         SELECTOR
pc-rs   2         2         2       5m17s   nginx        nginx:1.17.3   app=nginx-pod

 

ReplicaSet删除

# kubectl delete rs pc-rs -n test

# 如果希望仅仅删除RS对象(保留Pod),可以使用kubectl delete命令时添加--cascade=false选项(不推荐)
 [root@k8s-master ~]# kubectl delete rs pc-rs -n test --cascade=orphan
replicaset.apps "pc-rs" deleted
[root@k8s-master ~]# kubectl get rs pc-rs -n test -o wide
Error from server (NotFound): replicasets.apps "pc-rs" not found
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-fs2ml   1/1     Running   0          12m   10.244.36.72   k8s-node1   <none>           <none>
pc-rs-xzm7s   1/1     Running   0          12m   10.244.36.71   k8s-node1   <none>           <none>
#删除之后,不会重新创建,因为控制器已经被删除
[root@k8s-master ~]# kubectl delete pod pc-rs-fs2ml -n test
pod "pc-rs-fs2ml" deleted
[root@k8s-master ~]# kubectl get pod -n test -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pc-rs-xzm7s   1/1     Running   0          13m   10.244.36.71   k8s-node1   <none>           <none>

 


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

相关文章:

  • 计算机网络 (46)简单网络管理协议SNMP
  • Java 多态/向下转型/instanceof
  • 项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(七)
  • 【Leetcode 热题 100】70. 爬楼梯
  • vue+高德API搭建前端3D交通页面
  • 【Linux系统编程】—— 深度解析进程等待与终止:系统高效运行的关键
  • android 开发中遇到的小问题整理
  • Android平台如何采集屏幕数据并推送RTMP服务器实现无纸化同屏?
  • 项目实战--网页五子棋(游戏大厅)(3)
  • 如何使用 Redis 作为高效缓存
  • 在swiper中显示echarts图表,echarts的点击事件无效,图例点击也没有反应
  • Maven 快速上手
  • [2025分类时序异常检测指标R-AUC与VUS]
  • Spring Boot依赖管理:Maven与Gradle实战对比
  • NPM 下载依赖超时:npm ERR! RequestError: connect ETIMEDOUT
  • Tensor 基本操作1 | PyTorch 深度学习实战
  • 【Rust自学】13.9. 使用闭包和迭代器改进IO项目
  • 无监督<视觉-语言>模型中的跨模态对齐
  • vue按照官网设置自动导入后ElMessageBox不生效问题
  • 从零开始:Spring Boot核心概念与架构解析
  • springboot迅捷外卖配送系统
  • STM32CubeIDE使用笔记(一)
  • 【Spring】原型 Bean 被固定
  • 【25】Word:林涵-科普文章❗
  • yum和vim的使用
  • 【Elasticsearch入门到落地】6、索引库的操作