1

我在控制器中使用 kubebuilder 框架,我想完全忽略给定系统名称空间列表中的事件。我认为谓词必须是最好的选择,因此我有以下代码

...

WithEventFilter(predicate.Funcs{
            GenericFunc: func(e event.GenericEvent) bool {
                namespace := e.Object.GetNamespace()
                if _, ok := systemNs[namespace]; ok {
                    // ignore events from system namespaces
                    return false
                }

                return true
            },
}).

但是,我仍然接收来自所有命名空间的事件,而不仅仅是我允许的事件。这是一个正确有效的谓词用例吗?

4

1 回答 1

0

根据控制器运行时

调用 Generic 以响应未知类型的事件或作为 cron 或外部触发请求触发的合成事件 - 例如协调 Autoscaling 或 Webhook。

大多数情况下,协调会在 、 或 上触发CreateUpdate因此Delete您需要过滤这些事件。

WithEventFilter(predicate.Funcs{
    CreateFunc: func(e event.CreateEvent) bool {
        namespace := e.Object.GetNamespace()
        if _, ok := systemNs[namespace]; ok {
            // ignore events from system namespaces
            return false
        }
        return true
    },
    UpdateFunc: func(e event.UpdateEvent) bool {
        namespace := e.ObjectNew.GetNamespace()
        if _, ok := systemNs[namespace]; ok {
            // ignore events from system namespaces
            return false
        }
        return true
    },
    DeleteFunc: func(e event.DeleteEvent) bool {
        namespace := e.Object.GetNamespace()
        if _, ok := systemNs[namespace]; ok {
            // ignore events from system namespaces
            return false
        }
        return true
    },
}).
于 2021-12-11T16:31:08.490 回答