ᕕ( ᐛ )ᕗ Jimyag's Blog

k8s 控制同时运行的 Job 数量

k8s 的 job 是用来执行一次性任务的,每个 job 会创建一个或者多个 pod 来执行任务,任务执行完成后,pod 会被删除。

我们有时候需要控制同时运行的 job 数量,虽然 job 被提交了,执行任务的 pod 不会被创建,如果我们限制某个 ns 的 pod 数量,那么这个 ns 所有的 pod 都会被限制。

这里就需要使用 k8s 的 resource quota 和 priority-class 来控制。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: backup-database
value: 1000
globalDefault: false
description: "Priority class for backup database jobs"
apiVersion: v1
kind: ResourceQuota
metadata:
  name: backup-database
  namespace: test
spec:
  hard:
    pods: "1"  # 限制该优先级类的 Pod 数量
  scopeSelector:
    matchExpressions:
      - scopeName: PriorityClass
        operator: In
        values:
          - backup-database
apiVersion: batch/v1
kind: Job
metadata:
  name: backup-student
  namespace: test
spec:
  template:
    spec:
      priorityClassName: backup-database
      containers:
      - name: busybox
        image: busybox
        command: ["sh", "-c", "sleep 60"] # 备份 student 表
      restartPolicy: Never
apiVersion: batch/v1
kind: Job
metadata:
  name: backup-teacher
  namespace: test
spec:
  template:
    spec:
      priorityClassName: backup-database
      containers:
             - name: busybox
         image: busybox
         command: ["sh", "-c", "sleep 60"] # 备份 teacher 表
       restartPolicy: Never

PriorityClass 是 Kubernetes 中用于定义 Pod 优先级的资源。每个 PriorityClass 都有一个整数值,数值越大优先级越高。

ResourceQuota 用于限制命名空间中的资源使用量,包括 CPU、内存、Pod 数量等。

原理

  1. 创建优先级类:定义一个专门的优先级类(如 backup-database
  2. 设置资源配额:通过 ResourceQuota 限制该优先级类的 Pod 数量
  3. Job 使用优先级:在 Job 的 Pod 模板中指定 priorityClassName
  4. 调度控制:当正在运行的 pod 达到配额限制时,新的 Pod 会处于 Pending 状态,但是创建 Job 不会失败,让 k8s 去处理 job 的排队问题

#K8s