k8s Informer原理

时间:July 8, 2020 分类:

目录:

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的流程

  1. Reflector从KubernetesAPI获取List数据
  2. Reflector将获取的List数据写入到LocalStore,如果有调用Lister的List和Get就从LocalStore返回数据
  3. Reflector从KubernetesAPI进行watch对应的resource,有事件就发送到DeltaFIFO,会触发两个操作
  4. DeltaFIFO主动Pop数据到Controller
  5. DeltaFIFO修改LocalStore的数据
  6. Controller接受到信息触发Processor的回调函数