自定义资源的Controller创建出来的子资源,子资源创建的子资源(子子资源),如何Watch子子资源的事件?我们以MyDeployment->创建Pod->创建Event,想要watch Pod创建的Event的Create事件为例。
自定义的MyDeployment资源可以通过Controller Manager的Builder的Owns方法订阅Pod的增删改事件,因为Pod是我们创建出来的,并且指定了Pod的ownerReference为自定义资源MyDeployment的对象。
假如现在我们想要订阅由Pod产生的Event的创建呢?
由于Pod产生的Event其ownerReference也不是自定义资源MyDeployment的对象,所以无法通过Owns方法订阅。(其实Event资源也没有ownerReference,只有involvedObject,不过其它类型资源有,只是以此举例。虽然Event资源没有ownerReference,但此案例确实也生效。)
好在kubebuilder提供了Owns的底层实现,即Watches方法。使用Watches方法同样可以达到调用Owns方法的效果。只是使用Owns方法我们无法指定ownerReference,而Watches方法可以。
因此,我们可以使用Watches方法来订阅由Pod产生的Event事件,案例代码如下:
func (r *MyDeploymentReconciler) SetupWithManager(mgr ctrl.Manager) error {
return ctrl.NewControllerManagedBy(mgr).
For(&v1beta1.MyDeployment{}).
Watches(&source.Kind{Type: &v1.Event{}}, // watch Event资源
&handler.EnqueueRequestForOwner{
IsController: false,
OwnerType: &v1.Pod{},
}, // 入controller事件队列的过滤条件, Event的Owner(involvedObject)类型是Pod,然后IsController是false
builder.WithPredicates(predicate.Funcs{
CreateFunc: func(createEvent event.CreateEvent) bool {
obj := createEvent.Object
eventObj, ok := obj.(*v1.Event)
if !ok {
return false
}
if eventObj.InvolvedObject.Kind != "Pod" {
return false
}
// 其它自定义的过滤条件
},
})).
Complete(r)
}