如何让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

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