如何配置Kubernetes实现单节点仅运行一个GPU周期性作业?
解决Kubernetes GPU节点单Pod调度问题
针对你需要在单GPU节点上串行调度Job的需求,有以下几种可行方案:
方案1:通过GPU资源请求限制实现调度控制
这是最直接的方式,利用Kubernetes对可调度资源的管理能力,让每个Pod独占节点的GPU资源,从而避免同节点多Pod调度。
在Job的Pod模板中添加GPU资源的请求与限制配置:
apiVersion: batch/v1 kind: Job metadata: name: sample-gpu-job spec: template: spec: containers: - name: gpu-workload image: your-target-image:tag resources: requests: nvidia.com/gpu: 1 # 声明需要1个GPU limits: nvidia.com/gpu: 1 # 限制使用1个GPU restartPolicy: OnFailure
- 前提:节点已部署对应GPU的设备插件(如NVIDIA Device Plugin),确保Kubernetes能识别节点上的GPU资源数量。
- 效果:由于每个节点仅拥有1个GPU,调度器只会在节点GPU资源空闲时才会调度新的Pod,待前一个Pod完成释放GPU后,才会安排下一个作业。
方案2:使用Pod反亲和性强制单节点单Pod
如果存在GPU资源未被Kubernetes正确识别的场景,可以通过Pod反亲和性规则,强制同一节点仅运行一个GPU作业Pod。
- 给所有GPU作业的Pod打上统一标签(如
task-type: gpu-job) - 在Pod模板中配置反亲和性规则:
apiVersion: batch/v1 kind: Job metadata: name: sample-gpu-job spec: template: spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: task-type operator: In values: - gpu-job topologyKey: kubernetes.io/hostname containers: - name: gpu-workload image: your-target-image:tag resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
- 原理:
requiredDuringSchedulingIgnoredDuringExecution规则会要求新Pod不能调度到已有task-type: gpu-job标签Pod的节点(通过kubernetes.io/hostname匹配节点),从而保证同一节点同一时间只有一个GPU作业Pod。
方案3:CronJob并发控制(针对周期性调度场景)
如果你的作业是通过CronJob周期性触发的,且希望同一个CronJob的实例不并发执行,可以设置concurrencyPolicy:
apiVersion: batch/v1 kind: CronJob metadata: name: periodic-gpu-job spec: schedule: "*/10 * * * *" # 每10分钟执行一次 concurrencyPolicy: Forbid # 前一个实例未完成时,跳过新的调度 # 若需要替换未完成的实例,可设置为Replace jobTemplate: spec: template: spec: containers: - name: gpu-workload image: your-target-image:tag resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
- 注意:该规则仅作用于同一个CronJob的多个实例,若你有多个不同镜像的CronJob,仍需结合方案1或方案2来控制跨CronJob的Pod调度。
内容的提问来源于stack exchange,提问作者Djangonaut
相关产品推荐
相关产品推荐

