带你读《云原生应用开发 Operator原理与实践》第二章 Operator 原理2.2Client-go 原理(十六)

2.2.8        Controller关于 Client-go典型场景


我们了解了Client-go的各个组件(Reflector、Informer、Indexer),Client-go中包含编写自定义Controller所使用的各种机制,这些机制在 Client-go库中的 Tools包和Util包中进行了定义。在 k8s中,可以利用 Client-go中提供的 Controller机制对所需资源的变化进行监控,根据资源状态的变化进行一系列操作。为加深对前面知识的理解,下面利用 Client-go工具实现一个简单的 Controller。


 

下面编写一个简易的 Controller,用于监听Pod 创建、删除信息,并将信息打印出来。Controller逻辑如下。

(1) 首先我们需要定义一个 Controller结构体,见代码清单 2-54

typeControllerstruct{

indexercache.Indexer//Indexer的引⽤

queue     workqueue.RateLimitingInterface//Workqueue的引⽤

informercache.Controller//Informer的引⽤


}

 

(2)  初始化一个 Controller,见代码清单 2-55

//将 WorkqueueInformerIndexer的引⽤作为参数返回⼀个新的Controller

funcNewController(queueworkqueue.RateLimitingInterface,indexercache.Indexer,informercache.Controller)*Controller{

return&Controller{informer:informer,indexer:indexer,queue:queue,

}

}


(3)  定义 Controller的工作流,见代码清单 2-56

func(c*Controller)Run(threadinessint,stopChchanstruct{}){deferruntime.HandleCrash()

deferc.queue.ShutDown()klog.Info("Startingpodcontroller")

//启动 Informer线程,Run函数做两件事情 :第⼀,运⾏⼀个 Reflector,并从 ListerWatcher

中获取对象的通知放到队列中(DeltaQueue);第⼆,从队列中取出对象并处理该对象相关业务goc.informer.Run(stopCh)

//等待缓存同步队列

if!cache.WaitForCacheSync(stopCh,c.informer.HasSynced){

runtime.HandleError(fmt.Errorf("Timeoutwaitngforcachestosync"))return

}

//启动多个Worker线程处理Workqueue中的Object


fori:=0;i<threadiness;i++{

gowait.Until(c.runWorker,time.Second,stopCh)

}

<-stopCh

klog.Info("StoppingPodcontroller")

}

 

上一篇:linux内核cryto接口的实现以及与openssl的比较


下一篇:Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(1)