当前位置: 首页 > 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

相关文章:

k8s-Informer概要解析(2)

Client-go 主要用在 k8s 控制器中 什么是 k8s Informer Informer 负责与 kubernetes APIServer 进行 Watch 操作,Watch 的资源,可以是 kubernetes 内置资源对象,也可以 CRD。 Informer 是一个带有本地缓存以及索引机制的核心工具包&#x…...

UE5基本数据类型

bool: 表示布尔值,只有两个取值:true 或 false,用于表示逻辑条件。int8: 表示 8 位的有符号整数,范围是 −128−128 到 127127。uint8: 表示 8 位的无符号整数,范围是 00 到 255255。int16: 表示 16 位的有符号整数&am…...

Next.js 系统性教学:中间件与国际化功能深入剖析

更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 一、Next.js 中间件 (Middleware) 功能解析 1.1 什么是中间件? 1.2 Next.js 中间件的工作机制 1.3 中间件的功能应用 身份验证与授权 请求重定向 修改请…...

鸿蒙HarmonyOS元服务应用开发实战完全指导

内容提要 元服务概述 元服务开发流程 第一个元服务开发 元服务部署与运行 一、服务概述 1、什么是元服务 在万物互联时代,人均持有设备量不断攀升,设备种类和使用场景更加多样,使得应用开发、应用入口变得更加复杂。在此背景下&#x…...

CT中的2D、MPR、VR渲染、高级临床功能

CT中的2D、MPR、VR渲染 在CT(计算机断层扫描)中,2D、MPR(多平面重建)、VR(体积渲染)是不同的图像显示和处理技术,它们各自有独特的用途和优势。下面分别介绍这三种技术:…...

利用docker-compose来搭建flink集群

1.前期准备 (1)把docker,docker-compose,kafka集群安装配置好 参考文章: 利用docker搭建kafka集群并且进行相应的实践-CSDN博客 这篇文章里面有另外两篇文章的链接,点进去就能够看到 (2&…...

力扣打卡10:K个一组翻转链表

链接:25. K 个一组翻转链表 - 力扣(LeetCode) 这道题需要在链表上,每k个为一组,翻转,链接。 乍一看好像比较容易,其实有很多细节。比如每一组反转后怎么找到上一组的新尾,怎么找到…...

深度学习详解

深度学习(Deep Learning,DL)是机器学习(Machine Learning,ML)中的一个子领域,利用多层次(深层)神经网络来自动从数据中提取特征和规律,模仿人脑的神经系统来进…...

鸿蒙分享(一):添加模块,修改app名称图标

码仓库:https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 新建公共模块common 在entry的oh-package.json5添加dependencies,引入common模块 "dependencies": {"common": "file:../common" } 修改app名称&…...

【Redis】not support: redis

1、查看redis进程 2、查看是否安装redis扩展,此处以宝塔为例...

【集群划分】含分布式光伏的配电网集群电压控制【33节点】

目录 主要内容 模型研究 1.节点电压灵敏度的计算 2.Kmeans聚类划分 3.集群K值 部分代码 运行结果 下载链接 主要内容 该程序参考文献《含分布式光伏的配电网集群划分和集群电压协调控制》,基于社团检测算法,实现基于电气距离和区域电压调节能…...

嵌入式蓝桥杯学习5 定时中断实现按键

Cubemx配置 打开cubemx。 前面的配置与前文一样,这里主要配置基本定时器的定时功能。 1.在Timer中点击TIM6,勾选activated。配置Parameter Settings中的预分频器(PSC)和计数器(auto-reload Register) 补…...

【Java】类似王者荣耀游戏

r77683962/WangZheYouDianRongYao 运行效果图: 类似王者荣耀游戏运行效果图_哔哩哔哩_bilibili...

C++<基本>:union是没有构造函数和析构函数的

今天发现当我在union中包含了多个结构体时,结构体有默认构造函数时,编译报错。 问题点: union不支持构造函数和析构函数union中的元素本身也是不支持构造函数和析构函数的。包含union的结构体也不支持构造函数和析构函数。 出错代码如下&a…...

SQL中IN和NOT操作符的用法

1. IN操作符(布尔逻辑) 在SQL中,IN 是一个用于检查某个字段值是否包含在给定的多个可能值中的布尔操作符。它经常与条件表达式一起使用,通常出现在WHERE子句中。 用法: IN操作符用来确定某个字段的值是否存在于给定…...

C++平常学习用的

4.1 友元函数 4.2 友元类 5.2 类模板 7.2 虚函数dynamic_cast运算 7.2 纯虚函数和抽象类...

JAVA |日常开发中Servlet详解

JAVA |日常开发中Servlet详解 前言一、Servlet 概述1.1 定义1.2 历史背景 二、Servlet 的生命周期2.1 加载和实例化2.2 初始化(init 方法)2.3 服务(service 方法)2.4 销毁(destroy 方法) 三、Se…...

QT实战--QTreeWidget实现两种行颜色+QListWidget样式

本文主要介绍了QTreeWidget实现两种行颜色、点击打开父节点以及设置父子节点之间距离,同时附带介绍了QListWidget样式 树效果图: 列表效果图: 1.树样式的实现 1)使用代码: m_pLeftTreeWidget = new QTreeWidget(this);m_pLeftTreeWidget->setObjectName("suolue_t…...

RPA在IT运维中的实践:自动化监控与维护

一、引言 1. IT运维面临的挑战与RPA的机遇 在IT运维领域,日常的监控、维护和故障响应等工作占据了大量的时间和资源。随着技术的发展,RPA技术提供了自动化这些重复性任务的可能性,从而释放IT团队的潜力,让他们能够专注于更复杂和…...

C# 设置方法执行超时,则执行下一个方法

最近在开发过程中遇到了一个问题,在进行通讯连接时,如果没有连接的话会延时几十秒,而且还设置不了连接超时时间,于是我就想着有没有一种可以判断这个方法的执行时间超过多少秒,就跳出执行其他方法,经过大量…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...