首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K8s操作符使用事件筛选器侦听秘密更改

K8s操作符使用事件筛选器侦听秘密更改
EN

Stack Overflow用户
提问于 2022-03-26 09:48:56
回答 1查看 845关注 0票数 3

几个月前,我们创建了一个控制器,它使用kubebuilder运行得很好。

几周前,我们在一个秘密中添加了一个“侦听器”,当秘密更改(秘密属性)时,对账应该被调用,问题是有时工作,而有时不工作,(您更改了秘密,应用它,和解就不会发生),我们这样做是为了精确的相同的秘密文件。

我们试图在几天内找到根本原因,但没有成功(我们改变了k8s.io/client-go v0.23.4,也改变了v0.22.3和现在只起作用的v0.22.1。知道问题可能是什么吗?任何暗示都会有帮助。或者其他我们可以尝试的方法。

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-28 15:24:13

最有可能的问题是,WithEventFIlter应用于控制器所监视的所有对象。CRD的生成是自动递增的,但这并不适用于所有资源类型。

来自GenerationChangedPredicate文档:

代码语言:javascript
复制
// 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集群中没有)。

它很可能适用于创建,因为最初控制器将将现有资源与集群同步。

要解决这个问题,您可以使用:

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

它应该只将谓词应用于自定义资源。

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

https://stackoverflow.com/questions/71626957

复制
相关文章

相似问题

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