首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时运行带有修改值的kubernetes cron作业

如何在运行时运行带有修改值的kubernetes cron作业
EN

Stack Overflow用户
提问于 2022-05-03 16:06:31
回答 1查看 472关注 0票数 0

因此,我将一个kubernetes cronjob对象设置为定期运行。

代码语言:javascript
复制
NAME                            SCHEDULE       SUSPEND   ACTIVE   LAST SCHEDULE   AGE
ticketing-job-lifetime-manager  45 */4 * * *   False     0        174m            25d

我知道如何手动称呼它:

代码语言:javascript
复制
# 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

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

如果这是可能的话,我会在月球上。如果它需要创建一个临时对象,那么我希望能够找到一种健壮、可执行且安全的方法。谢谢!

代码语言:javascript
复制
    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"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-04 03:16:21

考虑这一点的方法是,Kubernetes资源是由YAML\JSON配置文件定义的。配置文件的一个有用的优点是可以将这些文件签入源代码管理;如果您为每个资源创建了唯一的文件(对于每个更改),您将自动审核您的工作。

Kubernetes (kubectl)并不是为调整参考资料而设计的,尽管您可以使用kubectl patch更新已部署的资源。

我鼓励您考虑一种更好的方法,该方法适用于任何Kubernetes资源(不仅仅是Job的),重点是使用YAML/JSON文件来表示状态:

  1. 将资源kubectl get并输出为YAML\JSON (--output=json|yaml),将结果保存到一个文件(可以是源代码控制的)
  2. 使用多种工具中的任何一种对文件进行变异,但最好使用YAML/JSON处理工具(例如yqjq)
  3. kubectl createkubectl apply:反映新资源的预期配置的文件。

举个例子,假设您使用jq

代码语言:javascript
复制
# 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}

注意,,您可以通过jq传输来自kubectl get的输出,如果您愿意,可以将输出输入到kubectl create中,但是保持一个基于文件的资源记录很有用。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72102294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档