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