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

soa*_*gem 8 kubernetes kubectl

特别是,我想设置环境变量。我有一个CronJob按计划运行的定义,但我经常想在指定略有不同的环境变量时手动调用它。

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

kubectl create job --from=cronjob/my-cron-job my-manual-run
Run Code Online (Sandbox Code Playgroud)

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

小智 8

我根据 @Rico 的答案,首先在 kubectl 中将作业创建为 a --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 -
Run Code Online (Sandbox Code Playgroud)


Ric*_*ico 2

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"
                    }
                ]
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后运行这样的事情:

$ 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 -
Run Code Online (Sandbox Code Playgroud)