如何使kubernetes.client.api.batch\u v1\u api.BatchV1Api.delete\u namespaced\u作业等待删除完成

如何使kubernetes.client.api.batch\u v1\u api.BatchV1Api.delete\u namespaced\u作业等待删除完成,kubernetes,kubernetes-python-client,Kubernetes,Kubernetes Python Client,我删除并重新提交一个同名的作业,经常会收到一个409 HTTP错误,并显示一条消息,表示该对象正在被删除——我的提交发生在作业对象被删除之前 我目前的解决方案是在我能够提交一份工作之前进行尝试。我不喜欢它。这看起来很难看,我想知道是否有一种方法可以调用删除例程,直到对象被完全删除。根据kubectl的说法,在从delete命令返回之前,会等待对象被实际删除。我想知道Python客户端是否有一个选项 这是我的自旋提交代码(抱歉,无法运行): 我希望是这样 batch_api.delete_name

我删除并重新提交一个同名的作业,经常会收到一个409 HTTP错误,并显示一条消息,表示该对象正在被删除——我的提交发生在作业对象被删除之前

我目前的解决方案是在我能够提交一份工作之前进行尝试。我不喜欢它。这看起来很难看,我想知道是否有一种方法可以调用删除例程,直到对象被完全删除。根据kubectl的说法,在从delete命令返回之前,会等待对象被实际删除。我想知道Python客户端是否有一个选项

这是我的自旋提交代码(抱歉,无法运行):

我希望是这样

batch_api.delete_namespaced_job(job.metadata.name, "my-namespace", wait=True)
batch_api.create_namespaced_job(self.namespace, job)


我发现了一个类似的问题,这意味着我需要在一个单独的线程中启动一个watch,发出delete命令,加入等待watch确认删除的线程——似乎有很多这样的代码。

正如您已经提到的,kubectl delete具有执行此确切作业的
--wait
标志,默认情况下为
true

让我们看看代码,看看kubectl是如何实现这一点的

此外,这里还有函数和函数定义

现在回答你的问题:

[…]这意味着我需要在一个单独的线程中启动一个watch,发出delete命令,加入等待watch确认删除的线程——似乎有很多这样的代码


看起来确实如此——代码很多,但我看不到任何替代方案。如果要等待删除完成,则需要手动执行。似乎没有其他的解决方法。

在这种情况下,添加线程似乎没有必要,除非您有其他操作,因为手表线程无论如何都必须等待手表结束,然后才能继续使用主线程吗?@KrishnaChaurasia博士说“默认情况下,使用etcd3的集群会在最后5分钟内保留更改。”,因此,在这种情况下,您是对的,如果我发出删除请求并对Watch()中的e执行
。stream(…,timeout_seconds=1):在遇到删除事件时立即中断()
。但是作为一名应用程序开发人员,我不知道集群设置是什么,我也不确定我是否可以依赖我观看()之后可用的事件,因此我认为我需要启动手表,使其与删除请求并行工作。我的代码用于散列一些作业参数,并将其用作作业名称,以便以后能够将一组参数映射到作业。如果多次调用该作业,则会发生名称冲突。我最终重新编写了计划,使作业名称为uni并且作业参数的散列存储在作业的元数据中。这样我就不再有名称冲突,也不需要在计划新作业之前删除作业。
batch_api.delete_namespaced_job(job.metadata.name, "my-namespace", wait=True)
batch_api.create_namespaced_job(self.namespace, job)

waitOptions := cmdwait.WaitOptions{
    ResourceFinder: genericclioptions.ResourceFinderForResult(resource.InfoListVisitor(deletedInfos)),
    UIDMap:         uidMap,
    DynamicClient:  o.DynamicClient,
    Timeout:        effectiveTimeout,

    Printer:     printers.NewDiscardingPrinter(),
    ConditionFn: cmdwait.IsDeleted,
    IOStreams:   o.IOStreams,
}
err = waitOptions.RunWait()