client-go的workqueue详解

本文详细介绍了Kubernetes client-go包中的工作队列workqueue,包括普通队列、延迟队列和限速队列的工作原理和实现细节。工作队列主要用于处理Informer事件,提供错误重试和限速机制,适用于不关注过程只关注结果的处理场景。
摘要由CSDN通过智能技术生成

Table of Contents

1. 章节介绍

在介绍完Informer机制后,可以发现如果想自定义控制器非常简单,我们直接注册handler就行。但是绝大部分k8s原生控制器中,handler并没有直接处理。而是统一遵守一套:

Add , update, Del -> queue -> run -> runWorker -> syncHandler 处理的模式。

例如 namespaces控制器中:

// 1.先是定义了一个限速队列
queue:                      workqueue.NewNamedRateLimitingQueue(nsControllerRateLimiter(), "namespace"),
​
​
// 2.然后add, update都是入队列
// configure the namespace informer event handlers
  namespaceInformer.Informer().AddEventHandlerWithResyncPeriod(
    cache.ResourceEventHandlerFuncs{
      AddFunc: func(obj interface{}) {
        namespace := obj.(*v1.Namespace)
        namespaceController.enqueueNamespace(namespace)
      },
      UpdateFunc: func(oldObj, newObj interface{}) {
        namespace := newObj.(*v1.Namespace)
        namespaceController.enqueueNamespace(namespace)
      },
    },
    resyncPeriod,
  )
  
// 3.然后controller.run,启动多个协程
// Run starts observing the system with the specified number of workers.
func (nm *NamespaceController) Run(workers int, stopCh <-chan struct{}) {
  
  for i := 0; i < workers; i++ {
    go wait.Until(nm.worker, time.Second, stopCh)
  }
  <-stopCh
}
​
// 4. worker处理一个个数据
func (nm *NamespaceController) worker() {
​
    // 得到对象
    key, quit := nm.queue.Get()
    
    // 处理完对象
    defer nm.queue.Done(key)
​
    err := nm.syncNamespaceFromKey(key.(string))
    if err == nil {
      // no error, forget this entry and return
      nm.queue.Forget(key)
      return false
    }
}

可以看出来这一套的一个好处:

(1)利用了Indexer本地缓存机制,queue里面只包括 key就行。数据indexer都有

(2)workqueue除了一个缓冲机制外,还有着错误重试的机制

因此这一节分析一下,client-go提供了哪些workqueue

2. workerqueue介绍

client-go 的 util/workqueue 包里主要有三个队列,分别是普通队列,延时队列,限速队列,后一个队列以前一个队列的实现为基础,层层添加新功能,我们按照 Queue、D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值