controller-runtime是在client-go/tools/cache和client-go/util/workqueue的基础上实现的, 了解
client-go/tools/cache
和client-go/util/workqueue
对理解controller-runtime
很有帮助
介绍informer
带着问题看
开发CRD时想到的一些问题
更新local store缓存和触发reconcile是否有先后顺序
同一个crd object会不会同时被reconcile
这个全靠Queue数据结构设计的精妙, 保证了正在执行的reconcile不会处理相同的object
向queue中增加object之前会检查是否有次object存在于queue中,如果不存在则加入dirty set,如果也不存在于processing set才会加入queue中,当processing中的处理完成之后(调用Done),会将object从processing set种移除,如果次object在处理过程中加入到了dirty set,则将object再次加入到queue中 https://www.cnblogs.com/daniel-hutao/p/18010835/k8s_clientgo_workqueue
有几种队列,Queue,DelayingQueue,RateLimitingQueue
如何解决进入reconcile之后读到的是旧数据的问题
读到旧数据是否说明是先出发reconcile再更新local store的
My cache might be stale if I read from a cache! How should I deal with that?
在更新或patch status之后,通过wait.Pool(100ms, 2s, func()(bool, error))校验cache中的本object数据直至更新