Operator
Operator 是 CoreOS 推出的旨在简化复杂有状态应用管理的框架,它是一个感知应用状态的控制器,通过扩展 Kubernetes API 来自动创建、管理和配置应用实例。
你可以在 OperatorHub.io 上查看 Kubernetes 社区推荐的一些 Operator 范例。
Operator 原理
Operator 基于 CustomResourceDefinition(CRD) 扩展了新的应用资源,并通过控制器来保证应用处于预期状态。比如 etcd operator 通过下面的三个步骤模拟了管理 etcd 集群的行为:
通过 Kubernetes API 观察集群的当前状态;
分析当前状态与期望状态的差别;
调用 etcd 集群管理 API 或 Kubernetes API 消除这些差别。

如何创建 Operator
Operator 是一个感知应用状态的控制器,所以实现一个 Operator 最关键的就是把管理应用状态的所有操作封装到配置资源和控制器中。通常来说 Operator 需要包括以下功能:
Operator 自身以 Deployment 的方式部署
Operator 自动创建一个 CustomResourceDefinition(CRD) 资源类型,用户可以用该类型创建应用实例
Operator 应该利用 Kubernetes 内置的 Serivce/Deployment 等管理应用
Operator 应该向后兼容,并且在 Operator 自身退出或删除时不影响应用的状态
Operator 应该支持应用版本更新
Operator 应该测试 Pod 失效、配置错误、网络错误等异常情况
要创建一个新的 Operator,最简单的方法使用 Operator Framework。比如,要创建一个最简单的 Operator,需要以下几个步骤:
(1)安装 operator-sdk 工具:
(2)初始化项目:
(3)添加 CRD 定义和控制器:
(4)实现 Controller、Reconciler 等控制逻辑。
(5)部署 Operator 到 Kubernetes 集群中,并通过自定义的 CRD 创建资源。
完整的示例可以参考 这里。
如何使用 Operator
为了方便描述,以 Etcd Operator 为例,具体的链接可以参考 -Etcd Operator。
在 Kubernetes 部署 Operator: 通过在 Kubernetes 集群中创建一个 Deploymet 实例,来部署对应的 Operator。具体的 Yaml 示例如下:
查看 operator 是否部署成功:
对应的有状态服务 yaml 文件示例如下:
部署对应的有状态服务:
其他示例
Rook Operator: cloud-native storage orchestrator
与其他工具的关系
StatefulSets:StatefulSets 为有状态服务提供了 DNS、持久化存储等,而 Operator 可以自动处理服务失效、备份、重配置等复杂的场景。
Puppet:Puppet 是一个静态配置工具,而 Operator 则可以实时、动态地保证应用处于预期状态
Helm:Helm 是一个打包工具,可以将多个应用打包到一起部署,而 Operator 则可以认为是 Helm 的补充,用来动态保证这些应用的正常运行
参考资料
最后更新于