我刚刚开始使用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")
}
}然而,这感觉有点含蓄,有点烦人。
是否有一种干净(可能是本机)的方法来获取调节器调用的事件类型?
发布于 2021-05-11 09:50:41
您将无法做到这一点,因为这个系统设计为基于级别的,它不是由单个事件更改触发的,而是由从apiserver获取的实际集群状态触发的。
看看reconcile.go,您会注意到行中#84有这样的评论:
协调是基于级别的,这意味着操作不是由单个事件中的更改驱动,而是由从apiserver或本地缓存读取的实际集群状态驱动。例如,如果响应Pod Delete事件,请求将不包含Pod被删除的内容,相反,当读取群集状态并将Pod视为缺失时,contain函数会观察到这一点。
和线上#44
请求包含协调Kubernetes对象所需的信息。这包括唯一标识对象的信息--名称和命名空间。它不包含任何特定事件或对象内容本身的信息。
发布于 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/
https://stackoverflow.com/questions/67472710
复制相似问题