Controller是什么
也就是「控制器」,控制Kubernetes的资源实体。怎么控制呢?通过监听资源变化事件。这个事件可能是用户发起的(他希望把资源从A状态更新到B状态),Controller就会获取这个事件并处理事件,即更新目标资源。Kubernetes默认有很多控制器,他们控制着Kubernetes默认资源,如Pod、Deployment、Service等,他们都包含在Controller Manager中。但如果你的资源是个CRD,因为没有对应的控制器,你就得为它自己写Controller了。
controller 整体工作流程
(1) 创建一个控制器
-
为控制器创建 workqueue
-
创建 informer, 为 informer 添加 callback 函数,创建 lister
(2) 启动控制器
-
启动 informer
-
等待本地 cache sync 完成后, 启动 workers
(3) 当收到变更事件后,执行 callback
-
等待事件触发
-
从事件中获取变更的 Object
-
做一些必要的检查
-
生成 object key,一般是 namespace/name 的形式
-
将 key 放入 workqueue 中
(4) worker loop
-
等待从 workqueue 中获取到 item,一般为 object key
-
object key 通过 lister 从本地 cache 中获取到真正的 object 对象
-
做一些检查
-
执行真正的业务逻辑
-
处理下一个 item
在编写Controller之前需要了解client-go中的informer机制: