前面我们一起学习了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对象