K8s Operator 使用事件过滤器监听秘密变化

我们在几个月前创建了控制器,它使用 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()]

}


智慧大石
浏览 325回答 1
1回答

心有法竹

最有可能的问题是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)}它应该只将谓词应用于您的自定义资源。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go