ᕕ( ᐛ )ᕗ Jimyag's Blog

k8s 控制同时运行的 Job 数量

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

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

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

1
2
3
4
5
6
7
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: backup-database
value: 1000
globalDefault: false
description: "Priority class for backup database jobs"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
apiVersion: v1
kind: ResourceQuota
metadata:
  name: backup-database
  namespace: test
spec:
  hard:
    pods: "1"  # 限制该优先级类的 Pod 数量
  scopeSelector:
    matchExpressions:
      - scopeName: PriorityClass
        operator: In
        values:
          - backup-database
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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 都有一个整数值,数值越大优先级越高。

  • value: 优先级数值,范围 0-1000000000
  • globalDefault: 是否设为全局默认优先级
  • description: 优先级类的描述信息

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

  • hard: 硬限制,超过限制的资源无法创建
  • scopeSelector: 作用域选择器,用于指定配额适用的资源范围
  • scopeName: PriorityClass: 指定配额只对特定优先级类的 Pod 生效

原理

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

#K8s