k8s之listwatch与informer简单理解

一、k8s-watch机制

watch机制本质上是使客户端和服务端建立长连接,并将服务端的变化实时发送给客户端的方式减小服务端的压力。

kube­-apiserver对etcd的list­watch机制

为了减轻etcd的压力,kube-apiserver本身对etcd实现了list-watch机制,将所有对象的最新状态和最近的事件存放到cacher里,所有外部组件对资源的访问都经过cacher。

客户端对apiserver的watch机制实现

apiserver对list接口增加了一个watch参数,客户端可以向apiserver通过增加一个watch=true 的queryParam发起watch请求。apiserver 的hander在解析到watch参数为true时,会在apiserver启动一个watchServer,并创建一个CacheWatcher负责读取cacher中Watch到事件然后持续不断的放到http response的流中返回给客户端。

二、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中。

第二种理解思路:

以贯穿全图的水平横线为界,上半部分描述了基于 List&Watch 的 Informer 机制。Informer 一方面将 K8s 对象缓存到 Indexer 中,另一方面为 K8s 资源事件注册各种 Handler,如果注册的 Handler 是将 事件的资源对象 key 存入一个队列中,那么就来到了图中的下半部分:WorkQueue + Reconciler,WorkQueue 类似一个消息队列,接收生产者(Informer 注册的 Handler)的消息(K8s objects key),并将消息持续提供给消费者(Reconciler)

Informer HasSynced是指一次完整的List操作并将结果全部存入DeltaFIFO,再从DeltaFIFO中全部pop出队,重新存入indexer并触发各种Handler。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值