在 Kubernetes 云原生体系中,控制器(Controller)是实现资源自动化管理的核心组件。通过 Golang 编写自定义控制器,不仅可以拓展 Kubernetes 的能力,还能深入理解其事件驱动机制与声明式架构。

本篇文章将带你从零开始,构建一个用于自动创建 ConfigMap 的控制器。

项目准备

安装以下依赖:

  • Go 1.22+
  • Kubernetes 开发工具链(kubectl, kind/minikube)
  • Kubebuilder
  • Kustomize

初始化项目:

kubebuilder init --domain example.com --repo github.com/example/configmap-operator
kubebuilder create api --group apps --version v1 --kind ConfigMapGenerator

定义 API 资源

编辑 api/v1/configmapgenerator_types.go

type ConfigMapGeneratorSpec struct {
  Data map[string]string `json:"data,omitempty"`
}

type ConfigMapGeneratorStatus struct {
  Created bool `json:"created,omitempty"`
}

生成并注册 CRD:

make generate
make manifests

编写控制器逻辑

编辑 controllers/configmapgenerator_controller.go

func (r *ConfigMapGeneratorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
  var cmg appsv1.ConfigMapGenerator
  if err := r.Get(ctx, req.NamespacedName, &cmg); err != nil {
    return ctrl.Result{}, client.IgnoreNotFound(err)
  }

  configMap := corev1.ConfigMap{
    ObjectMeta: metav1.ObjectMeta{
      Name:      cmg.Name,
      Namespace: cmg.Namespace,
    },
    Data: cmg.Spec.Data,
  }

  err := r.Create(ctx, &configMap)
  if err != nil && !apierrors.IsAlreadyExists(err) {
    return ctrl.Result{}, err
  }

  cmg.Status.Created = true
  _ = r.Status().Update(ctx, &cmg)
  return ctrl.Result{}, nil
}

构建与部署

构建控制器镜像:

make docker-build docker-push IMG=your-registry/configmap-operator:v0.1.0

部署到集群:

make deploy IMG=your-registry/configmap-operator:v0.1.0

应用 CR 示例:

apiVersion: apps.example.com/v1
kind: ConfigMapGenerator
metadata:
  name: example-cm
spec:
  data:
    foo: bar

总结

通过本文,你学会了如何使用 Go 和 Kubebuilder 编写一个简单的 Kubernetes 控制器。云原生开发工程师在实际项目中可以利用类似方法创建自定义资源,自动化配置和服务的管理逻辑,提升集群智能化水平。

推荐下一步学习:深入 Reconcile Loop 重试机制、引入最终一致性、支持事件通知等进阶特性。