登录
首页 >  Golang >  Go问答

监听 Kubernetes Operator 使用事件筛选器检测秘密变更

来源:stackoverflow

时间:2024-02-28 13:36:26 237浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《监听 Kubernetes Operator 使用事件筛选器检测秘密变更》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

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

几周前,我们向秘密添加了一个“监听器”,当秘密发生变化时(秘密属性) 应该调用协调,问题是它有时工作有时不,(您更改秘密应用它并且协调不不会发生),我们正在为完全相同的相同秘密文件执行此操作。

我们尝试了几天来找到根本原因,但没有成功(我们将 k8s.io/client-go v0.23.4v0.22.3 更改为 v0.22.1 ,现在 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()]
}

正确答案


最有可能的问题是 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)
}

它应该仅将谓词应用于您的自定义资源。

到这里,我们也就讲完了《监听 Kubernetes Operator 使用事件筛选器检测秘密变更》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>