k8s-replicaset控制器

  • Post author:
  • Post category:其他


前面我们一起学习了pod的原理和一些基本使用,但是在实际使用的时候并不会直接使用pod,而是会使用各种控制器来满足我们的需求,kubernetes中运行了一系列控制器来确保集群的当前转台与期望状态保持一致,他们就是kubernetes的大脑,例如,replicaset控制器负责维护集群汇总运行的pod数量,node控制器负责监控节点的状态,并在节点出现故障时及时作出相应,总而言之,在kubernetes中,每个控制器只负责某种类型的特定资源。

控制器 kubernetes控制器会监听资源的 创建/更新/删除事件,并出发reconcile函数作为响应, 调整过程称为reconcile loop 调谐循环,或者sync loop 同步循环,reconcile是一个使用资源对象的命名空间和资源对象名称来调用的函数,使得资源对象的实际状态与资源清单中定义的状态保持一致,调用完成后,reconcile会将资源对象的状态更新为当前实际状态,就是kubernetes项目中的一个通用编排模式,控制循环control  loop

repliaSet

RS 的主要作用就是维持一组pod副本的运行,保证一定数量的pod的集群中正常运行,replicaset控制器会将持续监听,控制这些pod的运行状态,pod发送故障数量减少或者增加时会触发调用过程,始终保持一定副本数量

apiVersion: app/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
  namespace: dafault
spec:
   replicas:3
   selector:
     matchLabels:
       app: nginx
   template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          images: nginx
          ports:
          - containerPort: 80
         
    

上面的yaml文件结构和我们之前定义的pod看上去没太大两样,有常见的apiVersion ,kind,metadata,在spec下面描述的replicaSet的基本信息,其中包含三个重要内容

replicas 表示期望的pod的基本数量

selector :Label Selector用来匹配要控制的pod标签,需要和下面的pod模板中的标签一致

template: pod模板,实际上就是以前我们定义的pod内容,相当于pod的描述以模板的形式嵌入到replicaset中来

pod模板  template  这个概念非常重要,因为后面我们讲解到的大多数控制器都会使用pod模板来统一定义它所要管理的pod

通过查看rs kubectl  get  rs  nginx-rs  可以看到当前资源对象的描述信息,包括SESIRED   CURRENT  READY  的状态值,创建完成后

kubectl   get pods  -l  app=nginx

查看pod状态,selector选中,matchLabels。 -l  app=nginx ,创建是使用的是默认的namespace:dafault,此处不需要代  -n

可以看到现在有3个pod,这三个pod就是我们在RS声明的副本数  replicas:3

可以看出又重新出现了一个pod,这个就是上面我们说的replicaSet控制器为我们做的工作,我们在yaml文件中声明了3个副本,然后删除了一个副本,这时候pod,DESIRED和CURRENT不一致,所以就需要启动一个新的pod来保持三个副本,这个过程上面我们说了就是调谐的过程,同样可以查看RS的描述信息来查看到相关的事件信息

[root@master1 ~]# kubectl  describe  rs  nginx-rs
Name:         nginx-rs
Namespace:    default
Selector:     app=nginx
Labels:       <none>
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  44m   replicaset-controller  Created pod: nginx-rs-6pgn4
  Normal  SuccessfulCreate  44m   replicaset-controller  Created pod: nginx-rs-vrn6z
  Normal  SuccessfulCreate  44m   replicaset-controller  Created pod: nginx-rs-rwnnm
  Normal  SuccessfulCreate  43m   replicaset-controller  Created pod: nginx-rs-529q6

可以发现最开始通过replicaSet控制器创建了3个pod,后面我们删除了pod后,replicaSet控制器又为我们创建了一个pod,和上面我们的描述是一致的,如果这个时候我们吧RS 资源对象replicas改为2

可以看到replicaSet控制器在发现我们的资源声明中副本数变为2后,就主动删除了一个pod,这样副本数就和期望保持一致了

我们可以查看一个pod的描述信息可以看到这个pod的所属控制器信息。另外被replicaSet持有的pod有一个metadata.ownerReferences指针指向当前的replicaSet,表示当前的pod的所有者,这个引用主要会被集群中的垃圾收集器使用以清理丢失所有者的pod对象,这个ownerRefences和数据库中的外键是不是非常类似。

如果要彻底删除pod,我们就只能删除RS对象



版权声明:本文为ens160原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。