client-go 的 util/workqueue 包里主要有三个队列,分别是普通队列,延时队列,限速队列,后一个队列以前一个队列的实现为基础,层层添加新功能,我们按照 Queue、DelayingQueue、RateLimitingQueue 的顺序层层拨开来看限速队列是如何实现的。 queue 接口和结构体: http://k8s.io/client-go/util/workqueue/queue.go type ...
workqueue的作用是接收Resource Event Handler过滤后的事件进入队列,然后被实际处理事件的worker读取处理。 workqueue实现了3种队列,分别是普通队列,延时队列,限速队列。每一个依赖前一个实现。 Queue 普通队列 源码位置 staging/src/k8s.io/client-go/util/workqueue/queue.go 数据结构 接口 type Interface interface {...
client-go中的令牌桶限速是通过 golang.org/x/time/rat包来实现的 可以通过 flowcontrol.NewTokenBucketRateLimiter(qps float32, burst int) 来使用令牌桶限速算法,其中第一个参数qps表示每秒补充多少token,burst表示总token上限为多少。 排队指数算法 排队指数可以通过 workqueue.NewItemExponentialFailureRateLimiter(b...
在开发controller时,Workqueue的使用是必需的,一般使用方式是在回调函数中,将数据入队到workqueue中,然后在起多个worker,去get queue中的数据进行处理。 本文结合workqueue源码,对workqueue的设计实现进行详细解析。 1、workqueue的去重和标记功能,利用set实现。 workqueue中怎么实现set:利用golang type empty struct{} type...
本文主要讲述下client-go中workqueue, 看一下client-go的一个整体数据走向.如下图: 而workqueue主要是在listener这里引用,listener使用chan获取到数据之后将数据放入到工作队列进行处理。主要是由于chan过于简单,已经无法满足K8S的场景,所以衍生出了workqueue,
源码位置:https://github.com/nicktming/client-go/tree/tming-v13.0/util/workqueue 分支:tming-v13.0 (基于v13.0版本) 本文将分析util包中的workqueue. 在各类controller中经常会使用该workqueue中的一些类. architecture.png 2. queue 2.1 Interface接口 ...
k8s的client-go提供了基于切片的线程安全的并发队列,解耦生产者与消费者,提供了去重、限速、重试加入队列等功能。 k8s controller处理事件官方例子 生产者 // 创建一个work queue queue := workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()) ...
近期,我发现自己与Kubernetes(K8s)的源码分析似乎有了些许隔阂,回想起几年前曾深入剖析过K8s的client-go中关于workqueue的实现,但随着时间的推移,许多细节已逐渐模糊。然而,最近我意识到,重新审视和解析这部分代码对于理解K8s的内部工作机制至关重要。因此,我决定再次探索并分享这些实现细节。工作队列(Queue)的...
一、workQueue分类 在Informer最后将资源对象已经写入到事件回调函数中,此后我们直接处理这些数据即可,但是我们使用golang中的chanel来处理会存在处理效率低,存在数据大并发量,数据积压等其他异常情况,为此client-go单独将workqueue提出来,作为公共组件,不仅可以在Kubernetes内部使用,还可以供Client-go使用,用户侧可以通过Workq...
Workqueue 就是一个队列,通过这个队列,可以异步处理请求,从而缓解系统的压力,client-go提供的队列有延时队列,限速队列,可自己选择使用。 5. Callback and Worker Callback是需要自己定义的,当资源发生变化时,通过callback将上面KeyFunc生成的key放入到workqueue中,这时worker会从workqueue中取出key,通过Lister获取到当前的...