Kubernetes控制器是实现自动化运维的核心。
控制器通过调谐循环确保集群状态符合期望。
// 控制循环 当前状态 → 调谐差异 → 期望状态
package main import ( "context" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" ) type MyReconciler struct { client.Client } func (r *MyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { // 1. 获取对象 var obj MyApp if err := r.Get(ctx, req.NamespacedName, &obj); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } // 2. 调谐逻辑 // 实现业务逻辑 // 3. 返回结果 return ctrl.Result{}, nil } func main() { mgr, _ := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{}) ctrl.NewControllerManagedBy(mgr). For(&MyApp{}). Complete(&MyReconciler{Client: mgr.GetClient()}) mgr.Start(ctrl.SetupSignalHandler()) }
# 初始化项目 kubebuilder init --domain my.domain --repo my.domain/myapp # 创建API kubebuilder create api --group apps --version v1 --kind MyApp
// API定义 type MyAppSpec struct { Replicas int32 `json:"replicas"` Image string `json:"image"` } type MyAppStatus struct { ReadyReplicas int32 `json:"readyReplicas"` } // +kubebuilder:object:root=true type MyApp struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` Spec MyAppSpec `json:"spec,omitempty"` Status MyAppStatus `json:"status,omitempty"` }
func (r *MyAppReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { log := log.FromContext(ctx) var myapp appv1.MyApp if err := r.Get(ctx, req.NamespacedName, &myapp); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } log.Info("Reconciling MyApp", "name", req.Name) // 创建Deployment dep := r.deploymentForMyApp(&myapp) if err := r.Create(ctx, dep); err != nil { return ctrl.Result{}, err } // 更新状态 myapp.Status.ReadyReplicas = myapp.Spec.Replicas r.Status().Update(ctx, &myapp) return ctrl.Result{}, nil }
# 使用Operator SDK operator-sdk init --domain my.domain --repo my.domain/myapp operator-sdk create api \ --group apps \ --version v1 \ --kind MyApp \ --resource \ --controller
# 使用Helm Chart部署应用 apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: myapp spec: chart: spec: chart: ./helm/myapp values: replicas: {{ .Spec.Replicas }} image: {{ .Spec.Image }}
Kubernetes控制器是扩展K8s功能的强大工具。