为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MYYA 2022-08-30 15:04:50
我刚刚开始使用 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")    }}然而,这感觉奇怪地含蓄和有点黑客。有没有一种干净(可能是本机)的方法来获取协调器调用的事件类型?
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

您将无法做到这一点,因为此系统被设计为基于级别的,它不是由单个事件更改触发的,而是由从apiserver获取的实际集群状态触发的。

看着你,你会发现在第84行有这样的评论:reconcile.go

协调是基于级别的,这意味着操作不是由单个事件中的更改驱动的,而是由从 apiserver 或本地缓存读取的实际群集状态驱动的。例如,如果响应 Pod 删除事件,则请求不会包含 Pod 已被删除,相反,协调函数会在读取集群状态并看到 Pod 缺失时观察到这一点。

在第44行:

请求包含协调 Kubernetes 对象所需的信息。这包括唯一标识对象的信息 - 其名称和命名空间。它不包含有关任何特定事件或对象内容本身的信息


查看完整回答
反对 回复 2022-08-30
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您可以尝试 。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/


查看完整回答
反对 回复 2022-08-30
  • 2 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信