
而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管道就接受到上面推送来的信息了,根据状态进行每种类型的处理
到此这篇kubectl查看日志命令(kubectl 查看configmap)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/cjjbc/32637.html