0

我删除并重新提交了同名的作业,我经常收到 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)

我发现了一个类似的问题,答案建议使用 watch,这意味着我需要在单独的线程中启动手表,发出删除命令,加入等待直到手表确认删除的线程 - 看起来像这样的事情有很多代码。

4

1 回答 1

1

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

让我们看一下代码,看看 kubectl 是如何实现的。来源

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()IsDeleted()函数定义。

现在回答你的问题:

[...]这意味着我需要在一个单独的线程中启动一个手表,发出删除命令,加入等待直到手表确认删除的线程 - 似乎有很多代码用于这样的事情

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

于 2021-05-24T10:05:41.657 回答