0. 概述

在玩 Kubernetes 的时候,经常会接触到 Operator,例如常见的 etcd operator 等。但是在实际上使用下来会发现,所谓的 Operator 和 Controller 其实都差不多,都是编写 CRD,然后用 Controller 去监听 CRD 的变化并且响应变化,那么 Operator 和 Controller 到底区别在哪里。

1. 什么是 Operator

根据一些 Kubernetes 官方文档介绍, Operator 是用来扩展 Kubernetes,用于管理应用程序和组件的。就我个人的理解来说,Operator 是一种特别的 Controller,也就是说本质上 Operator 和 Controller 都是一样的,都是基于 Kubernetes 的资源和控制器概念之上构建,但是不同之处在于,Operator 包含了应用程序特定的领域知识,其实也可以说是封装了运维人员对于特定应用程序的运维经验。

例如通过 CRD 定义一个 CRD 来定义 Nginx 的配置不算 Operator,顶多算 Controller;但是,如何让 Nginx 保持高可用的 Controller,这就是个 Operator,因为它包含了保证 Nginx 高可用的业务逻辑,这封装了运维经验。此外,比较常见的还有管理应用状态的 Operator,例如 prometheus operator,它既要管理 promehteus 的配置,还需要管理 prometheus 自身的运行以及存储等。

2. Operator 的作用

根据前边的描述,可以知道 Operator 就是用来创建配置管理复杂的有状态应用,如数据库、缓存和监控系统。

3. Operator 当前有哪些实际的应用

当前CoreOS提供的一些 Operator:

如果想了解更多,可以在 OperatorHub.io 上查看 Kubernetes 社区推荐的一些 Operator 范例。

4. Operator 的原理

Operator 和 Controller 类似,基于 Kubernetes 的以下两个概念构建:

比如 etcd operator 通过下面的三个步骤模拟了管理 etcd 集群的行为:

  1. 通过 Kubernetes API 观察集群的当前状态;
  2. 分析当前状态与期望状态的差别;
  3. 调用 etcd 集群管理 API 或 Kubernetes API 消除这些差别。

5. 开发 Operator

其实开发 Operator 和开发 Controller 流程基本一致,但是,不同之处在于业务逻辑上的处理,Controller 可能一般情况下就做些 CRD 的转换,或者 CRD 的操作;但是 Operator 会结合 Kubernetes 的原生 Controller(Deployment/Replicas)等来控制应用程序的状态。

此外,不仅仅是原生的 Controller,还可能和 Kubernetes 的网络,存储等配合,保证业务的正常运行。

6. Ref