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