(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中获取具体的资源;

​​​​​​

k8s之client-go的工作逻辑_缓存

​​​​​​

 

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存放数据;