【问题标题】:Controller not notified about final Job status控制器未收到有关最终作业状态的通知
【发布时间】:2023-01-31 21:39:05
【问题描述】:

我正在构建一个生成作业的应用程序 (batch/v1),我需要使用作业状态更新我的自定义资源状态。

我使用以下设置控制器:

func (r *JobsManagedByRequestedBackupActionObserver) SetupWithManager(mgr ctrl.Manager) error {
    return ctrl.NewControllerManagedBy(mgr).
        For(&riotkitorgv1alpha1.RequestedBackupAction{}).
        Owns(&batchv1.Job{}).
        Owns(&batchv1.CronJob{}).
        WithEventFilter(predicate.Funcs{
            DeleteFunc: func(e event.DeleteEvent) bool {
                return false
            },
        }).
        Complete(r)
}

Reconcile(ctx context.Context, req ctrl.Request) 期间,我获取我的 RequestedBackupAction 对象(基于“req”),然后我使用专用跟踪标签从 API 获取 Jobs。

list, err := kj.client.Jobs(namespace).List(ctx, metav1.ListOptions{LabelSelector: v1alpha1.LabelTrackingId + "=" + trackingId})

当我迭代对象时:

for _, job := range list.Items {
        logrus.Errorf("[++++++++++++] JOB name=%s, failed=%v, active=%v, succeeded=%v", job.Name, job.Status.Failed, job.Status.Active, job.Status.Succeeded)
}

然后我得到多个这样的条目:

time="2022-12-12T20:00:55Z" level=error msg="[++++++++++++] JOB name=app1-backup-vmqrp, failed=0, active=1, succeeded=0"

但我最终没有得到一个条目,应该有:failed=1, active=0, succeeded=0 即使 Job 实际上完成了 - 关键是控制器没有收到通知。

这是最终的工作状态:

  status:
    conditions:
    - lastProbeTime: "2022-12-12T20:00:56Z"
      lastTransitionTime: "2022-12-12T20:00:56Z"
      message: Job has reached the specified backoff limit
      reason: BackoffLimitExceeded
      status: "True"
      type: Failed
    failed: 1
    ready: 0
    startTime: "2022-12-12T20:00:50Z"
    uncountedTerminatedPods: {}

有什么问题吗?

【问题讨论】:

    标签: go kubernetes client-go kubebuilder


    【解决方案1】:

    解决方案非常简单——当对象还没有准备好时,重新排队,这对 Job 来说意味着要等到它完成。我仍然不明白为什么控制器没有收到有关状态更改的通知:active=1 到 active=0 以及从 failed=0 到 failed=1

    例子:

    if healthStatus.Running {
        return ctrl.Result{Requeue: true}, nil
    }
    

    【讨论】:

      【解决方案2】:

      您是否在创建之前设置了您拥有的资源的控制器引用?

      SetControllerReference 函数使用父资源的引用填充所有者资源的 metadata.ownerReferences 字段。如果不设置owner reference,则拥有资源的变化不会触发父资源。

      // instance is your custom resource
      // job is the resource that supposed to be owned by instance
      
      err = ctrl.SetControllerReference(instance, job, r.Scheme)
      if err != nil {
          return err
      }
      
      err = r.Create(ctx, job)
      if err != nil {
          return err
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        相关资源
        最近更新 更多