k8s controller

 

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机制:

informer

  

原文地址:https://www.cnblogs.com/dream397/p/14769107.html