因此,我将一个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但是--我想要做的是调用作业,但是在调用它之前修改它的部分内容(如下所示)。特别是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"发布于 2022-05-04 03:16:21
考虑这一点的方法是,Kubernetes资源是由YAML\JSON配置文件定义的。配置文件的一个有用的优点是可以将这些文件签入源代码管理;如果您为每个资源创建了唯一的文件(对于每个更改),您将自动审核您的工作。
Kubernetes (kubectl)并不是为调整参考资料而设计的,尽管您可以使用kubectl patch更新已部署的资源。
我鼓励您考虑一种更好的方法,该方法适用于任何Kubernetes资源(不仅仅是Job的),重点是使用YAML/JSON文件来表示状态:
kubectl get并输出为YAML\JSON (--output=json|yaml),将结果保存到一个文件(可以是源代码控制的)yq或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}注意,,,您可以通过
jq传输来自kubectl get的输出,如果您愿意,可以将输出输入到kubectl create中,但是保持一个基于文件的资源记录很有用。
对于Kubernetes来说,必须处理YAML\JSON配置文件是一个常见的问题(以及使用它们的所有其他技术)。还有其他一些工具,例如jsonnet和暗号,它们试图提供一种更有编程性的方式来管理YAML\JSON。
https://stackoverflow.com/questions/72102294
复制相似问题