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提供了生命周期管理和运维自动化的框架。

ReplicaSet(RS)控制器

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

清单文件写法

bash 复制代码
---
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

bash 复制代码
[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

  • 方法二:使用命令修改

bash 复制代码
[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
bash 复制代码
[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删除

bash 复制代码
# 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>
相关推荐
宋小米的csdn11 分钟前
Docker基本操作命令
运维·docker·容器
ccnnlxc3 小时前
日志收集Day001
运维·云原生
xsh801442424 小时前
Kubernetes(k8s)和Docker Compose本质区别
docker·容器·kubernetes
007php0076 小时前
go语言zero框架中在线截图chromedp 设置超限的网页长度
java·开发语言·后端·docker·云原生·容器·golang
IT闫6 小时前
【Docker】——安装Docker以及解决常见报错
运维·docker·容器
Xinyi77777 小时前
kubernetes v1.29.XX版本HPA、KPA、VPA并压力测试
容器·kubernetes·云计算
淡黄的Cherry7 小时前
微服务网关,如何选择?
云原生
言之。9 小时前
【k8s面试题2025】2、练气初期
云原生·容器·kubernetes
Xinyi77779 小时前
kubernetes v1.29 xxx docker镜像导入及其vpa Error处理
docker·容器·kubernetes