我正在开发一个 k8s 自定义资源,作为业务逻辑的一部分,当群集中的外部作业更改其自己的状态时,需要协调其状态。
这些作业不是由自定义资源本身创建的,而是为第三方服务在外部创建的,但是我需要协调 CRO 的状态,例如,当任何这些外部作业完成时。
在阅读了大量文档之后,我想出了为控制器设置一个观察程序,以监视像以下示例一样的作业。
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触发我的协调循环,并具有相应的名称和命名空间,但我对对象类型一无所知。
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
}
如何在协调对象类型中进行检查?所以我可以检索调用r.Get的完整对象数据
人到中年有点甜
相关分类