0

图书馆里有很多字段,但基本上都是关于工作是否完成,但是如何检查工作是否完成并成功或工作是否完成和失败

if con.Type == v1.JobComplete && con.Status == corev1.ConditionTrue && job.Status.Succeeded > 0 {
    fmt.Printf("Job: %v Completed Successfully: %v\n", name, con)
    break
} else if con.Type == v1.JobFailed && con.Status == corev1.ConditionTrue {
    if job.Status.Active == 0 && job.Status.Succeeded == 0 {
        fmt.Printf("Job: %v Failed: %v\n", name, con)
        break
    }
}

这就是我现在检查的方式,我不完全确定这是正确的

4

2 回答 2

1

您可以只使用 Active、Succeeded 和 Failed 变量来了解作业的状态。

例子:

    batchClient := kubernetesapi.BatchV1()
    jobClient := batchClient.Jobs(NameSpace)


    job, _ := jobClient.Get(jobName, metav1.GetOptions{})

    if job.Status.Active > 0 {
    return "Job is still running"

    } else {
      if job.Status.Succeeded > 0 {
       return "Job Successful"
       } 
       return "Job failed"
    }

如果您使用的backOffLimit大于 1 ,这应该会处理任何次数的作业重试。

于 2018-10-24T14:56:11.407 回答
1

Bharaths answer 类似,除了它处理在创建作业之后但在作业 pod 处于活动状态之前调用此函数的竞争条件。

func getJobStatus(jobName string) error {
    // k8sClient := initialize k8s client

    job, err := k8sClient.BatchV1().Jobs(h.namespace).Get(jobName, metav1.GetOptions{})
    if err != nil {
        return err
    }

    if job.Status.Active == 0 && job.Status.Succeeded == 0 && job.Status.Failed == 0 {
        return fmt.Errorf("%s hasn't started yet", job.Name)
    }

    if job.Status.Active > 0 {
        return fmt.Errorf("%s is still running", job.Name)
    }

    if job.Status.Succeeded > 0 {
        return nil // Job ran successfully
    }

    return fmt.Errorf("%s has failed with error", job.Name)
}
于 2021-09-21T01:23:10.707 回答