簡體   English   中英

K8s Operator 使用事件過濾器監聽秘密變化

[英]K8s Operator listen to secret change with event filter

我們在幾個月前創建了 controller,它使用 kubebuilder 運行良好。

幾周前,我們向一個秘密添加了一個“偵聽器”,當秘密發生變化時(秘密屬性)應該調用調和,問題是它有時工作有時不工作,(你改變秘密應用它並協調不會發生),我們正在為完全相同的秘密文件做這件事。

我們嘗試了幾天沒有成功地找到根本原因,(我們將k8s.io/client-go v0.23.4和 v0.22.3 更改為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.

您可以通過創建一個秘密/更新一個秘密來檢查這一點,您會看到沒有生成集(至少在我的本地 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)
}

它應該只將謂詞應用於您的自定義資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM