如何 运行 在 运行 时间修改值的 kubernetes cronjob

how to run a kubernetes cronjob with modified values at runtime

所以我有一个 kubernetes cronjob 对象定期设置为 运行。

NAME                            SCHEDULE       SUSPEND   ACTIVE   LAST SCHEDULE   AGE
ticketing-job-lifetime-manager  45 */4 * * *   False     0        174m            25d

而且我知道如何手动调用它:

# ticketing-job-manual-call will be the name of the job that runs
kubectl create job --from=cronjobs/ticketing-job-lifetime-manager ticketing-job-manual-call

BUT - 我想要做的是调用作业,但在调用之前修改它的部分(如下所示)。具体来说 items.metadata.annotationsitems.spec.jobTemplate.spec.containers.args.

如果可以即时实现,我会欣喜若狂。如果它需要创建一个临时对象,那么我会很欣赏一种健壮、高效且安全的方法。谢谢!

    apiVersion: v1
    items:
      - apiVersion: batch/v1
        kind: CronJob
        metadata:
          annotations:
            <annotation-1>              <- want to modify these
            <annotation-2>
            ..
            <annotation-n>
          creationTimestamp: "2022-05-03T13:24:49Z"
          labels:
            AccountID: foo
            FooServiceAction: "true"
            FooServiceManaged: "true"
            CronName: foo
          name: foo
          namespace: my-namespace
          resourceVersion: "298013999"
          uid: 57b2-4612-88ef-a0d5e26c8
        spec:
          concurrencyPolicy: Replace
          jobTemplate:
            metadata:
              annotations:
                <annotation-1>          <- want to modify these
                <annotation-2>
                ..
                <annotation-n>
              creationTimestamp: null
              labels:
                AccountID: 7761777c38d93b
                TicketServiceAction: "true"
                TicketServiceManaged: "true"
                CronName: ticketing-actions-7761777c38d93b-0
              name: ticketing-actions-7761777c38d93b-0
              namespace: rias
            spec:
              containers:
                - args:
                    - --accountid=something     <- want to modify these
                    - --faultzone=something
                    - --type=something
                    - --cronjobname=something
                    - --plans=something
                  command:
                    - ./ticketing-job
                  env:
                    - name: FOO_BAR             <- may want to modify these
                      value: "false"
                    - name: FOO_BAZ
                      value: "true"

考虑这一点的方式是 Kubernetes 资源(明确地)由 YAML|JSON 配置文件定义。拥有配置文件的一个有用的优点是可以将它们签入源代码管理;如果您为每个资源(每次更改)创建唯一文件,您会自动审核您的工作。

Kubernetes (kubectl) 未优化|旨在调整资源,尽管您可以使用 kubectl patch 更新已部署的资源。

我鼓励您考虑一种适用于任何 Kubernetes 资源(不仅仅是 Job 的资源)的更好方法,并且重点关注使用 YAML|JSON 文件作为表示状态的方式:

  1. kubectl get 资源并将其输出为 YAML|JSON (--output=json|yaml) 将结果保存到文件(可能是 source-controlled)
  2. 使用许多工具中的任何一种来改变文件,但最好使用 YAML|JSON 处理工具(例如 yq or jq
  3. kubectl createkubectl apply 生成的文件反映了新资源的预期配置。

举例来说,假设您使用 jq:

# Output 'ticketing-job-lifetime-manage' as a JSON file
kubectl get job/ticketing-job-lifetime-manage \
--namespace=${NAMESPACE} \
--output=json > ${PWD}/ticketing-job-lifetime-manage.json

# E.g. replace '.metadata.annotations' entirely
jq '.metadata.annotations=[{"foo":"x"},{"bar":"y"}]' \
${PWD}/${PWD}/ticketing-job-lifetime-manage.json \
> ${PWD}/${PWD}/new-job.json

# E.g. replace a specific container 'foo' specific 'args' key with value
jq '.spec.jobTemplate.spec.containers[]|select(.name=="foo").args["--key"]="value" \
${PWD}/${PWD}/new-job.json \
> ${PWD}/${PWD}/new-job.json

# Etc.

# Apply
kubectl create \
--filename=${PWD}/new-job.json \
--namespace=${NAMESPACE}

NOTE You can pipe the output from the kubectl get through jq and into kubectl create if you wish but it's useful to keep a file-based record of the resource.

必须处理 YAML|JSON 配置文件是 Kubernetes(以及使用它们的所有其他技术)的常见问题。还有其他工具,例如jsonnet and CUE 试图提供一种更具编程性的方式来管理 YAML|JSON。