在 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 重试机制、引入最终一致性、支持事件通知等进阶特性。