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