猿问

获取在 kubebuilder 中触发控制器的事件类型

我刚刚开始使用 kubebuilder 和 Golang,使用自定义资源扩展我们的 Kubernetes 集群。我很想根据事件在协调器函数中做不同的事情,实际上称之为事件。


是否已创建资源?它更新了吗?它被删除了吗?


这些事件中的每一个都会触发控制器,但是,我似乎找不到可能看到哪些事件实际发生了。我可以通过编写如下协调器来解决此问题:


func (r *ServiceDescriptorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {

    service := &batchv1.ServiceDescriptor{}

    if err := r.Get(context.TODO(), req.NamespacedName, service); err != nil && errors.IsNotFound(err) {

        fmt.Println("Resource was not found -> must have been deleted")

    else {

        fmt.Println("No errors found -> Resource must have been created or updated")

    }

}

然而,这感觉奇怪地含蓄和有点黑客。


有没有一种干净(可能是本机)的方法来获取协调器调用的事件类型?


MYYA
浏览 166回答 2
2回答

胡说叔叔

您将无法做到这一点,因为此系统被设计为基于级别的,它不是由单个事件更改触发的,而是由从apiserver获取的实际集群状态触发的。看着你,你会发现在第84行有这样的评论:reconcile.go协调是基于级别的,这意味着操作不是由单个事件中的更改驱动的,而是由从 apiserver 或本地缓存读取的实际群集状态驱动的。例如,如果响应 Pod 删除事件,则请求不会包含 Pod 已被删除,相反,协调函数会在读取集群状态并看到 Pod 缺失时观察到这一点。在第44行:请求包含协调 Kubernetes 对象所需的信息。这包括唯一标识对象的信息 - 其名称和命名空间。它不包含有关任何特定事件或对象内容本身的信息。

肥皂起泡泡

您可以尝试 。WithEventFilter(predicate.Funcs{})由于在实际删除项后调用协调循环时未执行任何操作,因此删除事件的谓词可以简单地返回 false!还有一个方便的 Funcs 类型,它实现了谓词接口,并允许您传入要用作谓词的函数。将它们放在一起以过滤掉删除事件,我们有:func (r *CronJobReconciler) SetupWithManager(mgr ctrl.Manager) error {    return ctrl.NewControllerManagedBy(mgr).        For(&batch.CronJob{}).        WithEventFilter(predicate.Funcs{            DeleteFunc: func(e event.DeleteEvent) bool {                // The reconciler adds a finalizer so we perform clean-up                // when the delete timestamp is added                // Suppress Delete events to avoid filtering them out in the Reconcile function                return false            },        }).        Complete(r) }https://stuartleeks.com/posts/kubebuilder-event-filters-part-1-delete/
随时随地看视频慕课网APP

相关分类

Go
我要回答