当前位置: 首页 > news >正文

k8s-Informer概要解析(2)

Client-go 主要用在 k8s 控制器中

什么是 k8s Informer

Informer 负责与 kubernetes APIServer 进行 Watch 操作,Watch 的资源,可以是 kubernetes 内置资源对象,也可以 CRD。

Informer 是一个带有本地缓存以及索引机制的核心工具包,当请求为查询操作的时候,会优先从本地缓存内存去查询数据,而 创建、更新、删除这类操作,则会根据事件通知写入队列 DeltaFIFO 中,同时对应的事件处理过后,更新本地缓存,使得本地缓存与 ETCD 的数据保持一致性。

Informer 内部主要组件

  • Reflector:使用 List-Watch 来保证本地缓存数据的准确性和顺序一致性。List 从 k8s APIServer 中获取该资源的所有实例,得到最新的 ResourceVersion,然后使用 Watch 方法监听该方法resourceVersion之后的所有变化,如果发现对象的实例有如:Added、Updated、Deleted 动作,Reflector 收到”事件通知“,并利用反射机制将监听的结果实例化成具体的对象,然后将资源对象的变化事件存到本地队列 DeltaFIFO 中。
  • DeltaFIFO:是一个增量的队列,记录了资源变化过程,Reflector 就相当于队列的生产者。这个组件可以拆分为两个部分来理解。FIFO 就是一个队列,拥有队列基本操作方法如ADD、UPDATE、DELETE、LIST、POP及CLOSE等,而Delta是一个资源对象存储,保存存储对象的消息类型如 Added、Updated及Deleted 等。
  • LocalStore(Indexer):Informer 不断从 DeltaFIFO 中读取增量。如果遇到事件类型是 Added操作,那么 Informer 会把这个增量对象保持到本地缓存里头,并且还为它创建索引;如果遇到类型为 Deleted 操作,那么 Informer 会在本地缓存删除该对象。此外,LocalStore 不仅用来存储资源对象,而且还自带索引功能的本地存储,LocalStore(Indexer) 与 Etcd 中的数据是完全一致的,当要查询 (Get 或 List)k8s 对象时,可直接请求 LocalStore,这样就减少 Kubernetes APIServer 的资源交互压力。
  • Workqueue:DeltaFIFO 在同步完 LocalStore 后,会 Pop 这个事件到 Controller 中, Controller 会调用事先注册的 ResourceEventHandler 回调函数(如 OnAdd、OnUpdate、 OnDelete)进行处理, 回调函数处理得到的 obj-key放入 Workqueue 中,供 Worker 中的业务逻辑处理。

List-Watch

List-Watch 机制是 k8s 中的异步消息通知机制,通过它能有效的确保了消息的实时性、顺序性及可靠性。

List-Watch 分为两个部门:

  • List 负责调用资源对应的 k8s APIServer 的 RESTful API 获取全局数据列表,并且同步到(本地缓存中)DeltaFIFO。

  • Watch 负责监听资源的变化,并调用相应事件处理函数进行处理,同时维护更新本地缓存,使得本地队列与 Etcd 总数据保持一致。

List 是基于 HTTP 中的短链接实现,Watch 则是基于 HTTP 长链接实现的,Watch 使用长链接方式是为了减轻 k8s APIServer 的访问压力。

Reflector

Reflector 是client-go 中用来监听指定资源的组件,当资源发生变化的时候如ADDED、UPDATE及DELETE操作时,会以事件的形式存入本地队列,然后有对应的方法处理。

在 Reflector 中,核心的部分分别是 List-Watch,其他功能基本都是围绕它来搞的。

在实例化 Reflector 的过程中,其中有ListerWatcher的接口对象,这个结构体对象有两个方法,分别是List和Watch这两个方法实现List-Watch功能。

Reflector 核心逻辑:

  • List:调用List方法获取资源全部列表数据,转换为资源对象列表,然后保存到本地缓存中,

  • 定时同步:定时器定时触发同步机制,定时更新缓存数据,在Reflector结构体对象中,是可以配置定时同步的周期时间的。

  • Watch:监听资源的变化,并且调用对应的事件处理函数来处理

Reflector 组件对于数据更新同步,都是基于 ResourceVersion 来进行,每个资源对象都会有 ResourceVersion 这个属性,当数据发生变化时候 ResourceVersion 也会将以递增的形式更新,这样就确保事件的更新顺序了。

DeltaFIFO

DeltaFIFO 是一个增量的本地队列,记录资源对象的变化过程。它生产者是 Reflector 组件,将监听到的对象,同步到 DeltaFIFO中。

  • FIFO 是一个先进先出的本地队列,负责接收 Reflector 传递过来的事件,并将其按照顺序存储,然后等待事件的处理,若同时出现多个相同的事件,则会被处理一次。FIFO 是队列那么它也会拥有队列相关操作的方法,可以通过 Queue 这个接口对象来实现队列需求的方法的,同时还根据需要扩展一些其他的方法如Pop,AddIfNotPresent等。

  • Delta 是一个资源对象的存储,有两个属性分别是 Type 和 Object

    • Type 表示这个事件类型,如Added表示增量,Update 表示更新等

    • Object 是一个接口类型,它表示k8s 资源对象如Pod和Service等。

总结:

Reflector 的主要作用是通过 Kubernetes Watch API 监听某种 resource 下的所有事件;DeltaFIFO 和 LocalStore 是 Informer 的两级缓存;Lister 主要是被调用 List/Get 方法;Processor 中记录了所有的回调函数实例(即 ResourceEventHandler 实例),并负责触发这些函数。

  • https://github.com/cloudnativeto/sig-kubernetes/issues/11
http://www.lryc.cn/news/500131.html

相关文章:

  • UE5基本数据类型
  • Next.js 系统性教学:中间件与国际化功能深入剖析
  • 鸿蒙HarmonyOS元服务应用开发实战完全指导
  • CT中的2D、MPR、VR渲染、高级临床功能
  • 利用docker-compose来搭建flink集群
  • 力扣打卡10:K个一组翻转链表
  • 深度学习详解
  • 鸿蒙分享(一):添加模块,修改app名称图标
  • 【Redis】not support: redis
  • 【集群划分】含分布式光伏的配电网集群电压控制【33节点】
  • 嵌入式蓝桥杯学习5 定时中断实现按键
  • 【Java】类似王者荣耀游戏
  • C++<基本>:union是没有构造函数和析构函数的
  • SQL中IN和NOT操作符的用法
  • C++平常学习用的
  • JAVA |日常开发中Servlet详解
  • QT实战--QTreeWidget实现两种行颜色+QListWidget样式
  • RPA在IT运维中的实践:自动化监控与维护
  • C# 设置方法执行超时,则执行下一个方法
  • 【iOS】UIImagePickerController
  • 现代企业营销模式创新:链动 2+1 模式 AI 智能名片商城小程序的应用与价值
  • springboot+Loki+Loki4j+Grafana搭建轻量级日志系统
  • 服务器守护进程化
  • 灵途科技亮相2024世界传感器大会 分享光纤光源技术突破
  • day35—蓝桥杯2024年第16届校赛模拟第二期-T4(最小花费)
  • 【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介
  • 游戏引擎学习第38天
  • P1223 排队接水(贪心)
  • 关于springBoot+vue项目中配置SSL证书问题
  • GUI的最终选择:Tkinter