configCh是通过list&watch的API SERVER获得的数据。然后在本地进行比对,推送到configCh管道中
看着和informer类似,但是这里介绍的不是informer而是newSourceApiserverFromLW方式。他俩主要区别在于:
Informer是一种定期从Kubernetes API Server获取API对象列表并对其进行监视的方式,可以对整个API对象进行监视,包括增加、更新和删除等操作。使用Informer可以帮助我们实现高效的API对象操作,并快速响应API对象的状态变化。如果需要同时监听多个API对象的状态变化,使用Informer是比较合适的选择。
而newSourceApiserverFromLW则是一种通过Watch API监听单个API对象状态变化的方式。相对于Informer,newSourceApiserverFromLW可以避免定期获取整个API对象列表的网络带宽和计算资源浪费,并且可以只监听特定的API对象的状态变化,从而降低系统的复杂度和开销。
- kubelet.go中初始化结构体
- 监听三种数据来源,分别是api、file、http
- channel函数会创建监听
- ChannelWithContext创建goroutine执行listen
2.2.初始化LIST&WATCH(这里是通过api文件变化监听的,非informer)

- 创建监听服务,如果node准备好了,则开启服务
- 注册send函数,函数主要将apiserver传过来的数据重新组装后传给后续使用
- run函数开始触发ListAndWatch函数
- 函数中会触发watch执行
2.3.watch开始执行,收到数据后进行验证(这里是通过api文件变化监听的,非informer。虽然informer的代码也会走到这里,但是还是有区别的)
- add/update/delete虽然触发的函数不一样,但是执行流程都类似的。
- 先把这个数据更新/添加/删除在本地的缓存中。
- 然后遍历所有的已存在的pod数据,然后执行上面流程2中的send函数。
- 把所有pod数据通过send函数推送到一个podList后整体推送到chan管道
- 这次的watch就结束了。等待下次变化
3.上面都是推送的流程,下面开始接收的流程。
- 在创建list&watch的时候,执行channel函数,为每一个来源初始化一个管道。同时会触发协程执行listen函数。同时监听这个管道,并返回给流程2.1
- 通过流程2.1中的send函数,最终数据会在这个channel管道中接收到。然后在liseten中执行
- 执行过交给merge函数
- 接收到数据首先判断来源是否已经注册了
- 验证podList是需要更新还是删除还是调解等(流程4.2)
- 将数据推送到kubelet监听的chan管道中
4.2 判断pod
- 取出老的pod信息
- 注册函数updatePodsFunc
- 用oldPods拿到老pod的数据,同时清空pods数据(通过直接创建一个新的清除旧的)
- 执行函数
- 遍历pod,如果annotations注解为空,初始化,并且赋值来源
- 过滤oldpods,如果oldpods没有这个pod信息,则代表是添加。并且把这个pod信息添加到pods里
- 如果有这个pods信息,则存入pods里(这里为了后续判断是否这个pod被删除了.oldpods存在,pods不存在,则是删除)
- 验证这个pod需要进行什么类型的处理(流程4.3)
- 遍历新的pods数据(上上行说的),如果有oldPods存在的,但是pods不存在的。则是代表删除了
- 将所有数据重新组装返回
4.3检查pod如何处理
- 先检查这个pod和老的pod的spec、labels、DeletionTimestamp、DeletionGracePeriodSeconds、Annotations是否有变化,如果有变化,则需要进行更新处理,说明配置文件变了
- 如果没有变化,判断新老pod的status运行状态是否有变化,如果有变化,则是需要进行调解needReconcile
- 如果pod的spec有变化,则要把老的pod信息更新成新的
- 如果DeletionTimestamp不为nil,则代表删除。否则是更新
5.这时候kubelet的configCh管道就接受到上面推送来的信息了,根据状态进行每种类型的处理

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/196606.html