简介:本文深度解析HAMi vGPU解决方案中hami-scheduler的工作原理,从Webhook触发到高级调度策略实现的全流程,帮助开发者掌握vGPU资源调度机制,理解如何通过扩展调度器实现GPU资源的高效分配与管理。
本教程将系统解析HAMi vGPU解决方案中hami-scheduler的核心工作流程,重点说明:
当用户提交包含vGPU资源请求的Pod时,kube-apiserver会触发MutatingWebhook流程:
# MutatingWebhookConfiguration配置示例apiVersion: admissionregistration.k8s.io/v1kind: MutatingWebhookConfigurationmetadata:name: hami-webhookwebhooks:- name: hami.scheduler.mutating.webhookrules:- operations: ["CREATE"]resources: ["pods"]clientConfig:url: https://hami-webhook-service:443/mutate
处理逻辑:
resources.limits是否包含hami.io/vgpu资源securityContext.privileged=true)跳过处理nodeName的Pod直接拒绝(防止强制绑定破坏调度逻辑)spec.schedulerName字段为hami-schedulerhami-scheduler采用”主调度器+扩展插件”的混合架构:
hami-scheduler Pod内部结构:└── kube-scheduler (主调度器)└── extender-scheduler (扩展容器)└── 提供Webhook API└── 提供Scheduler Extender API
关键配置:
# KubeSchedulerConfiguration扩展配置apiVersion: kubescheduler.config.k8s.io/v1beta2kind: KubeSchedulerConfigurationextenders:- urlPrefix: "http://127.0.0.1:8888/scheduler"filterVerb: "filter"prioritizeVerb: "prioritize"weight: 1enableHTTPSSecure: false
阶段一:原生调度流程
/scheduler/prioritize接口阶段二:扩展调度流程
// Extender Scheduler伪代码实现func (e *Extender) Prioritize(pod *v1.Pod, nodes []*v1.Node) ([]SchedulerExtenderNodeScore, error) {// 1. 从Node Annotations解析GPU资源总量// 2. 从已运行Pod的Annotations解析GPU使用量// 3. 计算剩余可用资源// 4. 应用调度策略打分scores := make([]SchedulerExtenderNodeScore, 0, len(nodes))for _, node := range nodes {available := e.calculateAvailableResources(node)score := e.applySchedulingPolicy(pod, node, available)scores = append(scores, SchedulerExtenderNodeScore{Node: node.Name,Score: int64(score),})}return scores, nil}
异步资源上报流程:
Device Plugin定时上报:
hami.io/gpu-total Annotation调度器后台任务:
// 资源同步协程示例func (e *Extender) startResourceSync() {ticker := time.NewTicker(10 * time.Second)for {select {case <-ticker.C:nodes, err := e.k8sClient.CoreV1().Nodes().List(metav1.ListOptions{})for _, node := range nodes.Items {e.updateNodeResourceCache(node)}}}}
内存数据模型:
type NodeResource struct {Total map[string]int64 // 资源类型->总量Allocated map[string]int64 // 已分配量Available map[string]int64 // 剩余量LastUpdate time.Time // 最后更新时间}
实现原理:
score = 100 - (podCount * 10)适用场景:
实现原理:
score = (available / total) * 100适用场景:
Webhook验证:
kubectl get pod <vgpu-pod> -o yaml | grep schedulerName# 应输出:schedulerName: hami-scheduler
调度日志检查:
kubectl logs <hami-scheduler-pod> extender-scheduler | grep "Prioritize called"# 应看到调度请求处理日志
资源状态验证:
kubectl describe node <node-name> | grep hami.io/gpu# 应显示正确的GPU资源总量和分配情况
问题1:vGPU Pod卡在Pending状态
kubectl get mutatingwebhookconfigurations
问题2:调度器扩展未生效
kubectl logs <hami-scheduler-pod> extender-scheduler
问题3:资源数据不更新
kubectl get node <node-name> -o yaml | grep hami.io/gpu
性能优化:
高可用设计:
监控增强:
策略扩展:
本教程深入解析了HAMi vGPU解决方案中hami-scheduler的核心工作流程,从Webhook准入控制到扩展调度器的实现机制,详细说明了资源评估模型和高级调度策略的运作原理。通过掌握这些核心机制,开发者可以:
后续可进一步探索的方向包括:多维度调度策略组合、动态资源配额管理、以及与监控系统的集成实现自动扩缩容等高级功能。