AI 年度盘点与2025发展趋势展望,50+案例解析亮相AICon 了解详情
写点什么

“高冷”的 Kubernetes Informer 一探究竟

  • 2020-03-04
  • 本文字数:2522 字

    阅读完需:约 8 分钟

“高冷”的 Kubernetes Informer 一探究竟

今天给到大家介绍一下 Client-go 中的一个非常关键的工具包 Informer。 Informer 内部实现极其复杂,详细介绍的文章也很少,很多人反馈比较难用。但不得不承认它也是一个设计精良、安全可靠的组件,值得我们去一探究竟。

Informer 简介

Informer 基础功能


Informer 是 Client-go 中的一个核心工具包。在 Kubernetes 源码中,如果 Kubernetes 的某个组件,需要 List/Get Kubernetes 中的 Object,在绝大多 数情况下,会直接使用 Informer 实例中的 Lister()方法(该方法包含 了 Get 和 List 方法),而很少直接请求 Kubernetes API。Informer 最基本 的功能就是 List/Get Kubernetes 中的 Object。


如下图所示,仅需要十行左右的代码就能实现对 Pod 的 List 和 Get。


Informer 高级功能


Client-go 的首要目标是满足 Kubernetes 的自身需求。Informer 作为其中的核心工具包,面对 Kubernetes 极为复杂业务逻辑,如果仅实现 List/Get 功能,根本无法满足 Kubernetes 自身需求。因此,Informer 被设计为一个灵活而复杂的工具包,除 List/Get Object 外,Informer 还可以监听事件并触发回调函数等,以实现更加复杂的业务逻辑。

Informer 设计思路

Informer 设计中的关键点


为了让 Client-go 更快地返回 List/Get 请求的结果、减少对 Kubenetes API 的直接调用,Informer 被设计实现为一个依赖 Kubernetes List/Watch API 、可监听事件并触发回调函数的二级缓存工具包。


更快地返回 List/Get 请求,减少对 Kubenetes API 的直接调用


使用 Informer 实例的 Lister() 方法, List/Get Kubernetes 中的 Object 时,Informer 不会去请求 Kubernetes API,而是直接查找缓存在本地内存中的数据(这份数据由 Informer 自己维护)。通过这种方式,Informer 既可以更快地返回结果,又能减少对 Kubernetes API 的直接调用。


依赖 Kubernetes List/Watch API


Informer 只会调用 Kubernetes List 和 Watch 两种类型的 API。Informer 在初始化的时,先调用 Kubernetes List API 获得某种 resource 的全部 Object,缓存在内存中; 然后,调用 Watch API 去 watch 这种 resource,去维护这份缓存; 最后,Informer 就不再调用 Kubernetes 的任何 API。


用 List/Watch 去维护缓存、保持一致性是非常典型的做法,但令人费解的是,Informer 只在初始化时调用一次 List API,之后完全依赖 Watch API 去维护缓存,没有任何 resync 机制。


笔者在阅读 Informer 代码时候,对这种做法十分不解。按照多数人思路,通过 resync 机制,重新 List 一遍 resource 下的所有 Object,可以更好的保证 Informer 缓存和 Kubernetes 中数据的一致性。


咨询过 Google 内部 Kubernetes 开发人员之后,得到的回复是:


> 在 Informer 设计之初,确实存在一个 relist 无法去执 resync 操作, 但后来被取消了。原因是现有的这种 List/Watch 机制,完全能够保证永远不会漏掉任何事件,因此完全没有必要再添加 relist 方法去 resync informer 的缓存。这种做法也说明了 Kubernetes 完全信任 etcd。


可监听事件并触发回调函数


Informer 通过 Kubernetes Watch API 监听某种 resource 下的所有事件。而且,Informer 可以添加自定义的回调函数,这个回调函数实例(即 ResourceEventHandler 实例)只需实现 OnAdd(obj interface{}) OnUpdate(oldObj, newObj interface{}) 和 OnDelete(obj interface{}) 三个方法,这三个方法分别对应 informer 监听到创建、更新和删除这三种事件类型。


在 Controller 的设计实现中,会经常用到 informer 的这个功能。 Controller 相关文章请见此文《如何用 client-go 拓展 Kubernetes 的 API》。


二级缓存


二级缓存属于 Informer 的底层缓存机制,这两级缓存分别是 DeltaFIFO 和 LocalStore。


这两级缓存的用途各不相同。DeltaFIFO 用来存储 Watch API 返回的各种事件 ,LocalStore 只会被 Lister 的 List/Get 方法访问 。


虽然 Informer 和 Kubernetes 之间没有 resync 机制,但 Informer 内部的这两级缓存之间存在 resync 机制。


以上是 Informer 设计中的一些关键点,没有介绍一些太细节的东西,尤其对于 Informer 两级缓存还未做深入介绍。下一章节将对 Informer 详细的工作流程做一个详细介绍。

Informer 详细解析

Informer 内部主要组件


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


Informer 关键逻辑解析


我们以 Pod 为例,详细说明一下 Informer 的关键逻辑:


1.Informer 在初始化时,Reflector 会先 List API 获得所有的 Pod


2.Reflect 拿到全部 Pod 后,会将全部 Pod 放到 Store 中


3.如果有人调用 Lister 的 List/Get 方法获取 Pod, 那么 Lister 会直接从 Store 中拿数据



4.Informer 初始化完成之后,Reflector 开始 Watch Pod,监听 Pod 相关 的所有事件;如果此时 pod_1 被删除,那么 Reflector 会监听到这个事件


5.Reflector 将 pod_1 被删除 的这个事件发送到 DeltaFIFO


6.DeltaFIFO 首先会将这个事件存储在自己的数据结构中(实际上是一个 queue),然后会直接操作 Store 中的数据,删除 Store 中的 pod_1


7.DeltaFIFO 再 Pop 这个事件到 Controller 中


8.Controller 收到这个事件,会触发 Processor 的回调函数



9.LocalStore 会周期性地把所有的 Pod 信息重新放到 DeltaFIFO 中


Informer 总结

Informer 的内部原理比较复杂、不太容易上手,但 Informer 却是一个非常稳定可靠的 package,已被 Kubernetes 广泛使用。但是,目前关于 Informer 的文章不是很多,如果文章中有表述不正确的地方,希望各位读者悉心指正。


作者介绍:李昂,曾经就职于七牛,参与七牛大数据产品的开发工作,加入才云科技后,主要负责 Devops 的相关工作,才云科技云平台容器工程师。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/3vlclIP-rSbWH4bplduexA


2020-03-04 20:521716

评论

发布
暂无评论
发现更多内容

【Y 新闻】YMatrix携手三一集团,荣获“2023爱分析·数据库最佳实践案例”

YMatrix 超融合数据库

超融合数据库 YMatrix 三一集团 数据库最佳实践案例 泵涌云

公开免费的代理ip有哪些不足的地方?

巨量HTTP

代理IP 免费代理ip

前沿技术产业应用的未来

百度开发者中心

#人工智能 文心一言 文心大模型 大模型微调

探索未来的人机交互方式

百度开发者中心

#人工智能 生成式AI 文心大模型‘

我也能打造自己的「超级 App」?

FinClip

eosio.system智能合约介绍(四)合约部署介绍

BSN研习社

直播预告 | 博睿学院:浅谈可观测性的价值

博睿数据

马斯克警告威胁,奥特曼自请监管,小扎呼吁开源丨RTE开发者日报 Vol.49

声网

极致优化 SSD 并行读调度

百度Geek说

架构 后端 SSD 企业号9月PK榜

软件测试/测试开发名企定向培养训练营,升职加薪快人一步!

测试人

软件测试 测试开发

在对接自有账户体系时,FinClip 是怎么做的?

FinClip

Enhancer-轻量化的字节码增强组件包

得物技术

aop 字节码增强 性能监控 轻量级 企业号9月PK榜

又一重磅利好来袭!Zebec Payroll 集成至 Nautilus Chain 主网

大瞿科技

Kafka如何修改分区Leader

石臻臻的杂货铺

kafka

面对一家营收上千亿的焦化厂,这家数科公司靠什么赋能业务?

用友BIP

数科公司 2023全球商业创新大会 升级数智化底座

使用cpu模型运行时报异常错误

矩视智能

机器视觉

AI已经改变游戏规则,新环境下如何用好这一新利器,提升开发团队的生产力

龙智—DevSecOps解决方案

华为云盘古大模型加码生物医药,为行业插上“数字翅膀”

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 华为云盘古大模型 企业号9月PK榜

软件测试/测试开发丨探索AI与测试报告的完美结合,提升工作效率

测试人

人工智能 程序员 软件测试 测试报告 ChatGPT

云的灵魂是人工智能

Finovy Cloud

QCA9890-MU-MIMO- and QCA9880-MIMO-different wireless communication standards

wifi6-yiyi

MU-MIMO MIMO

汽车行业解决方案 | 龙智总经理杨林晶作客ACT汽车电子与软件技术周,并接受专访

龙智—DevSecOps解决方案

如何选择美国多IP服务器租用,提升网站排名的秘密武器

一只扑棱蛾子

站群服务器

对话在行人|远东数智采:数智底座创新,让招投标规范高效

用友BIP

2023全球商业创新大会 对话在行人

软件测试/测试开发丨web自动化——cypress测试框架

测试人

软件测试 Cypress

java中有哪些并发的List?只知道一种的就太逊了

程序那些事

Java 程序那些事 面试秘籍

【案例教学】华为云API图像搜索ImageSearch的快捷性—AI帮助您快速归类图片

华为云PaaS服务小智

云计算 软件开发 华为云

黑色间歇泉黑暗的信使 Black Geyser Couriers of Darkness for mac(奇幻角色扮演)v1.2.56永久激活版

mac

windows 角色扮演游戏 Mac游戏下载 Black Geyser Couriers

GaussDB(DWS)性能调优:Sort+Groupagg聚集引起的性能瓶颈案例

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号9月PK榜

Keka软件下载 压缩和解压缩软件 Keka mac v1.3.3中文激活版

mac

解压缩软件 苹果mac Windows软件 Keka

“高冷”的 Kubernetes Informer 一探究竟_文化 & 方法_才云科技_InfoQ精选文章