k8s Informer原理
目录:
informer
介绍
kubernetes中List和Get方法获取数据,绝大多数都是通过informor,而不是请求Kubernetes的API
可以通过informer直接去获取数据,也可以监听事件,触发回调函数等功能
设计
Informer只会调用Kubernetes的List和Watch两种类型的API,为了是快速返回List和Get的结果,减少Kubernetes的API调用
Informer在初始化的时,先调用Kubernetes的ListAPI获得某种resource的全部Object缓存在内存中,然后调用WatchAPI去watch这种resource,去维护这份缓存
Informer通过Kubernetes的WatchAPI监听某种resource下的所有事件。而且Informer可以添加自定义的回调函数,这个回调函数实例(即ResourceEventHandler实例)只需实现OnAdd(obj interface{})
,OnUpdate(oldObj, newObj interface{})
和 OnDelete(obj interface{})
三个方法,这三个方法分别对应informer监听到创建、更新和删除这三种事件类型,更多操作参考如何用 client-go 拓展 Kubernetes 的 API
详解
Informer中主要包含六个组件
- Controller 接受DeltaFIFO的事件,触发Processor的回调函数
- Reflector 用于watch Kubernetes的API
- DeltaFIFO 二级缓存,用于Controller
- LocalStore 接受DeltaFIFO的事件,缓存数据,用于Lister调用
- Lister 执行被调用的List和Get方法
- Processor 记录回调函数,并执行
Informer的流程
- Reflector从KubernetesAPI获取List数据
- Reflector将获取的List数据写入到LocalStore,如果有调用Lister的List和Get就从LocalStore返回数据
- Reflector从KubernetesAPI进行watch对应的resource,有事件就发送到DeltaFIFO,会触发两个操作
- DeltaFIFO主动Pop数据到Controller
- DeltaFIFO修改LocalStore的数据
- Controller接受到信息触发Processor的回调函数