前言:

在Kubernetes中,控制器是一种用于管理集群中的多个副本的系统。它们负责确保应用程序的期望状态与实际状态保持一致,并根据需要进行调整。控制器是管理Pod的中间层,使用了Pod控制器后,我们只需要告诉Pod控制器想要多少个什么样的Pod,他就会创建出满足条件的Pod,并确保Pod处于用户期望的状态,如果Pod在运行中出现了故障,控制器会根据已定的策略重启或重建Pod。

常见控制器介绍

  1. ReplicaSet:ReplicaSet是一种用于管理 Pod 副本数量的控制器。它确保指定数量的 Pod 副本在集群中运行,并在需要时创建或删除 Pod 副本,以维持期望的副本数量。所以ReplicaSet控制器可以用于任何需要水平扩展的应用环境,其中多个相同的Pod副本需要以平衡负载或增加可用性的方式运行。
  2. Deployment:Deployment是建立在 ReplicaSet 之上的更高级别的控制器。它提供了对Pod更新、升级和回滚的支持,以及管理应用程序的发布和升级。
  3. StatefulSet:StatefulSet用于管理有状态应用程序的控制器。与ReplicaSet不同,StatefulSet保证了Pod的稳定标识和网络标识,以便在重新调度或扩展时保持唯一性。管理有状态应用。
  4. DaemonSet:DaemonSet是一种用于在集群中的每个节点都运行一个副本的控制器。它通常用于运行守护进程,例如日志收集器、监控代理等。
  5. Job和CronJob:Job控制器用于运行一次性任务,例如批处理作业或定时任务。而CronJob控制器则是在周期的运行作业的控制器。
  6. HorizontalPodAutoscaler:HorizontalPodAutoscaler控制器根据CPU使用率或其他指标自动扩展或缩减Pod的数量,实现削峰填谷以满足应用程序的需求。
  7. Namespace:Namespace控制器用于创建和管理命名空间。它允许用户在集群中创建多个逻辑分区,以便更好地组织和管理资源。

Replicaset控制器

Kubernetes中的ReplicaSet主要的作用是维持一组Pod副本的运行,它的主要作用就是保证一定数量的 Pod 能够在集群中正常运行,它会持续监听这些 Pod 的运行状态,在 Pod 发生故障时重启pod,pod数量减少时重新运行新的Pod副本,因此,它通常被用来保证特定数量相同的Pods的可用性.

  1. 副本数量管理:ReplicaSet控制器负责确保在集群中运行指定数量的Pod副本。通过ReplicaSet控制器可以指定所需的副本数量,控制器将根据当前状态创建或删除Pod副本,以使实际的副本数量达到期望的数量。
  2. 自动扩展和缩减:如果ReplicaSet控制器配置了自动扩展功能,它可以根据指定的指标(如CPU使用率)动态地调整Pod副本的数量。这使得 ReplicaSet 控制器可以根据负载情况自动扩展或缩减Pod副本数量,以适应应用程序的需求。
  3. 故障恢复:如果某个节点上的Pod发生故障或被删除,ReplicaSet控制器将负责在其他节点上重新创建新的Pod副本,以确保应用程序的可用性和稳定性。这种自动故障恢复功能有助于提高应用程序的可靠性。
  4. 版本控制和回滚:通过更新ReplicaSet控制器的Pod模板,可以轻松地更新应用程序的版本。如果更新导致问题或不符合预期,ReplicaSet 控制器可以执行回滚操作,将应用程序恢复到之前的稳定状态
  5. 负载均衡:ReplicaSet控制器通过将多个相同的Pod副本分配到集群中的不同节点上,实现负载均衡。这样可以确保应用程序的请求能够平均分布到各个节点上,从而提高性能和可用性。

ReplicaSet是如何工作的

首先,用户需要定义一ReplicaSet对象,并在其中指定所需的Pod模板和副本数量。Pod模板包括容器镜像、标签、容器配置等信息。ReplicaSet控制器会监视集群中所有与其匹配的Pod,即具有相同的标签选择器的Pod。ReplicaSet通过Pods的metadata.ownerReferences(默认有不必特别定义)字段链接到其Pod,该字段指定当前对象所拥有的资源。由ReplicaSet获取的所有Pod在其ownerReferences字段中都有其自己的ReplicaSet的标识信息。通过此链接,ReplicaSet可以知道它正在维护的Pod的状态。

注:metadata.ownerReferences(默认有不必特别定义)是一个用于指定资源所有者(Owner)的字段。这个字段用于建立资源之间的所有权关系,通常用于跟踪资源之间的父子关系。每个Kubernetes资源对象(如 Pod、Deployment、ReplicaSet 等)都可以有一个或多个所有者。当一个资源对象被另一个资源对象创建时,创建资源对象的资源即为被创建资源对象的所有者。这种所有权关系由metadata.ownerReferences字段来指定。

简单的yaml文件

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: nginx-test
  name: nginx-rep
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-cs
  template:
    metadata:
      labels:
       app: nginx-cs
    spec:
      hostname: nginx-rep
      containers:
      - name: my-nginx  
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80 
      
          

查看yaml文件,我们看到在kind定义为ReplicaSet、spec下有replicas(指定副本数量)、selector(标签选择器)和template(Pod模版)三个关键参数。其中selector中定义的的labels必须和template中metadata定义的labels相匹配。

查看yaml定义的参数:

[root@master yaml]# kubectl get rs --show-labels
NAME        DESIRED   CURRENT   READY   AGE   LABELS
nginx-rep   3         3         3       54s   app=nginx-test

在控制器metadata中定义了标签app=nginx-test,控制器名称nginx-rep。

[root@master yaml]# kubectl get pods --show-labels
NAME              READY   STATUS    RESTARTS   AGE     LABELS
nginx-rep-fzw79   1/1     Running   0          3m21s   app=nginx-cs
nginx-rep-mxsxw   1/1     Running   0          3m21s   app=nginx-cs
nginx-rep-x7jtd   1/1     Running   0          3m21s   app=nginx-cs

在spec下定义了replicase数量为3,顶一个了containers的标签为nginx-cs和标签选择器selector匹配。

replicaSet确保在任何给定时间都运行指定数量的Pod副本,但Deployment是一个高级概念用于管理副本集,并提供对Pod的声明性更新以及许多其他有用的功能。所以除非你需要自定义更新编排或根本不需要更新,否则我们使用Deployment而不是直接使用replicaset。这意味着你可能永远不需要操纵ReplicaSet对象。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐