Kubernetes Operator开发实战指南:从CRD定义到控制循环完整解析

引言

Kubernetes Operator 是扩展 K8s 功能的核心模式,通过自定义资源(CRD)和控制循环(Reconcile Loop)实现自动化运维。本文将手把手带你从零开发一个完整的 Operator,深入理解 CRD 设计、控制器逻辑以及 Operator SDK 的使用。适合有 K8s 基础但想深入 Operator 开发的读者。

Kubernetes Operator Architecture

一、什么是 CRD?

CRD(Custom Resource Definition)允许用户定义自己的 Kubernetes 资源类型,例如 MyApp。定义 CRD 后,K8s API 服务器可识别并存储该资源实例。一个典型的 CRD 包含以下字段:

  • group:API 组,如 example.com
  • versions:版本列表,如 v1
  • scope:作用域(Namespaced 或 Cluster)
  • schema:使用 OpenAPI v3 定义资源结构

CRD 定义示例

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: myapps.example.com
spec:
  group: example.com
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                replicas:
                  type: integer
                image:
                  type: string
  scope: Namespaced

CRD Definition Example

二、控制循环(Reconcile Loop)原理

控制器是 Operator 的大脑,核心逻辑在 Reconcile 函数中。当资源发生变化(创建/更新/删除),控制器会收到事件并触发 Reconcile。Reconcile 的目标是将当前状态调整为期望状态。

控制器组件

  • Informer:监听资源事件,缓存对象
  • WorkQueue:存储待处理事件,支持去重与重试
  • Reconciler:执行核心业务逻辑

Reconcile 流程伪代码

func (r *MyAppReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    // 1. 获取自定义资源
    myapp := &examplev1.MyApp{}
    if err := r.Get(ctx, req.NamespacedName, myapp); err != nil {
        return ctrl.Result{}, client.IgnoreNotFound(err)
    }

    // 2. 获取或创建 Deployment
    dep := &appsv1.Deployment{}
    // 检查 Deployment 是否存在,否则创建

    // 3. 更新状态
    myapp.Status.ReadyReplicas = dep.Status.ReadyReplicas
    r.Status().Update(ctx, myapp)

    return ctrl.Result{}, nil
}

三、实战:使用 Operator SDK 开发 Operator

3.1 环境准备

  • Go 1.19+
  • Kubernetes 集群(minikube 或 kind)
  • operator-sdk 1.30+

初始化项目:

operator-sdk init --domain example.com --repo github.com/example/myapp-operator
operator-sdk create api --group example --version v1 --kind MyApp --resource --controller

3.2 定义资源结构

编辑 api/v1/myapp_types.go

type MyAppSpec struct {
    Replicas int32  `json:"replicas,omitempty"`
    Image    string `json:"image,omitempty"`
}

type MyAppStatus struct {
    ReadyReplicas int32 `json:"readyReplicas,omitempty"`
}

执行 make generate 生成代码。

3.3 实现控制器逻辑

controllers/myapp_controller.go 中编写 Reconcile 函数,参考第二节的伪代码。注意使用 controller-runtime 的客户端方法。

3.4 部署测试

make deploy
kubectl apply -f config/samples/example_v1_myapp.yaml
kubectl get myapp

Operator Deployment Result

四、总结

本文从 CRD 定义出发,深入讲解了控制循环的原理,并通过 Operator SDK 实战开发了一个完整的 Operator。理解这些核心概念是掌握 K8s 扩展能力的关键。希望读者能够举一反三,应用到实际业务中。

关键要点:

  • CRD 是自定义资源的基础,需严格定义 Schema
  • Reconcile 函数是控制器的核心,需处理 idempotency
  • Operator SDK 简化了脚手架和 RBAC 配置

如果你对 Operator 开发感兴趣,欢迎关注我的后续文章,我们将讨论高级话题如 Webhook 和调优。

觉得内容不错?我要

评论 暂无评论
暂无评论,快来抢沙发吧~