为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
智慧大石 2022-11-23 20:19:47

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

}


查看完整描述

1 回答

?
心有法竹

TA贡献1599条经验 获得超5个赞

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

}

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


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信