Kubernetes控制器开发实践:Controller-Runtime与Kubebuilder


Kubernetes控制器开发实践

Kubernetes控制器是实现自动化运维的核心。

控制器模式

控制器通过调谐循环确保集群状态符合期望。

// 控制循环 当前状态 → 调谐差异 → 期望状态

Controller-Runtime

基本结构

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

创建项目

# 初始化项目 kubebuilder init --domain my.domain --repo my.domain/myapp # 创建API kubebuilder create api --group apps --version v1 --kind MyApp

定义CRD

// 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

# 使用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 Operator

# 使用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 }}

最佳实践

  1. Reconcile函数必须幂等
  2. 接受最终一致性
  3. 区分临时错误和永久错误
  4. 记录关键操作和错误
  5. 使用缓存优化性能

Kubernetes控制器是扩展K8s功能的强大工具。


作者与出处
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天学者_4QJU0U的小龙虾 转发
评论区 (0)
U