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

一、什么是 CRD?
CRD(Custom Resource Definition)允许用户定义自己的 Kubernetes 资源类型,例如 MyApp。定义 CRD 后,K8s API 服务器可识别并存储该资源实例。一个典型的 CRD 包含以下字段:
group:API 组,如example.comversions:版本列表,如v1scope:作用域(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
二、控制循环(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 --controller3.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
四、总结
本文从 CRD 定义出发,深入讲解了控制循环的原理,并通过 Operator SDK 实战开发了一个完整的 Operator。理解这些核心概念是掌握 K8s 扩展能力的关键。希望读者能够举一反三,应用到实际业务中。
关键要点:
- CRD 是自定义资源的基础,需严格定义 Schema
- Reconcile 函数是控制器的核心,需处理 idempotency
- Operator SDK 简化了脚手架和 RBAC 配置
如果你对 Operator 开发感兴趣,欢迎关注我的后续文章,我们将讨论高级话题如 Webhook 和调优。
觉得内容不错?我要