(1) Reflector通过clientset来 list和watch(Added/Modified/Deleted/BooMark事件)和resync apiserver的特定资源;
(2) Reflector作为生产者将数据发送到Delta FIFO Queue,其中Reflector的list事件对应Delta FIFO的Replaced事件,Reflector的watch的Added/Modified/Deleted事件对应Delta FIFO的Added/Updated/Deleted事件,Reflector的resync事件对应Delta FIFO的sync事件;
(3) Delta FIFO Queue的消费者之一是Indexer,将资源按照一定的索引缓存到本地;
(4) Delta FIFO Queue的另一个消费者是SharedProcessor,将对应的事件通过eventHandler把namespace/name放到workQueue中;
(5) sharedInformer是Reflector、Delta FIFO Queue、Indexer、SharedProcessor的粘合剂;
(6) Worker从workQueue中拿到namspace/name,再根据namespace/name从indexer中获取具体的资源;
client-go代码逻辑:config、clientset、informerFactory、add event handler、informerFactory.start、 controller.start、reconcile
78、Reflector原理
作用:通过clientset来listAndWatch指定的资源,并更新到delta fifo queue中。
在client-go/tools/cache包下;
List是全量更新,在controller启动时调用,watch是增量更新;
Watch事件:added/modified/deleted/Bookmark(减少apiserver负载,只获取最新的resourceVersion)
79、Delta FIFO Queue原理
具有去重功能,并且能够知道相较于上次发生了哪些变化;
DeltaFIFOQueue的生产者:Reflector的list(Replaced事件)、watch(Added/Updated/Deleted事件)、resync(sync事件);
DeltaFIFOQueue消费者:workQueue、带索引的本地缓存Indexer;
Delta类型有Added/Updated/Deleted/Replaced/sync类型事件;
80、Indexer原理
将资源按照一定的索引缓存到本地,基于cache即threadSafeMap实现,如指定ns获取pod。
Type Indexers Map[string]IndexFunc:key是索引的分类名,比如namespace,value是一个方法,通过该方法可以获取obj的namespace比如default;
Type Indices Map[string]Index:key是索引的分类名,比如namespace;
Type Index Map[string]sets.String:key是IndexFunc计算出来的结果,比如default,value是所有obj的key的集合;
81、SharedInformer原理
作为Reflector、Delta FIFO Queue、Indexer、SharedProcessor的粘合剂,组合起来使用;
其中SharedProcessor是事件监听处理器;
82、WorkQueue原理
主要有三种队列:
优先级队列PriorityQueue:出队时,最高优先级的元素最先出队,实现是heap(完全二叉树);
延迟队列DelayingQueue:延时阻塞出队,实现是PriorityQueue+waitingLoop;
限速队列RateLimitingQueue:实现是令牌桶+DelayingQueue+PriorityQueue;
其中processing 记录了正在处理的item,dirty记录了和processing 中重复的待处理item,保证同一时间只有一个相同的item被处理。
补充:
83、Client-go代码目录结构
client-go:go版本的工具库,用于与apiserver进行通信,k8s内置的控制器也通过client-go与apiserver进行交互;
Client-go的目录结构:
Kubernetes 包含所有访问k8s api的clientset;
Rest包含restclient的逻辑;
Informer包含所有内置资源的informer,便于操作k8s的资源对象;
Listers包含所有内置资源的lister,用于读取缓存中k8s资源对象中的信息;
Discovery用于发现k8s提供的资源组、资源版本和资源信息,比如kubectl api-versions kubectl api-resources;
dynamic包含dynamic client的逻辑,通过dynamic可以操作任意的k8s对象;
Plugin/pkg/client/auth包含所有可选的认证插件;
Transport包含创建、链接、认证的逻辑,被上层的clientset使用;
Tools包含一系列编写控制器时用到的工具;
Util包含一系列工具类;
84、Client的类型
- `RESTClient`: 最基础的客户端,提供最基本的封装
- `Clientset`:是一个Client的集合,在Clientset中包含了所有K8S内置资源的Client,通过Clientset便可以很方便的操作如Pod、Service这些资源
- `dynamicClient`:动态客户端,可以操作任意K8S的资源,包括CRD定义的资源
- `DiscoveryClient`:用于发现K8S提供的资源组、资源版本和资源信息,比如:`kubectl api-resources`或`kubectl api-versions`
85、client-go存储类型
- **cache**:实现Store,利用threadSafeMap存放数据;
- **UndeltaStore**:实现Store,利用cache存放数据,数据变更时通过PushFunc发送当前完整状态;
- **FIFO**:实现Queue(包含Store),利用自己内部的items数据结构存放数据;
- **DeltaFIFO**: xxx;
- **Heap**:实现Store,利用data数据结构存放数据,实现堆数据结构,用于优先级队列;
- **ExpirationCache**:实现Store,利用threadSafeMap存放数据;