清理CLI生成的Kubernetes作业



我可能遇到了一点奇怪的情况。我有一系列需要运行的Kubernetes cronjobs。然而,要管理的作业集是一个更大框架的一部分,该框架正在快速扩展,手动管理所有作业是不切实际的。作业采用一个日期参数,并使用该日期进行一些数据处理,日期每天都在变化,可能需要根据回填情况等进行调整。我将其设置为可管理的方法如下:

有一个叫做"cronjob"的master;"转轮";,其运行脚本。脚本循环遍历所有需要运行的作业配置,并使用正确的日期参数运行它们。此脚本创建的子作业将使用kubectl create job --image=... -- <job run command>运行。没有用于子作业的k8s清单,因为它使用docker映像和入口点命令手动运行。

我的问题是,基于这种配置,是否有办法为子作业设置作业TTL?我知道当我有一个k8s清单时,我可以设置一个作业TTL,但既然我在这种情况下没有k8s清单,有其他方法吗?

您可以将干式运行与补丁结合使用。

kubectl create job myjob -o yaml --dry-run=client --save-config --image busybox -- sleep 120 |
kubectl patch --dry-run=client -o yaml --type json --patch '[
{"op": "add", "path": "/spec/ttlSecondsAfterFinished", "value": 100}
]' -f - | kubectl apply -f -

或者,您可以使用jq将TTL添加到规范中

kubectl create job myjob --image busybox --dry-run=client --save-config -o json -- sleep 120 |
jq ' .spec += { "ttlSecondsAfterFinished": 100 }' | kubectl apply -f -

如果你使用这个策略,也许你甚至可以让自己成为一个TTL的基础清单。既然你说你只想更改一些日期参数。

kubectl apply -f job.yaml -o yaml --dry-run=client |
kubectl patch --dry-run=client -o yaml --type json --patch '[
{"op": "add", "path": "/spec/template/spec/containers/0/args", "value": ["'"$(date)"'"] }
]' -f - | kubectl apply -f -

如果您这样做并从env变量中读取日期,那么您也可以使用set。

kubectl apply -f job.yaml -o yaml --dry-run=client |
kubectl set env TARGET_DATE="$(date +%Y-%m-%d)" -o yaml --local --dry-run=client -f - | 
kubectl apply -f - 

最新更新