k8s 控制同时运行的 Job 数量
2025-08-12
· 244 words · ~ 2 min read
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 生效
原理
创建优先级类:定义一个专门的优先级类(如 backup-database)
设置资源配额:通过 ResourceQuota 限制该优先级类的 Pod 数量
Job 使用优先级:在 Job 的 Pod 模板中指定 priorityClassName
调度控制:当正在运行的 pod 达到配额限制时,新的 Pod 会处于 Pending 状态,但是创建 Job 不会失败,让 k8s 去处理 job 的排队问题
#K8s
← Previous
使用 nginx 代理 cockpit
Next →
Cloudflare Pages Hugo 部署:解决静态文件中文乱码与无法预览的问题