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

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

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

```yaml
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: backup-database
value: 1000
globalDefault: false
description: "Priority class for backup database jobs"

```

```yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: backup-database
  namespace: test
spec:
  hard:
    pods: "1"  # 限制该优先级类的 Pod 数量
  scopeSelector:
    matchExpressions:
      - scopeName: PriorityClass
        operator: In
        values:
          - backup-database
```

```yaml
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
```

```yaml
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 的排队问题

