监视kubernetes作业

监视kubernetes作业,kubernetes,kubernetes-health-check,Kubernetes,Kubernetes Health Check,我有kubernetes的工作,需要不同的时间才能完成。在4到8分钟之间。有什么方法可以让我知道一项工作何时完成,而不是假设最坏的情况下等待8分钟。我有一个执行以下操作的测试用例: 1) Submits the kubernetes job. 2) Waits for its completion. 3) Checks whether the job has had the expected affect. 问题是,在提交kubernetes中部署作业的java测试中,我等待了8分钟,即使作业

我有kubernetes的工作,需要不同的时间才能完成。在4到8分钟之间。有什么方法可以让我知道一项工作何时完成,而不是假设最坏的情况下等待8分钟。我有一个执行以下操作的测试用例:

1) Submits the kubernetes job.
2) Waits for its completion.
3) Checks whether the job has had the expected affect.

问题是,在提交kubernetes中部署作业的java测试中,我等待了8分钟,即使作业完成的时间少于此时间,因为我无法从java测试中监控作业的状态。

您没有提到实际检查作业完成情况的内容,但是不要盲目地等待,希望得到最好的结果,你应该在一个循环中不断轮询作业的状态,直到它“完成”。

我不知道你在说什么样的任务,但让我们假设你正在运行一些pod

你能行

watch 'kubectl get pods | grep <name of the pod>'
当然,它不会是全名,因为如果您正在运行nginx replica或部署,大多数情况下pod都会随机命名。您的pod最终会出现nginx-1696122428-ftjvy这样的名称,所以您需要这样做

watch 'kubectl get pods | grep nginx'
您可以将吊舱替换为您正在做的任何工作,即(rc、svc、部署…)


所以我们一直轮询这个端点,直到它完成。希望这对别人有帮助。

既然你说的是Java;您可以从开始使用kubernetes java绑定来启动作业并添加观察者:

KubernetesClient k = ...
k.extensions().jobs().load(yaml).watch (new Watcher <Job>() {

  @Override
  public void onClose (KubernetesClientException e) {}

  @Override
  public void eventReceived (Action a, Job j) {
    if(j.getStatus().getSucceeded()>0)
      System.out.println("At least one job attempt succeeded");
    if(j.getStatus().getFailed()>0)
      System.out.println("At least one job attempt failed");
  }
});
KubernetesClient k=。。。
k、 扩展().jobs().load(yaml.watch)(新的观察者(){
@凌驾
公共void onClose(kubernetescliente){}
@凌驾
收到公共无效事件(行动a、作业j){
如果(j.getStatus().getsuccessed()>0)
System.out.println(“至少一次作业尝试成功”);
如果(j.getStatus().getFailed()>0)
System.out.println(“至少一次作业尝试失败”);
}
});

我发现在使用job.getStatus()进行轮询时,JobStatus没有得到更新 即使在使用kubectl从命令提示符进行检查时状态发生变化

为了解决这个问题,我重新加载作业处理程序:

    client.extensions().jobs()
                       .inNamespace(myJob.getMetadata().getNamespace())
                       .withName(myJob.getMetadata().getName())
                       .get();
检查作业状态的循环如下所示:

    KubernetesClient client = new DefaultKubernetesClient(config);
    Job myJob = client.extensions().jobs()
                      .load(new FileInputStream("/path/x.yaml"))
                      .create();
    boolean jobActive = true;
    while(jobActive){
        myJob = client.extensions().jobs()
                .inNamespace(myJob.getMetadata().getNamespace())
                .withName(myJob.getMetadata().getName())
                .get();
        JobStatus myJobStatus = myJob.getStatus();
        System.out.println("==================");
        System.out.println(myJobStatus.toString());

        if(myJob.getStatus().getActive()==null){
            jobActive = false;
        }
        else {
            System.out.println(myJob.getStatus().getActive());
            System.out.println("Sleeping for a minute before polling again!!");
            Thread.sleep(60000);
        }
    }

    System.out.println(myJob.getStatus().toString());

希望这有帮助

您可以使用NewSharedInformer方法查看作业的状态。不知道如何用Java编写,下面是定期获取工作列表的golang示例:

类型ClientImpl结构{
客户端*kubernetes.Clientset
}
键入JobListFunc func()([]batchv1.Job,错误)
变量(
jobsSelector=labels.SelectorFromSet(labels.Set(映射[string]字符串{“作业标签”:“我的标签”})).string()
)
func(c*ClientImpl)NewJobSharedInformer(resyncPeriod time.Duration)JobListFunc{
一次同步
变量jobListFunc jobListFunc
一次,做吧(
func(){
restClient:=c.clients.BatchV1().restClient()
选项修改器:=func(选项*metav1.ListOptions){
options.LabelSelector=作业选择器
}
监视列表:=cache.NewFilteredListWatchFromClient(restClient,“作业”,metav1.NamespaceAll,选项Modifier)
informer:=cache.NewSharedInformer(监视列表和batchv1.Job{},resyncPeriod)
转到informer.Run(context.Background().Done())
jobListFunc=jobListFunc(func()(作业[]batchv1.Job,错误){
对于u3;,c:=range informer.GetStore().List(){
jobs=append(jobs,*(c.(*batchv1.Job)))
}
返回工作,零
})
})
返回jobListFunc
}
然后在监视器中,您可以通过排列作业列表来检查状态:

func-syncJobStatus(){
作业,错误:=jobListFunc()
如果错误!=零{
log.Errorf(“未能列出作业:%v”,错误)
返回
}
//TODO:其他代码
对于u,作业:=范围作业{
名称:=作业。名称
//检查状态。。。
}
}

更好的是,您可以使用标签:
查看'kubectl get pods-l job=foobar'
kubectl get-w pods-l job=foobar
如果我连接到该框,这很好,但是我正试图从java测试中获取作业的状态。抱歉,我应该在问题中提到这一点。我现在已经编辑好了。我正在考虑如何将ssh放到kube框中,然后观察作业的状态。但是,如果有人知道一个端点可以被监视,以便在作业尚未完成时查看作业的状态,那么知道这一点就太好了。很抱歉来晚了,我要告诉您关于api的内容,就像@trial999一样,您也不需要通过ssh连接到kube box,只需将kubectl配置为连接到您的masterkubernetes,因为作业是一种特殊的工作,就像一个吊舱,但范围不同。我相信作者问的是关于乔布斯()的道歉,我应该在问题中提到,我想通过Java测试来监控这一点。将编辑问题。我不知道您正在使用哪个客户端库,但测试的逻辑应该与我解释的相同:轮询作业状态,检查Json响应中的作业状态,重试,直到此状态等于“已完成”。您是对的。我采纳了你的建议,并在下面详述了我的解决方案。
"status": {
    "conditions": [
      {
        "type": "Complete",
        "status": "True",
        "lastProbeTime": "2016-09-22T13:59:03Z",
        "lastTransitionTime": "2016-09-22T13:59:03Z"
      }
    ],
    "startTime": "2016-09-22T13:56:42Z",
    "completionTime": "2016-09-22T13:59:03Z",
    "succeeded": 1
  }
KubernetesClient k = ...
k.extensions().jobs().load(yaml).watch (new Watcher <Job>() {

  @Override
  public void onClose (KubernetesClientException e) {}

  @Override
  public void eventReceived (Action a, Job j) {
    if(j.getStatus().getSucceeded()>0)
      System.out.println("At least one job attempt succeeded");
    if(j.getStatus().getFailed()>0)
      System.out.println("At least one job attempt failed");
  }
});
    client.extensions().jobs()
                       .inNamespace(myJob.getMetadata().getNamespace())
                       .withName(myJob.getMetadata().getName())
                       .get();
    KubernetesClient client = new DefaultKubernetesClient(config);
    Job myJob = client.extensions().jobs()
                      .load(new FileInputStream("/path/x.yaml"))
                      .create();
    boolean jobActive = true;
    while(jobActive){
        myJob = client.extensions().jobs()
                .inNamespace(myJob.getMetadata().getNamespace())
                .withName(myJob.getMetadata().getName())
                .get();
        JobStatus myJobStatus = myJob.getStatus();
        System.out.println("==================");
        System.out.println(myJobStatus.toString());

        if(myJob.getStatus().getActive()==null){
            jobActive = false;
        }
        else {
            System.out.println(myJob.getStatus().getActive());
            System.out.println("Sleeping for a minute before polling again!!");
            Thread.sleep(60000);
        }
    }

    System.out.println(myJob.getStatus().toString());
$ kubectl wait --for=condition=complete --timeout=600s job/myjob