Bootstrap

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>

 

;