【问题标题】:Error when trying to create Kubernetes job尝试创建 Kubernetes 作业时出错
【发布时间】:2019-04-06 18:56:09
【问题描述】:

我已经定义了这个方法,它应该会为我创建一个 Kubernetes 作业。

def make_job():
    job = client.V1Job()
    job.metadata = client.V1ObjectMeta()
    job.metadata.name = "process"
    job.spec = client.V1JobSpec()
    job.spec.template = client.V1PodTemplate()
    job.spec.template.spec = client.V1PodTemplateSpec()
    job.spec.template.spec.restart_policy = "Never"
    job.spec.template.spec.containers = [
        make_container()
    ]
    return job

但是,它在这一行返回错误。

job.spec = client.V1JobSpec()

ValueError: Invalid value for `template`, must not be `None`

我想知道我是否在这里做错了什么,如果是,我在这里做错了什么?

编辑:

我已通过此更改解决了错误

job.spec = client.V1JobSpec(template=client.V1PodTemplate)

【问题讨论】:

    标签: python kubernetes yaml


    【解决方案1】:

    正如您已经知道的那样,如果不注入 template,就不可能构造一个 Job.Spec,这是在 Job documentation 中一成不变的东西。

    .spec.template 是 .spec 的唯一必填字段。

    .spec.template 是一个 pod 模板。它具有与 a 完全相同的架构 pod,除了它是嵌套的并且没有 apiVersion 或种类。

    查看V1JobSpec 的Python Kubernetes 客户端实现,可以验证spec 属性被标记为non-optional,与其他属性相反。

    因此,通过预先构造 template 并在构造 JobSpec 时注入它确实可以解决问题:

    job.spec.template = client.V1PodTemplate()
    job.spec.template.spec = client.V1PodTemplateSpec()
    job.spec.template.spec.restart_policy = "Never"
    job.spec.template.spec.containers = [
        make_container()
    ]
    
    job.spec = client.V1JobSpec()
    

    按照这种推理,在更高范围内不适用于 JobSpec 属性似乎很奇怪,因为它是 Job 对象定义的强制性部分。

    但是再次查看客户端的documentation,可以观察到Spec 属性被标记为可选,这解释了为什么我们能够创建Job 实例,而无需注入Spec

    【讨论】:

    • 感谢您澄清这一点,因为我现在真正明白我做错了什么!
    猜你喜欢
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多