如何在kubernetes API(或kubectl)中过滤给定CronJob拥有的作业?

如何在kubernetes API(或kubectl)中过滤给定CronJob拥有的作业?,kubernetes,kubernetes-cronjob,Kubernetes,Kubernetes Cronjob,我有几个cronjob,我希望能够查询特定作业的已完成作业列表。我尝试了--字段选择器metadata.ownerReferences.uid,但这不是batchv1.job支持的字段选择器(查看它,似乎没有适用于此用例的有用字段选择器) 我不完全理解DownwardAPI,但我想知道是否可以在作业规范(在cronjob定义中)上设置一个引用cronjobs uid的标签,这样我就可以使用标签选择器进行筛选。我不知道这是否可能 按所有者筛选作业似乎是一件合理的事情,但在四处搜索时,我似乎找不到任

我有几个cronjob,我希望能够查询特定作业的已完成作业列表。我尝试了
--字段选择器metadata.ownerReferences.uid
,但这不是batchv1.job支持的字段选择器(查看它,似乎没有适用于此用例的有用字段选择器)

我不完全理解DownwardAPI,但我想知道是否可以在作业规范(在cronjob定义中)上设置一个引用cronjobs uid的标签,这样我就可以使用标签选择器进行筛选。我不知道这是否可能


按所有者筛选作业似乎是一件合理的事情,但在四处搜索时,我似乎找不到任何有用的信息。

您可以使用这两个命令获取属于某个作业的作业列表:

uid=$(kubectl get cronjob [MY-CRONJOB-NAME] --output jsonpath='{.metadata.uid}')
kubectl get jobs -o json | jq -r --arg uid "$uid" '.items | map(select(.metadata.ownerReferences[]? | .uid==$uid) | .metadata.name) | .[]'
第一个命令从指定的
[MY-CRONJOB-NAME]
获取
元数据.uid
。然后,一个
kubectl获取
所有作业,并对输出进行处理,以通过
.metadata.ownerReferences.uid
对其进行过滤


如果您想要更简单的方法,可以使用
--customcolumns
标志。以下示例列出了所有作业及其各自的控制器名称:

kubectl get jobs --all-namespaces -o custom-columns=NAME:.metadata.name,CONTROLLER:.metadata.ownerReferences[].name,NAMESPACE:.metadata.namespace

所有cronjob都有唯一的名称,因此显示属于某个cronjob的所有作业的最简单方法是使用
kubectl get jobs | grep cronjob name
。个人工作名称始终以cronjob名称开头。谢谢您的回答。我们使用generateName来创建作业名称,例如,它可能是
每日备份-
,kubernetes将生成一个名称
每日备份-12345
。但是,如果我有另一个CronJob,generateName为
daily-backup-12345-
,那么前缀可能会重叠。至少对于我的用例来说,这不太可能,但我更希望有一个真正的关系来匹配,比如我提到的:metadata.ownerReferences.uid。谢谢您的回复。我的问题应该更清楚一些。我希望在服务器端进行过滤。我们可能会有大量的cronjob,每一个都会保留一些已完成的job,所以过滤客户端不会非常有效。为了添加更多的细节,我使用了
generateName
特性,因此不必手动命名我们创建的每个cronjob。我想另一个想法是让我们的应用程序生成作业的名称,然后将其作为标签扔到JobSpec中,这样我们就可以利用标签选择器来检索作业。另一个注意事项是,作业元数据的
ownerReferences
部分显然用于垃圾收集。我认为这意味着一些内部kubernetes片段能够基于这些字段查找作业。我只是想知道kubernetes API是否提供了任何功能。我可以打开KubNETES中的一个特性请求来解释我的用例。@ JoeCeresini,请考虑编辑你的初始问题或者张贴一个新的问题。显然,没有一个解决方案来解决我希望做的事情,所以我打开了一个库伯内特的特征请求: