当前位置: 首页 > 知识库问答 >
问题:

如何自动删除由 CronJob 创建的已完成的 Kubernetes 作业?

习宸
2023-03-14

有没有一种方法,自动删除已完成的作业除了使一个Cron作业清理已完成的作业?

K8s 作业文档指出,已完成作业的预期行为是让它们保持已完成状态,直到手动删除。因为我每天通过 CronJobs 运行数千个作业,我不想保留已完成的作业。

共有3个答案

查修谨
2023-03-14

使用字段选择器的另一种方法:

kubectl delete jobs --field-selector status.successful=1 

这可以在cronjob中执行,类似于其他答案。

  1. 创建一个服务号,类似my-sa-name
  2. 为资源作业创建具有列表和删除权限的角色
  3. 在服务号中附加角色(角色绑定)
  4. 创建将使用服务号检查已完成的作业并将其删除的cron作业
# 1. Create a service account

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-sa-name
  namespace: default

---

# 2. Create a role

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: my-completed-jobs-cleaner-role
rules:
- apiGroups: [""]
  resources: ["jobs"]
  verbs: ["list", "delete"]

---

# 3. Attach the role to the service account

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-completed-jobs-cleaner-rolebinding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: my-completed-jobs-cleaner-role
subjects:
- kind: ServiceAccount
  name: my-sa-name
  namespace: default

---

# 4. Create a cronjob (with a crontab schedule) using the service account to check for completed jobs

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: jobs-cleanup
spec:
  schedule: "*/30 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: my-sa-name
          containers:
          - name: kubectl-container
            image: bitnami/kubectl:latest
            # I'm using bitnami kubectl, because the suggested kubectl image didn't had the `field-selector` option
            command: ["sh", "-c", "kubectl delete jobs --field-selector status.successful=1"]
          restartPolicy: Never

王高超
2023-03-14

这在带有< code > ttlssecondsafterfinished 的1.12 Alpha版中是可能的。自动清理已完成作业的示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-ttl
spec:
  ttlSecondsAfterFinished: 100
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
嵇昱
2023-03-14

您现在可以设置历史记录限制,或者完全禁用历史记录,这样失败或成功的CronJobs不会被无限期保留。请看我的答案。文档在这里。

要设置历史限制:

< code > . spec . successfuljobshistorylimit 和< code > . spec . failed jobshistorylimit 字段是可选的。这些字段指定应该保留多少个已完成和失败的作业。默认情况下,它们分别设置为3和1。将限制设置为< code>0相当于在作业完成后不保留任何相应种类的作业。

限制为0的配置如下所示:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  successfulJobsHistoryLimit: 0
  failedJobsHistoryLimit: 0
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
 类似资料:
  • 我无法自动删除由CronJob启动的已完成作业。正如我在此处和此处的QA中以及在官方文档中所阅读的,这可以通过建立作业历史限制< code > . spec . successfuljobshistorylimit 和< code > . spec . failed jobshistorylimit 来完成。我做过,两种情况下都成立为1。但是我的群集保存了不止一个已完成的作业,事实上,它保存的数据

  • 我正在运行一个Kubernetes的工作,并试图在它完成几个小时后查看它的日志。但是,当我执行时,没有列出pod(返回时只是),而当我执行时,该作业的pod不在那里。如何在已完成的作业中配置删除pod的操作,以及如何更改该操作以使pod保持更长的时间以便读取其日志?

  • 我有一个具有以下版本的 Kubernetes 集群: 我有一个cron工作在我的库伯内特斯集群。 库伯内特斯集群识别cron作业的api资源。 我正在尝试为此创建一个手动作业,但是遇到了这个错误。 谁能帮忙?

  • 问题内容: 有谁知道用Knockout JS模板创建自动完成组合框的最佳方法吗? 我有以下模板: 有时候,这个清单很长,我想让Knockout在jQuery自动完成功能或一些直接的JavaScript代码方面表现出色,但收效甚微。 另外,jQuery.Autocomplete需要输入字段。有任何想法吗? 问题答案: 这是我编写的jQuery UI自动完成绑定。它的目的是镜像,,,与几个新增的选择要

  • 我正在尝试使用golang-kubernetes客户端go-lib根据作业的状态筛选完成的作业。 我已经检查了其他答案,解释了如何使用kubectl获取作业,如下所示: 但我不知道如何将jsonpath输出“转化”为过滤器或列表选项 如果我按状态阶段和标签搜索pod,我会这样做: 但是,如果我要实现jsonpath 这将遍历所有作业,并检查状态下的succeeded键是否等于1。适用于所有工作。

  • 我试图用datalist html创建一个自动完成。这是我代码: