informer简介
Informer是一个能够缓存apiserver的对象到本地、具有索引机制、并可以注册 EventHandler 的 client。使用 informer 的目的是为了减轻 apiserver 数据交互的压力,其中本地缓存被称为 localStore,索引被称为 Indexer。

Informer流程:informer的listandwatch机制,默认启动时从apiserver中整体list一次放到localstore中,有add、delete等事件时会通过watch机制把这个事件+对象放到deltaFIFO中,然后根据deltaFIFO中的内容会先到localstore中更新,之后会经过eventHandler进入workQueue(这部分基于控制器机制实现),且workQueue会有ratelimiter,从而触发controller的reconcile逻辑,并且LocalStore会每隔10h把所有的对象重新放到DeltaFIFO中,从而触发controller。

其中eventHandler的具体实现是predicate。

Informer的详细工作流程
(1)Informer 首先会 list/watch apiserver,Reflector 包使用 ListAndWatch 的方法从 apiserver 中 list短连接 该资源的所有实例,list 会拿到该对象最新的 resourceVersion,然后使用 watch长连接监听该 resourceVersion 之后的所有变化,一旦该对象的实例有创建、删除、更新动作,Reflector 都会收到"事件通知",这时该事件及它对应的API 对象这个组合被称为增量(Delta),它会被放进 DeltaFIFO 中。
(2)Informer 会不断地从这个 DeltaFIFO 中读取增量,每拿出一个对象,Informer 就会判断这个增量的类型并创建或更新本地的缓存store。
如果事件类型是 Added(添加对象),那么 Informer 会通过 Indexer库把这个增量里的 API 对象保存到本地的缓存中,并为它创建索引,若为删除操作,则在本地缓存中删除该对象。
(3)DeltaFIFO 再 pop 这个事件到 controller 中,controller 会根据事先注册的 ResourceEventHandler 回调函数进行处理。在回调函数中其实只是做了一些简单的过滤,然后将关心变更的Object放到workqueue里。
(4)Controller从workqueue里面取出Object,启动一个worker来执行自己的业务逻辑,业务逻辑通常是计算目前集群的状态和用户期望的状态。在worker中也可以使用lister来获取resource,而不用频繁的访问apiserver,因为 apiserver中resource的变更都会反映到本地的cache中。

kubebuilder封装的整体流程:

1、初始化一个manager,并创建cache、client。创建Cache主要是创建InformersMap,Scheme里每个gvk都创建了对应的informer,通过 InformersMap做gvk到informer的映射,每个informer会根据对应的gvk进行List和Watch。创建client主要是读操作使用上面创建的cache,写操作使用客户端直连apiserver。

2/初始化reconciler/controller, 并对Controller 负责的 CRD 及CRD 管理的其他资源进行watch,并且能够注册eventHandler,kubebuilder注册的handler 就是将发生变更的对象的 NamespacedName放入workQueue队列,然后执行 Reconcile逻辑;

3、启动 Manager,分别启动cache、controller。Cache的初始化核心是初始化informerMap,即所有的 Informer;Controller的初始化是启动goroutine不断地查询队列,如果有变更消息则触发到我们自定义的reconcile逻辑。

k8s之informer简单理解相关推荐

  1. k8s之kubebuilder简单理解

    kubebuilder流程 1.创建manager,ctrl.NewManager,包括设置 shemme和端口.选主信息等配置.NewCluster(用来访问k8s,主要包括newCache和New ...

  2. K8s之ControllerRateLimiter简单理解

    1.RateLimiter实现了对于队列元素的重试规则,包括三个函数When获取某个元素应该等待的时间,Forget释放某个元素不再监测,NumRequeues返回该元素已经失败重试的次数. 2.Ra ...

  3. k8s之VelaQL简单理解

    kubevela中利用Application对象对底层资源进行了封装,屏蔽了底层基础架构,但是这样对Application创建的资源状态的监控,就只能依赖Application的状态透出,但状态信息简 ...

  4. android 点击事件消费,Android View事件分发和消费源码简单理解

    Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...

  5. 【转载】Deep learning:十九(RBM简单理解)

    Deep learning:十九(RBM简单理解) 这篇博客主要用来简单介绍下RBM网络,因为deep learning中的一个重要网络结构DBN就可以由RBM网络叠加而成,所以对RBM的理解有利于我 ...

  6. 学习:双机热备、集群、负载均衡、SQL故障转移群集简单理解(转)

    双机热备.集群.负载均衡.SQL故障转移群集简单理解平常,大家常提到几个技术名词:双机热备.集群.负载均衡.SQL故障转移群集.这里,就我的理解,和大家简单探讨下,有不足或错误之处还请各位指出! 这些 ...

  7. 字符串匹配算法Java_如何简单理解字符串匹配算法?

    这篇文章来说说如何简单理解KMP,BM算法.之前看过一些文章说,KMP算法很难理解. 可我并不觉得. 我反而觉得它容易理解.平时我们写java代码的时候, 判断一个字符串是否存在包含另一个字符串都是直 ...

  8. python yield的简单理解

    2019独角兽企业重金招聘Python工程师标准>>> yield是个生成器,它可以使一个方法变成可迭代的方法,每次迭代返回yield后面的值 简单理解: >>>d ...

  9. linun——SElinux的简单理解

    SElinux简单理解 一.什么是SElinux? SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Co ...

最新文章

  1. 2021年大数据ELK(二十六):探索数据(Discovery)
  2. oracle 数据库中(创建、解锁、授权、删除)用户
  3. linux中terminal中编译源码,分享|Terminator:一款一个窗口包含多个终端的 Linux 终端仿真器...
  4. git checkout .的用法
  5. numpy amin amax
  6. 在 ASP.NET 2.0 中上载文件 —— 解决文件大小限制
  7. 充电网完成数千万元Pre-B轮融资,将会聚焦新能源乘用车市场
  8. 并发编程-concurrent指南-阻塞队列BlockingQueue
  9. activiti 常见问题总结
  10. 查找表_leetcode454
  11. VS编译报错Error2019
  12. MySQL日志(一条sql更新语句是如何执行的)
  13. java中的类图_JAVA类图
  14. 课堂经验值管理小程序_小程序刷新课堂评价 “量子奖状”能量大
  15. POJ 2706 棋盘连线游戏(模拟)
  16. 金项奖入围展播 | 梦系来客,星耀有礼
  17. テクニカルアーティストに必要な資料集めようぜ!
  18. English trip V2-B 4 My Uncle Sam and Apple Pie 山姆大叔和苹果派 Teacher:Tom
  19. 用SQL语句更改数据库名
  20. APS系统发展现状随笔--唯有坚守本心,方可前行

热门文章

  1. 专访卢政:TSF如何助力企业微服务开发
  2. 蓝桥杯 十进制数转八进制数
  3. 解决IE8下载停留在99%的脚本
  4. 删除git仓库中的文件(从所有历史中清除,不留痕迹)【不可恢复】
  5. PB中如何调用shellExecute
  6. Linux snmp
  7. 【MFC两种视频图像採集方法】DirectShow与Opencv
  8. Python连接MySQL数据库执行sql语句时的参数问题
  9. Building your training into your researcing
  10. my current understanding of learning and graduate studies