k8s client-go 源码中 informer 初始化与启动过程是如何实现的?

摘要:k8s client-go k8s informers实现了持续获取集群的所有资源对象、监听集群的资源对象变化功能,并在本地维护了全量资源对象的内存缓存,以减少对apiserver、对etcd的请求压力。Informers在启动的时候会首先
k8s client-go源码分析 informer源码分析(2)-初始化与启动分析 前面一篇文章对k8s informer做了概要分析,本篇文章将对informer的初始化与启动进行分析。 informer架构 先来回忆一下informer的架构。 k8s client-go informer主要包括以下部件: (1)Reflector:Reflector从kube-apiserver中list&watch资源对象,然后调用DeltaFIFO的Add/Update/Delete/Replace方法将资源对象及其变化包装成Delta并将其丢到DeltaFIFO中; (2)DeltaFIFO:DeltaFIFO中存储着一个map和一个queue,即map[object key]Deltas以及object key的queue,Deltas为Delta的切片类型,Delta装有对象及对象的变化类型(Added/Updated/Deleted/Sync) ,Reflector负责DeltaFIFO的输入,Controller负责处理DeltaFIFO的输出; (3)Controller:Controller从DeltaFIFO的queue中pop一个object key出来,并获取其关联的 Deltas出来进行处理,遍历Deltas,根据对象的变化更新Indexer中的本地内存缓存,并通知Processor,相关对象有变化事件发生; (4)Processor:Processor根据对象的变化事件类型,调用相应的ResourceEventHandler来处理对象的变化; (5)Indexer:Indexer中有informer维护的指定资源对象的相对于etcd数据的一份本地内存缓存,可通过该缓存获取资源对象,以减少对apiserver、对etcd的请求压力; (6)ResourceEventHandler:用户根据自身处理逻辑需要,注册自定义的的ResourceEventHandler,当对象发生变化时,将触发调用对应类型的ResourceEventHandler来做处理。 概述 ... factory := informers.NewSharedInformerFactory(client, 30*time.Second) podInformer := factory.Core().V1().Pods() informer := podInformer.Informer() ... go factory.Start(stopper) ... if !cache.WaitForCacheSync(stopper, informer.HasSynced) { runtime.HandleError(fmt.Errorf("Timed out waiting for caches to sync")) return } ... 上一节有列举了informer的使用代码,注意看到示例代码中的下面这段代码,做了informer初始化与启动,其中包括: (1)informers.NewSharedInformerFactory:初始化informer factory; (2)podInformer.Informer:初始化pod informer; (3)factory.Start:启动informer factory; (4)cache.WaitForCacheSync:等待list操作获取到的对象都同步到informer本地缓存Indexer中; 下面也将根据这四部分进行informer的初始化与启动分析。 基于k8s v1.17.4版本依赖的client-go 1.SharedInformerFactory的初始化 1.1 sharedInformerFactory结构体 先来看下sharedInformerFactory结构体,看下里面有哪些属性。
阅读全文