Client-go源码分析(四)WorkQueue

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


本文为《Kubernetes 源码剖析》读书笔记,书籍简介: http://www.broadview.com.cn/book/6104

一、WorkQueue 简介

在 Informer 中,Delta FIFO 队列触发 Add、Update、Delete 回调,在回调方法中,将需要处理的资源对象变化事件的 key 放入 WorkQueue 工作队列中。等待 Control Loop 控制循环从工作队列中取出,再通过 Lister 从 Indexer 本地缓存中取出完整的资源对象,做处理。
Informer 工作流程架构图
图片来源:极客时间 --《深入浅出 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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值