我正在開發(fā)一個 k8s 自定義資源,作為業(yè)務(wù)邏輯的一部分,當群集中的外部作業(yè)更改其自己的狀態(tài)時,需要協(xié)調(diào)其狀態(tài)。這些作業(yè)不是由自定義資源本身創(chuàng)建的,而是為第三方服務(wù)在外部創(chuàng)建的,但是我需要協(xié)調(diào) CRO 的狀態(tài),例如,當任何這些外部作業(yè)完成時。在閱讀了大量文檔之后,我想出了為控制器設(shè)置一個觀察程序,以監(jiān)視像以下示例一樣的作業(yè)。func (r *DatasetReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&datasetv1beta1.Dataset{}). Watches(&source.Kind{Type: &batchv1.Job{}}, &handler.EnqueueRequestForObject{} /* filter by predicates, see https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.9.6/pkg/controller#Controller */). Complete(r)}不,我正在為Jobs和我的CR觸發(fā)我的協(xié)調(diào)循環(huán),并具有相應(yīng)的名稱和命名空間,但我對對象類型一無所知。func (r *DatasetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { l := log.FromContext(ctx) l.Info("Enter Reconcile loop") l.Info("Request", "Req", req) //if this is triggered by my CR dataset := &datasetv1beta1.Dataset{} r.Get(ctx, types.NamespacedName{Name: req.Name, Namespace: req.Namespace}, dataset) //whereas when triggered by a Job job := &batchv1.Job{} r.Get(ctx, types.NamespacedName{Name: req.Name, Namespace: req.Namespace}, job) return ctrl.Result{}, nil}如何在協(xié)調(diào)對象類型中進行檢查?所以我可以檢索調(diào)用r.Get的完整對象數(shù)據(jù)
1 回答

人到中年有點甜
TA貢獻1895條經(jīng)驗 獲得超7個贊
根據(jù)設(shè)計,觸發(fā)對帳的事件不會傳遞到協(xié)調(diào)器,因此您被迫定義狀態(tài)并對其執(zhí)行操作。此方法稱為基于級別,而不是基于邊緣。
在您的示例中,您有兩個要嘗試跟蹤的資源。我會建議:
使用所有者引用或標簽(如果這些資源相關(guān))。通過這種方式,您可以獲取給定作業(yè)的所有相關(guān)數(shù)據(jù)集(反之亦然),并以這種方式進行協(xié)調(diào)。
如果這兩個資源不相關(guān),請為每個資源創(chuàng)建一個單獨的控制器。
如果要防止對某些事件進行對帳,則可以使用謂詞。例如,從謂詞函數(shù)中的事件中,可以通過以下方式獲取對象類型。e.Object.(*core.Pod)
- 1 回答
- 0 關(guān)注
- 93 瀏覽
添加回答
舉報
0/150
提交
取消