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 都有一个整数值,数值越大优先级越高。
value
: 优先级数值,范围 0-1000000000globalDefault
: 是否设为全局默认优先级description
: 优先级类的描述信息
ResourceQuota 用于限制命名空间中的资源使用量,包括 CPU、内存、Pod 数量等。
hard
: 硬限制,超过限制的资源无法创建scopeSelector
: 作用域选择器,用于指定配额适用的资源范围scopeName: PriorityClass
: 指定配额只对特定优先级类的 Pod 生效
原理
- 创建优先级类:定义一个专门的优先级类(如
backup-database
) - 设置资源配额:通过 ResourceQuota 限制该优先级类的 Pod 数量
- Job 使用优先级:在 Job 的 Pod 模板中指定
priorityClassName
- 调度控制:当正在运行的 pod 达到配额限制时,新的 Pod 会处于 Pending 状态,但是创建 Job 不会失败,让 k8s 去处理 job 的排队问题