controller manager是什么?
Controller Manager 是集群内部的管理控制中心,负责统一管理与运行不同的 Controller ,实现对集群内的 Node、Pod 等所有资源的管理。
比如当通过 Deployment 创建的某个 Pod 发生异常退出时,RS Controller 便会接受并处理该退出事件,并创建新的 Pod 来维持预期副本数。
controller manager起什么作用?
k8s内部几乎每种特定资源都有特定的 Controller 维护管理,而 Controller Manager 的职责便是把所有的 Controller 聚合起来:
- 提供基础设施降低 Controller 的实现复杂度
- 启动和维持 Controller 的正常运行,watch api-server,然后对不同的 Controller 分发事件通知。
k8s中有几十种 Controller,这里列举一些相对重要的Controller:
- 部署控制器(Deployment Controller):负责pod的滚动更新、回滚以及支持副本的水平扩容等。
- 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。
- 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。
- 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。
- 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
- ……
controller manager的工作流程是什么?
大体流程:
从比较高维度的视角看,Controller Manager 主要提供了一个分发事件的能力,而不同的 Controller 只需要注册对应的 Handler 来等待接收和处理事件。
- List & Watch:
- Controller manager与api-server的通信主要通过两种方式:List 和 Watch。
-
List是短连接实现,用于获取该资源的所有object;
-
Watch是长连接实现,用于监听在List中获取的资源的变换。
- api-server检测到资源产生变更时,会主动通知到Controller manager(利用分块传输编码)。
-
也可以说,List获取的是全量数据,Watch获取的是增量数据。
- client-go:
- client-go实现统一管理每种 Controller 的List和Watch。
- 将收到的event事件放到缓存中,异步分发给每个 Controller 的注册的eventHandler。
- Controller自己的eventHandler如何注册?
- 以 Deployment Controller 举例来看源码。
- 在
pkg/controller/deployment/deployment_controller.go
的NewDeploymentController
方法中,便包括了 Event Handler 的注册,对于 Deployment Controller 来说,只需要根据不同的事件实现不同的处理逻辑,便可以实现对相应资源的管理。