浅析Kubernetes Informer


声明:本文转载自https://my.oschina.net/u/3730758/blog/1576140,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

熟悉Kubernetes的小伙伴们想必会有一窥源码的动机,领略大师的设计和实现,从官方开放出来的go-sdk来切入Kubernetes应该是个不错的选择。在client-go的工具包里面,informer是一个主要的工具,下文是小编对inform组件的主要功能和部分代码的简单介绍,若有错误之处,欢迎指出,小编果然献出铁头,供大家轻拍。

 

主要功能:

  1. List和Watch方法,从APIServer同步/解码对象到本地缓存,另外提供本地缓存的访问入口,减少对APIServer的访问压力。
  2. AddEventHandler方法,handler注册的入口,用户变更对象之后触发handler对应的函数,将对象状态信息写到workqueue,供worker消费。

 

逻辑关系图(引用徐超大神的分享):

 

代码结构浅析:

 

sharedInformerFactory

  • infomers成员:维护Type接口到SharedIndexInformer的map,此处映射到sharedIndexInformer struct指针变量,工厂设计模式。
  • startedInformers成员:维护Type接口到BOOL值的映射,启动informer之前在此判断,避免重复启动infromer。
  • Start方法:迭代informers成员,调用informer.run方法启动informer。
  • InformerFor方法:为informers成员持续增加entry。
  • ...

 

deploymentInformer

  • factory成员:实现SharedInformerFactory接口的结构变量,此处赋值为sharedInformerFactory struct指针变量。
  • Informer方法:调用factory的InformerFor方法,返回sharedIndexInformer指针对象。
  • Lister方法:返回informer的indexer成员,用以读取本地缓存。
  • ...

 

sharedIndexInformer

  • indexer成员:实现Indexer接口,维护本地缓存(map[string]interface{}),此处赋值为cache struct指针变量。
  • controller成员:实现Controller接口,维护APIServer到本地缓存的同步机制,同时保持与processor的通讯,此处赋值为controller struct指针对象。
  • processor成员:保持与controller的通讯,触发handler对应的方法,此处赋值为sharedProcessor struct 指针对象。
  • AddEventHandler方法:创建processorListener struct值对象,append到processor成员的listeners和syncinglisteners。
  • HandleDelta方法:迭代controller.config.Queue.items[key](Delta切片),调用indexer.Add/Delete/Update更新本地缓存,同时调用processor.distribute方法,按需迭代processor的listeners和syncinglisteners,下发消息到listener的消息队列。
  • ...

 

indexer

  • cacheStorage成员:实现ThreadSafeStore接口,维护本地线程安全的缓存map[string]interface{},此处赋值为threadSafeMap struct指针变量。
  • keyFunc成员:维护本地缓存key的函数。
  • Add/Delete/Update/List方法:支撑对本地缓存的常用操作。
  • ...

 

controller

  • reflector成员:利用resourceVersion机制衔接调用listerWatcher.List/Watch方法,从APIServer同步/解码对象到config.Queue.items(map[string]Deltas)中,此处赋值为Reflect struct指针对象。
  • config成员:维护链队列和对象操作映射(map[string]Deltas),此处赋值为Config struct值对象。
  • processloop方法:传入config.Process成员,循环调用config.Queue.Pop方法。
  • ...

 

processor

  • listeners成员:processorListener struct指针变量的切片。
  • run方法:迭代listeners,调用processorListener.run/pop方法,触发processorListener.handler.OnAdd/OnUpdate/OnDelete方法。
  • ...

 

reflector

  • store成员:实现Store接口,此处赋值为DeltaFIFO struct指针对象。
  • listerWatcher成员:实现ListerWatcher的List/Watch方法,从APIServer同步/解码对象,此处赋值为ListWatch struct指针变量。
  • ListAndWatch方法:调用listerWatcher成员的List/Watch方法,完成对象从APIServer的同步/解码,然后调用syncWith和watchHandler方法,把事件和对象同步到store的存储成员中。
  • syncWith方法:调用Store接口的Replace方法,同步事件和对象信息。
  • watchHandler方法:调用Store接口的Add/Update/Delete方法,同步事件和对象信息。
  • ...

 

config

  • Queue成员:实现Queue接口,此处赋值为DeltaFIFO struct指针对象。
  • Process成员:值为sharedIndexInformer.HandleDelta方法。
  • ...

 

DeltaFIFO

  • items成员:map[string]Deltas,存储对象和操作信息。
  • queue成员:[]string,简单的链队列。
  • knownObjects成员:实现KeyListerGetter接口,此处赋值为cache struct指针对象。
  • Pop方法:从queue成员pop,调用config.Process方法。
  • Add/Delete/Update/Replace方法:调用queueActionLocked方法。
  • queueActionLocked方法:维护items和queue成员。
  •  ...

 

processorListener

  • nextCh成员:从本地pendingNotifications或者addCh生产消息,run方法消费消息。
  • addCh成员:从调用add方法生产消息,写入本地pendingNotifications或者传递给nextCh。
  • pendingNotifications成员:维护本地缓冲消息,此处赋值为RingGrowing struct值对象。
  • pop方法:维护nextCh和addCh的消息传递。
  • run方法:消费nextCh消息,按需调用processorListener.OnAdd/OnUpdate/OnDelete方法。
  • ...

 

 

总结:

熟悉Informer实现的主要策略和机制之后,会对后续开发controller带来很多的信心和好处,方便大家持续工作在Kubernetes平台上。本文简单描述了informer的主要结构,还有一些需要研究的地方,比如说缓存压缩,protobuf decode/encode机制,processListener的消息缓存机制,锁通知机制等等,谢谢。

本文发表于2017年11月20日 20:33
(c)注:本文转载自https://my.oschina.net/u/3730758/blog/1576140,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2291 讨论 0 喜欢 1

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1