从零开始实现一个operator(2)-控制器实现
控制器-Controller
在上一篇中,已经介绍如何去实现一个CR,并且也在集群中创建了,但是并没有相关Pod以及资源被创建,是因为Controller没有被实现。这里来讲下如何实现一个Controller。
控制器实现
reconciliation loop
reconciliation loop也就是概念篇中提到的控制回路,它用来保证期望状态和当前状态一致性的关键机制。以下是它的工作状态:
- 监视CR资源变化: Controller会Watch资源是否发生变化,例如创建、更新、删除等。
- 获取当前状态: 当检测到发生变化的时候,会获取当前资源,也会和其他资源进行交互,比如获取 Pod、Service、ConfigMap 等的状态。
- 计算期望值: 根据自定义资源的规格(Spec)和其他信息计算期望的状态。这个期望状态通常反映了用户期望的系统状态,可能包括所需的 Pod 数量、配置信息等。
- 比较当前状态和期望状态
- 执行调谐操作
实现思路
知道控制器核心思想之后,我们需要为CR准备相关K8S资源,像redis这种中间件属于有状态类型,所以选择使用statefulset,并且我们希望在创建后可以访问到这个redis实例,那就需要对应的service。结合这些内容,大概可以知道我们控制器的工作流程:
- 控制器监听CR是否发生变化
- 发生变化之后,根据对应事件去做处理,这里以创建为例子。
- 创建CR相关资源。
结果
从零开始实现一个operator(2)-控制器实现
http://example.com/2024/01/19/从零实现一个operator-2-控制器实现/