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
//将 Workqueue、Informer、Indexer的引⽤作为参数返回⼀个新的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")
}