尝试创建Kubernetes作业时出错

时间:2018-11-02 14:08:29

标签: python kubernetes yaml

我已经定义了此方法,它应该为我创建一个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)

1 个答案:

答案 0 :(得分:2)

正如您已经知道的那样,在不注入Job.Spec的情况下构造template是不可能的,V1JobSpec是在工作documentation中固定下来的。

  

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

     

.spec.template是pod模板。它的架构与   pod,但它是嵌套的并且没有apiVersion或kind。

看看Python的spec的Kubernetes Client实现,可以验证template属性是否标记为non-optional,与其他属性相反。

因此,通过预先构造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() 时注入它确实可以解决问题:

Spec

按照这种推理,似乎很奇怪,在更高范围内,Job的{​​{1}}属性也没有适用,因为这是Job对象定义的强制性部分

但是再次查看客户端的documentation,可能会发现Spec属性被标记为可选,这解释了为什么我们能够创建{{1 }}实例,而不必注入Job