如何使用kubectl create在Kubernetes对象上手动设置值?

时间:2019-04-08 15:13:09

标签: kubernetes kubectl

我特别要设置环境变量。我有一个按时间表运行的CronJob定义,但是每隔一段时间我都想在指定略有不同的环境变量的同时手动调用它。

我可以使用以下命令手动调用cron作业:

kubectl create job --from=cronjob/my-cron-job my-manual-run

但是这会复制资源定义中指定的所有相同环境变量。如何使用此create job命令添加其他新的环境变量?

2 个答案:

答案 0 :(得分:1)

最容易做到的IMO是拥有一个基本的JSON文件并对其进行修改。 kubectl get cronjob jobname的输出包含许多您不需要的其他信息。

例如:

{
    "apiVersion": "batch/v1",
    "kind": "Job",
    "metadata": {
        "name": "changeme"
    },
    "spec": {
        "template": {
            "metadata": {
                "labels": {
                    "job-name": "changeme"
                }
            },
            "spec": {
                "restartPolicy": "Never",
                "containers": [
                    {
                        "command": [
                            "perl",
                            "-Mbignum=bpi",
                            "-wle",
                            "print bpi(2000)"
                        ],
                        "image": "perl",
                        "name": "pi"
                    }
                ]
            }
        }
    }
}

然后运行类似这样的内容:

$ cat yourjobtemplate.json \
  | jq '. + {metadata: {name: "mynewjobname"}}' \
  | jq '.spec.template.metadata.labels |= . + {"job-name": "mynewjobname"}' \
  | jq '.spec.template.spec.containers[0] |= . + {"env": [{name: "envname1", value: "envvalue1"}, {name: "envname2", value: "envvalue2"}]}' \
  | kubectl apply -f -

答案 1 :(得分:0)

我以@Rico的答案为基础,首先在Kubectl中将作业创建为--dry-run,然后使用jq修改作业,然后应用。这样就无需拥有基本的JSON文件和管理其他作业元数据字段。

例如:

$ kubectl create job --from=cronjob/my-cron-job my-manual-run --dry-run -o "json" \
  | jq ".spec.template.spec.containers[0].env += [{ \"name\": \"envname1\", value:\"$envvalue1\" }]" \
  | kubectl apply -f -