2.1.2 什么是 Controller
从字面意义来说,Controller 就是控制器,它是控制 Kubernetes 的资源实体。如何控制呢?它通过监听 Kubernetes 资源变化事件来实现,这个事件可能是用户发起的,例如,用户希望把资源从 A 状态更新到 B 状态,Controller 就会捕获这个事件并且响应这个事件,即更新目标资源。Kubernetes 默认内置了很多控制器,例如 PodController、NamespacesController、ServiceController,它们控制着 Kubernetes 默认资源,如 Pod、Deployment、Service 等,它们都包含在组件 Controller Manager 中。但如果你的资源是 CRD,因为没有对应默认的控制器,你必须为它编写自己的 Controller 逻辑。我们将这种实现自定义资源逻辑的控制器叫作 Controller。那么 Controller 是如何完成事件监听的,具体逻辑参考图 2-3。
图 2-3 Controller 处理逻辑图
Controller 主要使用 Informer 和 Workqueue 两个核心组件。Controller 可以有一个或多个 Informer 来跟踪某一个 Resource。Informter 与 APIServer 保持通信获取资源的最新状态并更新到本地的 Cache 中,一旦跟踪的资源有变化,Informer 就会调用Callback。把变更的 Object 放到 Workqueue 中。然后 Woker 执行真正的业务逻辑,计算和比较 Workerqueue 中 items 的当前状态和期望状态的差别,然后通过 Client-go 向APIServer 发送请求,直到驱动这个集群向用户要求的状态演化。我们将在下面的章节逐步介绍核心代码分析。