删除kubernetes(gke)中失败的作业

6tdlim6h  于 2023-02-21  发布在  Kubernetes
关注(0)|答案(3)|浏览(201)

如何使用gke中的cron作业删除kubernetes集群中失败的作业?.当我尝试使用以下YAML删除失败的作业时,它已经删除了所有作业(包括正在运行的)

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: XXX
namespace: XXX
spec:
schedule: "*/30 * * * *"
failedJobsHistoryLimit: 1
successfulJobsHistoryLimit: 1
jobTemplate:
 spec:
   template:
     spec:
       serviceAccountName: XXX
       containers:
       - name: kubectl-runner
         image: bitnami/kubectl:latest
         command: ["sh", "-c", "kubectl delete jobs $(kubectl get jobs | awk '$2 ~ 1/1' | awk '{print $1}')"]
       restartPolicy: OnFailure
ddrv8njm

ddrv8njm1#

要删除GKE中失败的**Jobs**,您需要使用以下命令:

  • $ kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.failed==1)].metadata.name}')

此命令将为所有作业输出JSON,并搜索status.failed字段设置为1的作业。然后,它会将失败的作业传递给$ kubectl delete jobs

如果没有状态为的作业,则在CronJob中运行的此命令将失败:failed .

作为一种解决方法,您可以用途:

command: ["sh", "-c", "kubectl delete job --ignore-not-found=true $(kubectl get job -o=jsonpath='{.items[?(@.status.failed==1)].metadata.name}'); exit 0"]

添加exit 0是为了确保Pod离开时的状态代码为0
至于在问题下提出的部分意见:
如果支持**“失败”**作业,则需要对其进行修改
我已经尝试了以下方法,但无法删除作业。kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.Failed==1)].metadata.name}')

  • @.status.Failed==1〈--不正确,因为JSONcase sensitive
  • @.status.failed==1〈--正确

如果您要在以下Pod上运行此命令的错误版本(以显示它们失败且未运行完成):

NAME              READY   STATUS      RESTARTS   AGE
job-four-9w5h9    0/1     Error       0          5s
job-one-n9trm     0/1     Completed   0          6s
job-three-nhqb6   0/1     Error       0          5s
job-two-hkz8r     0/1     Error       0          6s

您应该得到以下错误:

error: resource(s) were provided, but no name, label selector, or --all flag specified

当没有作业传递到$ kubectl delete job时,也会显示上述错误。
运行此命令的正确版本应删除所有失败的作业:

job.batch "job-four" deleted
job.batch "job-three" deleted
job.batch "job-two" deleted

我鼓励您查看其他资源:

    • 一个月一次 *
    • 一对一 *
y4ekin9u

y4ekin9u2#

@Dawid Kruk的答案是优秀的,但工作在一个特定的命名空间,而不是所有的命名空间,因为我需要.为了解决这个问题,我已经创建了一个简单的bash脚本,获得所有失败的作业,并删除它们-

# Delete failed jobs
failedJobs=$(kubectl get job -A -o=jsonpath='{range .items[?(@.status.failed>=1)]}{.metadata.name}{"\t"}{.metadata.namespace}{"\n"}{end}')
echo "$failedJobs" | while read each
do
  array=($each)
  jobName=${array[0]}
  namespace=${array[1]}
  echo "Debug: job name: $jobName is deleted on namespace $namespace"
  kubectl delete job  $jobName -n $namespace
done
mkshixfv

mkshixfv3#

这一个看起来更好,因为我:

kubectl delete pod --field-selector=status.phase==Failed

相关问题