K8s DRA异构GPU调度多模型推理集群
认识K8s DRA与异构GPU调度场景
Kubernetes Dynamic Resource Allocation(DRA)在v1.26后进入Alpha,让你能灵活管理不同型号的GPU(如NVIDIA A100、V100、T4)。
在多模型推理集群中,每个模型可能对算力和显存要求不同,DRA可以通过ResourceClass和ResourceClaim给Pod分配合适的GPU,避免资源浪费。
集群前置条件与DRA特性开启
- K8s版本:集群至少使用v1.26,并在所有组件(kube-apiserver、kube-scheduler、kubelet)开启DRA特性门控:
# 在相应启动参数或kubelet配置中添加
--feature-gates=DynamicResourceAllocation=true
- GPU驱动与设备插件:确保每个节点上NVIDIA驱动已安装,并部署了适配DRA的GPU设备插件(如nvidia-dra-driver)。
- 节点标签:为不同GPU型号的节点打上标签,方便资源类匹配:
kubectl label node gpu-node-a gpu-type=a100
kubectl label node gpu-node-b gpu-type=v100
定义异构GPU资源类别与ResourceClaim
DRA通过ResourceClass定义资源类别,通过ResourceClaim申请具体资源。
先创建两个ResourceClass,分别对应A100和V100:
apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClass
metadata:
name: gpu-a100
spec:
driverName: nvidia.com
parametersRef:
kind: GPUParameters
apiGroup: resource.nvidia.com/v1alpha1
name: a100-params
---
apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClass
metadata:
name: gpu-v100
spec:
driverName: nvidia.com
parametersRef:
kind: GPUParameters
apiGroup: resource.nvidia.com/v1alpha1
name: v100-params
参数对象需要提前创建,设置显存、算力等约束(此处略)。
然后创建一个ResourceClaim指定需要的资源类:
apiVersion: resource.k8s.io/v1alpha2
kind: ResourceClaim
metadata:
name: my-inference-gpu
spec:
resourceClassName: gpu-a100 # 或手动指定多个,由调度器选择
部署多模型推理服务的调度配置
在Pod模板中引用ResourceClaim,调度器会自动将Pod调度到具备相应GPU类型的节点:
apiVersion: v1
kind: Pod
metadata:
name: bert-inference
spec:
containers:
- name: inference
image: nvcr.io/nvidia/tritonserver:23.10-py3
command: ["tritonserver", "--model-repository=/models"]
resources:
claims:
- name: gpu
resourceClaims:
- name: gpu
resourceClaimName: my-inference-gpu
对于多个模型,可以为每个推理任务创建不同的ResourceClaim,或者用一个Claim申请多张GPU(通过count字段)。
重要:每个Pod的resourceClaims段必须和Claim名称一一对应。
常见踩坑与效果验证
避坑说明:
- 不同GPU型号的驱动版本可能不兼容,确保节点上驱动版本一致或使用容器化驱动。
- ResourceClass的parametersRef必须指向实际存在的参数对象,否则调度会失败。
- 如果Pod一直Pending,检查调度事件:
kubectl describe pod,最常见原因是ResourceClaim未绑定或节点标签不匹配。 - DRA目前还是Alpha,生产环境使用前请评估风险并关注后续版本。
验证方法:
- 查看Pod已分配的GPU信息:
kubectl get pod bert-inference -o yaml | grep -A5 "status:" | grep -i resource
- 进入Pod执行
nvidia-smi确认GPU型号和显存。 - 使用
kubectl get resourceclaim查看绑定状态:
kubectl get resourceclaim my-inference-gpu -o wide
如果你正在搭建K8s DRA异构GPU调度多模型推理集群,建议先按本文步骤在一个测试环境验证,再根据模型依赖调整资源类参数。
遇到调度异常时优先回看避坑和高频问题部分,往往能快速定位。