kubectl查看日志命令(kubectl 查看configmap)

kubectl查看日志命令(kubectl 查看configmap)syncLoopIter 里有四个 chan 管道 分别是 configCh plegCh syncCh housekeeping 这篇主要聊一下这四个管道的由来 configCh 是通过 list amp watch 的 API SERVER 获得的数据 然后在本地进行比对 推送到 configCh 管道中 看着和 informer 类似

大家好,我是讯享网,很高兴认识大家。



云原生之kubernetes实战部署Octant开源可视化k8s管理平台_kubelet
讯享网

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管道就接受到上面推送来的信息了,根据状态进行每种类型的处理

小讯
上一篇 2025-05-02 22:46
下一篇 2025-05-31 22:17

相关推荐

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