从零开始实现一个operator(2)-控制器实现

控制器-Controller

在上一篇中,已经介绍如何去实现一个CR,并且也在集群中创建了,但是并没有相关Pod以及资源被创建,是因为Controller没有被实现。这里来讲下如何实现一个Controller。

控制器实现

reconciliation loop

reconciliation loop也就是概念篇中提到的控制回路,它用来保证期望状态和当前状态一致性的关键机制。以下是它的工作状态:

  1. 监视CR资源变化: Controller会Watch资源是否发生变化,例如创建、更新、删除等。
  2. 获取当前状态: 当检测到发生变化的时候,会获取当前资源,也会和其他资源进行交互,比如获取 Pod、Service、ConfigMap 等的状态。
  3. 计算期望值: 根据自定义资源的规格(Spec)和其他信息计算期望的状态。这个期望状态通常反映了用户期望的系统状态,可能包括所需的 Pod 数量、配置信息等。
  4. 比较当前状态和期望状态
  5. 执行调谐操作

实现思路

知道控制器核心思想之后,我们需要为CR准备相关K8S资源,像redis这种中间件属于有状态类型,所以选择使用statefulset,并且我们希望在创建后可以访问到这个redis实例,那就需要对应的service。结合这些内容,大概可以知道我们控制器的工作流程:

  1. 控制器监听CR是否发生变化
  2. 发生变化之后,根据对应事件去做处理,这里以创建为例子。
  3. 创建CR相关资源。

结果

image-20240121174303471

image-20240203155109025


从零开始实现一个operator(2)-控制器实现
http://example.com/2024/01/19/从零实现一个operator-2-控制器实现/
Author
John Doe
Posted on
January 19, 2024
Licensed under