Kubernetes Operator 入门

2025-11-07T14:11:02+08:00 | 3分钟阅读 | 更新于 2025-11-07T14:11:02+08:00

@

什么是 Operator

Operator 是 Kubernetes 的扩展机制,用于将特定领域知识(Domain Knowledge)编码到软件中,实现复杂有状态应用的自动化部署、升级、备份和恢复。CoreOS 在 2016 年首次提出 Operator 概念,其核心思想是:

将运维人员的操作经验转化为代码,并以自定义控制器(Controller)的形式运行在 Kubernetes 中。

常见的 Operator 实现包括:etcd Operator、Prometheus Operator、MySQL Operator、Redis Operator 等。

Operator 设计原理

Operator 通常由两部分组成:

  1. CRD(Custom Resource Definition):定义自定义资源的数据结构,扩展 Kubernetes API。
  2. 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。

About Me

没什么想介绍的,一个很大众的码农…

喜欢代码,车,马,真的是 🐎

讨厌别人让我给自己的代码写注释 最厌烦别人的程序没有写注释

目标

学AI,加油!加油!