什么是 Operator
Operator 是 Kubernetes 的扩展机制,用于将特定领域知识(Domain Knowledge)编码到软件中,实现复杂有状态应用的自动化部署、升级、备份和恢复。CoreOS 在 2016 年首次提出 Operator 概念,其核心思想是:
将运维人员的操作经验转化为代码,并以自定义控制器(Controller)的形式运行在 Kubernetes 中。
常见的 Operator 实现包括:etcd Operator、Prometheus Operator、MySQL Operator、Redis Operator 等。
Operator 设计原理
Operator 通常由两部分组成:
- CRD(Custom Resource Definition):定义自定义资源的数据结构,扩展 Kubernetes API。
- Controller:监听 CR 的变化,执行 reconcile 逻辑,确保实际状态与期望状态一致。
其工作模式遵循 Kubernetes 的声明式控制循环:
用户声明 CR -> API Server 存储 -> Controller Watch 到变化
-> Reconcile 调谐 -> 创建/更新/删除关联资源 -> 更新 CR 状态
Operator 生命周期
一个 Operator 的完整生命周期包括:
| 阶段 | 说明 |
|---|---|
| 安装 | 通过 YAML、Helm 或 OLM 部署 Operator |
| 部署 | 用户创建 CR,Operator 根据 CR 创建应用实例 |
| 升级 | 修改 CR 或更新 Operator 镜像版本 |
| 扩缩容 | 调整 CR 中的副本数或资源规格 |
| 备份恢复 | 通过自定义逻辑实现数据保护 |
| 卸载 | 删除 CR,Operator 清理关联资源 |
CRD 核心开发技术
CRD 通过 YAML 定义自定义资源的 Group、Version、Kind 和 Spec/Status 结构:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: aitasks.aiops.example.com
spec:
group: aiops.example.com
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
targetDeployment:
type: string
threshold:
type: integer
action:
type: string
status:
type: object
properties:
phase:
type: string
lastExecutionTime:
type: string
scope: Namespaced
names:
plural: aitasks
singular: aitask
kind: AITask
shortNames:
- at
Controller 与 Reconcile
Controller 的核心是 reconcile 函数。每次资源变化时,Controller 都会将资源的 Namespace/Name 加入工作队列,然后由 reconcile 函数处理。
func (r *AITaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
log := log.FromContext(ctx)
var task aiopsv1.AITask
if err := r.Get(ctx, req.NamespacedName, &task); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
// 1. 获取目标 Deployment
// 2. 根据 task.Spec 判断是否需要执行动作
// 3. 执行动作并更新 status
task.Status.Phase = "Running"
task.Status.LastExecutionTime = metav1.Now().Format(time.RFC3339)
if err := r.Status().Update(ctx, &task); err != nil {
return ctrl.Result{}, err
}
return ctrl.Result{RequeueAfter: 60 * time.Second}, nil
}
reconcile 函数应满足以下原则:
- 幂等性:同一事件多次处理结果一致。
- 快速返回:避免长时间阻塞,必要时使用 RequeueAfter。
- 错误处理:区分可重试错误与终态错误。
- OwnerReference:通过设置 OwnerReference 实现级联删除。
Operator 开发工具链
常用的 Operator 开发工具包括:
- kubebuilder:基于 CRD 和 Controller-runtime 的项目脚手架,功能完整。
- operator-sdk:RedHat 主导,支持 Go、Ansible、Helm 三种 Operator 类型。
- controller-runtime:底层库,kubebuilder 和 operator-sdk 都基于它。
使用 kubebuilder 创建项目的命令示例:
kubebuilder init --domain aiops.example.com --repo github.com/example/aiops-operator
kubebuilder create api --group aiops --version v1 --kind AITask
make manifests
make install
make run
基础 Operator 项目结构
一个典型的 Operator 项目结构如下:
aiops-operator/
├── api/
│ └── v1/
│ ├── aitask_types.go # CR 类型定义
│ └── zz_generated.deepcopy.go
├── config/
│ ├── crd/ # CRD YAML
│ ├── manager/ # Operator 部署配置
│ ├── rbac/ # RBAC 配置
│ └── samples/ # 示例 CR
├── controllers/
│ └── aitask_controller.go # 控制器逻辑
├── main.go # 入口
├── go.mod
└── Makefile
总结
Operator 是 Kubernetes 平台工程的核心能力之一。通过 CRD 扩展 API,通过 Controller 实现自动化运维逻辑,可以将任何复杂的运维场景沉淀为声明式配置。下一篇笔记将在此基础上,结合 LLM 构建一个简易的 AIOps Operator。