如何解决如何让 kubernetes.client.api.batch_v1_api.BatchV1Api.delete_namespaced_job 等到删除完成
我删除并重新提交同名的作业,但经常收到 409 HTTP 错误,并显示一条消息,指出正在删除对象——我的提交在作业对象被删除之前进行。
我目前的解决方案是反复尝试,直到我能够提交作业。我不喜欢。这看起来很丑陋,我想知道是否有办法以等待对象完全删除的方式调用删除例程。根据 this 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)
我发现了一个类似的问题,还有the answer suggests to use watch,这意味着我需要在一个单独的线程中启动一个手表,发出删除命令,加入等待手表确认删除的线程——似乎像很多这样的代码。
解决方法
正如您已经提到的,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() 和 IsDeleted() 函数定义。
现在回答您的问题:
[...] 这意味着我需要在一个单独的线程中启动一个手表,发出删除命令,加入等待手表确认删除的线程 - 似乎有很多代码用于这样的事情
看起来确实如此 - 代码很多,但我没有看到任何替代方案。如果您想等待删除完成,您需要手动进行。似乎没有其他办法可以解决它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。