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

调用 kubernetes 运算符在外部资源更改时协调循环

调用 kubernetes 运算符在外部资源更改时协调循环

Go
牧羊人nacy 2022-09-26 14:59:17
我正在开发一个 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的完整对象数据
查看完整描述

1 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

根据设计,触发对帐的事件不会传递到协调器,因此您被迫定义状态并对其执行操作。此方法称为基于级别,而不是基于边缘

在您的示例中,您有两个要尝试跟踪的资源。我会建议:

  1. 使用所有者引用或标签(如果这些资源相关)。通过这种方式,您可以获取给定作业的所有相关数据集(反之亦然),并以这种方式进行协调。

  2. 如果这两个资源不相关,请为每个资源创建一个单独的控制器。

如果要防止对某些事件进行对帐,则可以使用谓词。例如,从谓词函数中的事件中,可以通过以下方式获取对象类型。e.Object.(*core.Pod)


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号