几个月前,我们创建了一个控制器,它使用kubebuilder运行得很好。
几周前,我们在一个秘密中添加了一个“侦听器”,当秘密更改(秘密属性)时,对账应该被调用,问题是有时工作,而有时不工作,(您更改了秘密,应用它,和解就不会发生),我们这样做是为了精确的相同的秘密文件。
我们试图在几天内找到根本原因,但没有成功(我们改变了k8s.io/client-go v0.23.4,也改变了v0.22.3和现在只起作用的v0.22.1。知道问题可能是什么吗?任何暗示都会有帮助。或者其他我们可以尝试的方法。
func (r *vtsReconciler) SetupWithManager(mgr ctrl.Manager) error {
manager := ctrl.NewControllerManagedBy(mgr).
For(&vts.str).
WithEventFilter(predicate.Or(predicate.AnnotationChangedPredicate{}))
manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {
return r.SecretRequests.SecretFinder(a.GetName())
}))
return manager.Complete(r)
}
func (secm *SecretMapper) SecretFinder(name string) []reconcile.Request {
v := cli.ObjectKey{Name: name}
return secm.SecMap[v.String()]
}发布于 2022-03-28 15:24:13
最有可能的问题是,WithEventFIlter应用于控制器所监视的所有对象。CRD的生成是自动递增的,但这并不适用于所有资源类型。
来自GenerationChangedPredicate文档:
// Caveats:
//
// * The assumption that the Generation is incremented only on writing to the spec does not hold for all APIs.
// E.g For Deployment objects the Generation is also incremented on writes to the metadata.annotations field.
// For object types other than CustomResources be sure to verify which fields will trigger a Generation increment when they are written to.您可以通过创建一个秘密/更新一个秘密来检查这一点,您将看到没有生成集(至少在我的本地k3d集群中没有)。
它很可能适用于创建,因为最初控制器将将现有资源与集群同步。
要解决这个问题,您可以使用:
func (r *vtsReconciler) SetupWithManager(mgr ctrl.Manager) error {
manager := ctrl.NewControllerManagedBy(mgr).
For(&vts.str, WithPredicates(predicate.Or(predicate.GenerationChangedPredicate{}, predicate.AnnotationChangedPredicate{}))).
manager = manager.Watches(&source.Kind{Type: &v1.Secret{}}, handler.EnqueueRequestsFromMapFunc(func(a client.Object) []reconcile.Request {
return r.SecretRequests.FindForSecret(a.GetNamespace(), a.GetName())
}))
return manager.Complete(r)
}它应该只将谓词应用于自定义资源。
https://stackoverflow.com/questions/71626957
复制相似问题