首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取事件类型,从而触发kubebuilder中的控制器。

获取事件类型,从而触发kubebuilder中的控制器。
EN

Stack Overflow用户
提问于 2021-05-10 14:53:05
回答 2查看 840关注 0票数 3

我刚刚开始使用kubebuilder和Golang来使用自定义资源扩展我们的Kubernetes集群。我想要做不同的事情在调节-功能的基础上的事件,实际上叫它。

资源被创建了吗?更新了吗?被删除了吗?

这些事件中的每一个都会触发控制器,但是,我似乎无法看到这些事件中到底发生了哪些事件。我可以通过编写这样的协调器来解决这个问题:

代码语言:javascript
复制
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")
    }
}

然而,这感觉有点含蓄,有点烦人。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-11 09:50:41

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

看看reconcile.go,您会注意到行中#84有这样的评论:

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

和线上#44

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

票数 4
EN

Stack Overflow用户

发布于 2022-04-02 09:49:34

你可以试试WithEventFilter(predicate.Funcs{})

因为在项目实际被删除后调用时,return循环没有采取任何行动,所以delete事件的谓词可以返回false!还有一个方便的Funcs类型,它实现谓词接口,并允许您传递希望用作谓词的函数。将所有这些放在一起过滤掉删除事件,我们有: SetupWithManager( ctrl.Manager)错误{返回ctrl.NewControllerManagedBy(mgr)。用于(&batch.CronJob{})WithEventFilter(predicate.Funcs{ DeleteFunc: func(e event.DeleteEvent) bool { //调节器添加了一个终结器,因此当添加//抑制删除时间戳时,我们执行清理/删除事件,以避免在协调函数中过滤掉它们,返回false },})。完全(R)}

https://stuartleeks.com/posts/kubebuilder-event-filters-part-1-delete/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67472710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档