gpt4 book ai didi

go - K8s Operator 使用事件过滤器监听 secret 变化

转载 作者:行者123 更新时间:2023-12-05 04:32:36 27 4
gpt4 key购买 nike

我们几个月前创建了 Controller ,它使用 kubebuilder 运行良好。

几周前,我们为 secret 添加了一个“监听器”,当 secret 发生变化时( secret 属性)reconcile 应该被调用,问题是它有时工作有时不工作,(你改变了应用它的 secret 并且 reconcile 没有't happens) ,我们正在为完全相同的相同 secret 文件做这件事。

我们试了几天没有成功找到根本原因,(我们将 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()]
}

最佳答案

最有可能的问题是 WithEventFIlter 应用于 Controller 监视的所有对象。 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.

您可以通过创建一个 secret /更新一个 secret 来检查这一点,您会看到没有生成集(至少在我的本地 k3d 集群上没有)。

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

要解决它,您可以使用:

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)
}

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

关于go - K8s Operator 使用事件过滤器监听 secret 变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71626957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com