如何让kubernetes.client.api.batch_v1_api.BatchV1Api.delete_namespaced_job等到删除完成
How to make kubernetes.client.api.batch_v1_api.BatchV1Api.delete_namespaced_job wait till deletion is complete
我删除并重新提交了同名的作业,但我经常收到 409 HTTP 错误消息,提示正在删除该对象——我的提交是在作业对象被删除之前进行的。
我目前的解决方案是反复尝试,直到我能够提交作业。我不喜欢它。这看起来很丑陋,我想知道是否有一种方法可以等待对象完全删除来调用删除例程。根据 ,kubectl 在从删除命令返回之前等待对象被实际删除。我想知道 Python 客户端是否有选项。
这是我的旋转提交代码(抱歉,无法运行):
# Set up client
config.load_kube_config(context=context)
configuration = client.Configuration()
api_client = client.ApiClient(configuration)
batch_api = client.BatchV1Api(api_client)
job = create_job_definition(...)
batch_api.delete_namespaced_job(job.metadata.name, "my-namespace")
for _ in range(50):
try:
return batch_api.create_namespaced_job(self.namespace, job)
except kubernetes.client.rest.ApiException as e:
body = json.loads(e.body)
job_is_being_deleted = body["message"].startswith("object is being deleted")
if not job_is_being_deleted:
raise
time.sleep(0.05)
但愿如此
batch_api.delete_namespaced_job(job.metadata.name, "my-namespace", wait=True)
batch_api.create_namespaced_job(self.namespace, job)
我发现了一个类似的问题,,这意味着我需要在一个单独的线程中启动一个手表,发出删除命令,加入等待手表确认删除的线程 - - 似乎有很多这样的代码。
正如您已经提到的,kubectl delete 具有执行此确切工作的 --wait
标志,默认情况下为 true
。
让我们看一下代码,看看kubectl是如何实现的。 Source.
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()
此外还有 RunWait() and IsDeleted() 函数定义。
现在回答你的问题:
[...] which means I need to start a watch in a separate thread, issue delete command, join the thread that waits till the deletion is confirmed by the watch -- seems like a lot of code for such a thing
看起来确实如此 - 代码很多,但我看不到任何替代方案。如果您想等待删除完成,则需要手动进行。似乎没有其他解决方法。
我删除并重新提交了同名的作业,但我经常收到 409 HTTP 错误消息,提示正在删除该对象——我的提交是在作业对象被删除之前进行的。
我目前的解决方案是反复尝试,直到我能够提交作业。我不喜欢它。这看起来很丑陋,我想知道是否有一种方法可以等待对象完全删除来调用删除例程。根据
这是我的旋转提交代码(抱歉,无法运行):
# Set up client
config.load_kube_config(context=context)
configuration = client.Configuration()
api_client = client.ApiClient(configuration)
batch_api = client.BatchV1Api(api_client)
job = create_job_definition(...)
batch_api.delete_namespaced_job(job.metadata.name, "my-namespace")
for _ in range(50):
try:
return batch_api.create_namespaced_job(self.namespace, job)
except kubernetes.client.rest.ApiException as e:
body = json.loads(e.body)
job_is_being_deleted = body["message"].startswith("object is being deleted")
if not job_is_being_deleted:
raise
time.sleep(0.05)
但愿如此
batch_api.delete_namespaced_job(job.metadata.name, "my-namespace", wait=True)
batch_api.create_namespaced_job(self.namespace, job)
我发现了一个类似的问题,
正如您已经提到的,kubectl delete 具有执行此确切工作的 --wait
标志,默认情况下为 true
。
让我们看一下代码,看看kubectl是如何实现的。 Source.
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()
此外还有 RunWait() and IsDeleted() 函数定义。
现在回答你的问题:
[...] which means I need to start a watch in a separate thread, issue delete command, join the thread that waits till the deletion is confirmed by the watch -- seems like a lot of code for such a thing
看起来确实如此 - 代码很多,但我看不到任何替代方案。如果您想等待删除完成,则需要手动进行。似乎没有其他解决方法。