本文为《Kubernetes 源码剖析》读书笔记,书籍简介: http://www.broadview.com.cn/book/6104
一、WorkQueue 简介
在 Informer 中,Delta FIFO 队列触发 Add、Update、Delete 回调,在回调方法中,将需要处理的资源对象变化事件的 key 放入 WorkQueue 工作队列中。等待 Control Loop 控制循环从工作队列中取出,再通过 Lister 从 Indexer 本地缓存中取出完整的资源对象,做处理。

图片来源:极客时间 --《深入浅出 Kubernetes》
WorkQueue 的主要功能在于标记和去重,并支持以下特性:
- 有序:按照添加顺序处理元素(item)
- 去重:相同元素在同一时间不会被重复处理,例如一个元素在处理前被添加了多次,它只会被处理一次。
- 并发性:多生产者和多消费者
- 标记机制:支持标记功能,标记一个元素是否被处理,也允许元素在处理时重新排队。
- 通知机制:ShutDown方法通过信号量通知队列不再接收新的元素,并通知metric goroutine退出。
- 延迟:支持延迟队列,延迟一段时间后再将元素存入队列。
- 限速:支持限速队列,元素存入队列时进行速率限制。限制一个元素被重新排队(Reenqueued)的次数。
- Metric:支持metric监控指标,可用于Prometheus监控。
二、WorkQueue 结合 Informer 的完整使用案例
Kubernetes 官方给出了使用 Informer 机制实现 controller 的样例:
// staging/src/k8s.io/sample-controller/controller.go
// 1、定义 Controller 结构体
type Controller struct {
// 官方的 Clientset 客户端获取内置资源对象
kubeclientset kubernetes.Interface
// 自定义 Clientset 客户端获取自定义资源对象
sampleclientset clientset.Interface
deploymentsLister appslisters.DeploymentLister
deploymentsSynced cache.InformerSynced
foosLister listers.FooLister
foosSynced cache.InformerSynced
// 使用限流队列实现的 WorkQueue
workqueue workqueue.RateLimitingInterface
recorder record.EventRecorder
}
// 2、初始化 controller 对象
func NewController(
kubeclientset kubernetes.Interface,
sampleclientset clientset.Interface,
deploymentInformer appsinformers.DeploymentInformer,
fooInformer informers.FooInformer) *Controller {
...
controller := &Controller{
kubeclientset: kubeclientset,
sampleclientset: sampleclientset,
deploymentsLister: deploymentInformer.Lister(),
deploymentsSynced: deploymentInformer.Informer().HasSynced,
foosLister: fooInformer.Lister(),
foosSynced: fooInformer.Informer().HasSynced,
workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "Foos"),
recorder: recorder,
}
// 为自定义资源 Foo 初始化 Informer,设置事件回调函数
fooInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
// 如果从 FIFO 队列中取到 Foo 对象的 Add 事件,则放入 workQueue 中
AddFunc: controller.enqueueFoo,
// 如果从 FIFO 队列中取到 Foo 对象的 Update 事件,则将新的对象放入 workQueue 中
UpdateFunc: func(old, new interface{
}) {
controller.enqueueFoo(new)
},
})
...
return controller
}
// 3、workQueue 的入队逻辑,将对象的 key 放入 WorkQueue 中
func (c *Controller) enqueueFoo(obj interface{
}) {
var key string
var err error
if key, err = cache.MetaNamespaceKeyFunc(

本文深入剖析了Kubernetes中的WorkQueue,包括其作为Informer事件处理器的角色,以及如何支持FIFO、延迟和限速特性。WorkQueue提供有序处理、去重、并发处理、标记、延迟和限速功能。通过不同的接口,如DelayingInterface和RateLimitingInterface,实现了不同类型的队列,如FIFO队列的去重机制,延迟队列的AddAfter方法,以及限速队列的多种限流算法。
最低0.47元/天 解锁文章
646

被折叠的 条评论
为什么被折叠?



