k8s-Informer概要解析(2)

ops/2024/12/12 20:45:34/

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.ppmy.cn/ops/141338.html

相关文章

使用 Temporal 管理和调度 Couchbase SQL 脚本的实际例子

场景描述 目标:使用 Temporal 管理和调度一组 Couchbase SQL 脚本来完成以下任务: 同步数据:从其他数据源同步数据到 Couchbase。 执行数据聚合:运行统计 SQL 查询。 清理过期数据:定期清理 Couchbase 中过期或无效…

原生html+css+ajax实现二级下拉选择的增删改及树形结构列出

<?php $db_host localhost; $db_user info_chalide; $db_pass j8c2rRr2RnA; $db_name info_chalide; /* 数据库结构SQL CREATE TABLE categories ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, parent_id INT DEFAULT 0 ); */ try { $pdo new PD…

[笔记] 持续一个月的电路调试工作

11月下旬&#xff0c;入职一家负责系统集成&#xff0c;但是触手已经触及大量的电力电子相关的模块设计的公司。入职时谈及的工作方向有三个&#xff0c;一个是一款手头正在做的开关电源的调优&#xff1b;一个是一款新型PWM移相开关电源的工作&#xff1b;最后一项是我非常期望…

Cocos创建编辑器扩展的简单介绍

&#xff08;一&#xff09; 创建一个扩展的入口&#xff0c;点击之后会弹出面板&#xff0c;我目前只尝试了第一个模板&#xff08;空白&#xff09;&#xff0c;在里面写下扩展名&#xff08;扩展名不能有大写字母&#xff09;&#xff0c;作者等等信息之后 点击创建扩…

渗透利器-kali工具 (第四章-5) 爬虫入门

Python爬虫入门[spider] 1&#xff0c;交换机制&#xff1a; 服务器与本地的交换机制&#xff1a; http协议&#xff1a;客户端与服务器一种会话的方式。 客户端-------[requests[请求]]------->服务器 客户端-------[response[响应]]------>服务器 HTTP请求&#xff1a…

【HarmonyOS实战开发】鸿蒙JS崩溃分析

当未处理的JS异常导致应用意外退出时&#xff0c;应用会生成对应的JS崩溃日志文件&#xff0c;开发者可通过错误日志查看引起崩溃的代码位置及分析应用崩溃的原因。本文将分别介绍JS崩溃分析思路以及典型分析案例。 一、日志信息 以下是崩溃日志信息中对应字段解释。 Device…

F5-TTS文本语音合成模型的使用和接口封装

F5-TTS文本语音生成模型 1. F5-TTS的简介 2024年10月8日&#xff0c;上海交通大学团队发布&#xff0c;F5-TTS (A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching) 是一款基于扩散Transformer和ConvNeXt V2的文本转语音 (TTS) 模型。F5-TTS旨在生成流…

go语言的成神之路-筑基篇-gin常用功能

第一节-gin参数绑定 目录 第一节-?gin参数绑定 ShouldBind简要概述 功能&#xff1a; 使用场景&#xff1a; 可能的错误&#xff1a; 实例代码 效果展示 第二节-gin文件上传 选择要上传的文件 选择要上传的文件。 效果展示? 代码部分 第三节-gin请求重定向 第…