如何 运行 在 运行 时间修改值的 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.annotations
和 items.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 文件作为表示状态的方式:
kubectl get
资源并将其输出为 YAML|JSON (--output=json|yaml
) 将结果保存到文件(可能是 source-controlled)
- 使用许多工具中的任何一种来改变文件,但最好使用 YAML|JSON 处理工具(例如
yq
or jq
)
kubectl create
或 kubectl 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。
所以我有一个 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.annotations
和 items.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 文件作为表示状态的方式:
kubectl get
资源并将其输出为 YAML|JSON (--output=json|yaml
) 将结果保存到文件(可能是 source-controlled)- 使用许多工具中的任何一种来改变文件,但最好使用 YAML|JSON 处理工具(例如
yq
orjq
) kubectl create
或kubectl 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
throughjq
and intokubectl 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。