如何在Kubernetes中添加自定义可分配资源类型?
创建Kubernetes自定义可分配资源并实现智能调度
一、自定义可分配资源的配置步骤
要创建generic-gpu这类自定义可分配资源,核心是让Kubernetes调度器能识别节点上的该类资源,步骤如下:
1. 节点标签与资源注册
- 先给目标节点打标签,用于后续区分节点类型:
kubectl label nodes <节点名称> node-type=gpu-node kubectl label nodes <节点名称> node-type=software-render-node kubectl label nodes <节点名称> node-type=custom-gpu-node - 通过补丁操作,在节点的
status.allocatable字段中添加自定义资源:
数值可根据节点实际能力调整,比如GPU节点设为kubectl patch node <节点名称> -p '{"status":{"allocatable":{"generic-gpu":"1"}}}'1代表具备该资源能力,软件渲染节点也可设为1表示支持软件渲染替代。
2. 部署节点资源维护控制器
上述补丁是临时操作,节点重启后资源声明会丢失,需要部署一个控制器来持久化维护:
- 控制器核心逻辑:监听节点事件,当节点启动或标签变更时,自动给符合条件的节点注入
generic-gpu资源到allocatable字段中,确保节点状态始终包含该自定义资源。
二、实现智能调度控制器
要把请求generic-gpu的Pod调度到不同类型节点,推荐用调度器扩展而非准入Webhook:
1. 基于调度器扩展(Scheduler Extender)
调度器扩展能深度参与调度决策,完美匹配你的需求:
- 编写调度器扩展服务,接收调度器传来的候选节点列表,根据集群实时状态筛选最优节点:
- 优先调度到空闲的GPU节点
- 当GPU节点资源不足时,自动切换到软件渲染节点或自定义GPU节点
- 在Kubernetes调度器配置中注册该扩展,让调度器在节点筛选阶段调用你的服务。
2. Pod资源声明
用户只需在Pod的资源请求中声明generic-gpu即可,无需关心底层节点类型:
apiVersion: v1 kind: Pod metadata: name: gpu-demo-app spec: containers: - name: demo-container image: 你的应用镜像 resources: requests: generic-gpu: "1" limits: generic-gpu: "1"
三、为什么不推荐仅用准入Webhook?
准入Webhook只能修改Pod的标签或节点选择器,无法让调度器真正感知generic-gpu资源的用量:
- 无法防止资源超配,比如多个Pod请求该资源但节点实际能力不足
- 调度器无法基于资源剩余量做最优决策,只能依赖标签匹配,灵活性差
内容的提问来源于stack exchange,提问作者Velkan
相关产品推荐
相关产品推荐

