跳到主要内容

HAMi Enterprise 2.8.0-rc0

Chart 版本Chart 声明的 appVersion发布日期
2.8.0-rc02.8.0-rc02026 年 3 月 9 日

本版本为预发布版本。本页以 HAMi Enterprise v2.7.1-rc0 为升级基线,并以开源 HAMi v2.8.0 说明企业版扩展。

软件变更​

本次升级变化与开源同步​

本次同步了以下开源改动,并保留企业版的设备分配、运行时显存调整和授权管理能力。

改动对使用和集成的影响对应开源 PR
调度器主备协同HAMi 调度扩展跟随同一 Pod 中的 kube-scheduler 主实例,仅主实例注册节点设备并通过就绪探针;接任主实例后先同步设备状态,再处理调度过滤请求。多副本部署的配置和就绪判断见下文。HAMi #1553
Webhook 证书热更新监听挂载的 TLS 证书和私钥变化,加载更新后的证书,减少证书轮换对重启调度器的依赖。文件传播和加载期间仍可能发生 Webhook 调用失败。HAMi #1573
NVIDIA 多容器配额修复检查同一 Pod 的后续 GPU 容器时,累计此前容器的显存和算力申请。例如,命名空间剩余显存配额为 2000 MiB 时,两个各申请 1024 MiB 的容器不能再分别通过配额检查。HAMi #1579
删除节点后的指标清理节点删除时清理对应的设备与用量记录,调度器不再持续输出该节点的旧指标。监控系统保留的历史样本不受此清理影响。HAMi #1597
构建信息指标与版本输出调度器和 vGPU 监控新增 hami_build_info,值恒为 1,通过 version、revision、build_date、go_version、compiler、platform 标签展示构建信息。版本命令输出也改为多字段信息。HAMi #1581
昆仑芯 vXPU 显存检查即使设备尚未分配给其他任务,也会检查申请显存是否超过设备可用容量,避免过大的申请通过初次分配检查。HAMi #1569
可选 DRA 监控配套 HAMi-DRA 子 Chart 更新至 0.1.0,包含监控组件。常规设备插件部署仍为默认路径。HAMi #1580
模拟设备插件更新可选模拟设备插件的默认镜像版本从 0.1.0 更新为 1.0.1,影响启用了该插件的验证环境。HAMi #1570

企业版 NVIDIA 分配标注还增加了空分配列表和容器索引越界检查,避免在这些情况下访问不存在的设备或容器。

相对开源 HAMi v2.8.0 的企业版扩展​

以下能力适用于常规 NVIDIA 设备插件路径,在企业版 v2.7.1-rc0 中已存在,本次继续提供。

  • 通过 Downward API 传递设备分配结果:将 GPU UUID、显存和算力限制从 Pod 标注传入对应容器,NVIDIA 分配路径可避免依赖节点锁查找待分配 Pod。默认设备配置中的 nvidia.useDownward 为 true;这不是本次新增的安装参数。
  • 运行中的显存额度调整:监控组件可将运行时报告的显存调整请求提交给调度器;调度器检查设备剩余容量,更新分配记录和配额用量,监控组件再将批准后的显存额度同步到运行时。该能力依赖配套企业版运行时及监控组件,不等同于修改 Pod 的 resources.limits。
  • 设备授权管理:将设备授权状态纳入 NVIDIA 调度判断,并通过 vGPULicenseRemains 提供授权剩余秒数,便于配置到期告警。安装和续期使用约定交付的授权资料。
  • 容器显存明细指标:通过 hami_container_device_memory_context_bytes、hami_container_device_memory_data_bytes、hami_container_device_memory_module_bytes 和 hami_container_device_memory_offset_bytes 分别提供上下文、数据、模块和偏移占用,单位为字节。这些指标为当前值,应按 Gauge 使用。

Chart 变更​

  • 主 Chart 与 appVersion 均为 2.8.0-rc0,默认应用镜像标签更新为 v2.8.0-rc0。显式覆盖镜像标签的部署需同步核对各组件版本。
  • scheduler.leaderElect 继续默认为 true,scheduler.replicas 继续默认为 1。本次将选主状态接入 HAMi 调度扩展,增加 /readyz 就绪探针、Lease 的 list / watch 权限,以及按 kubernetes.io/hostname 分散调度器 Pod 的必需反亲和规则。关闭选主时,Chart 固定部署一个调度器副本。
  • dra.enabled 继续默认为 false。可选 hami-dra 子 Chart 从 0.0.1 更新到 0.1.0,新增 hami-dra.monitor.enabled: true。该监控开关仅在启用 DRA 路径时生效;启用 DRA 会切换部署路径,不再部署主 Chart 的常规调度器和 NVIDIA 设备插件。
  • mockDevicePlugin.enabled 继续默认为 false;启用时采用 mockDevicePlugin.image.tag: "1.0.1"。

升级说明​

检查调度器副本与就绪判断​

默认的单副本部署不会因升级自动变成多副本。需要主备部署时,可使用以下 values,并确保至少有两个符合节点选择条件的节点:

scheduler:
leaderElect: true
replicas: 2

开启选主后,调度器 Pod 必须分散到不同节点。单节点部署或滚动更新时可用节点不足,可能使新副本保持 Pending;升级前应为新副本预留可调度节点,或按实际部署需求调整选主配置。反亲和规则按同命名空间的 hami-scheduler 组件标签匹配,也应检查其他安装实例的节点占用。

备实例的 /readyz 返回 503,只有主实例返回 200 并进入 Service 的就绪端点。部署自动化和告警应结合 Lease 持有者与主实例端点判断可用性,不能要求所有主备副本同时就绪。沿用自定义 RBAC 的部署还需为调度器补齐 Lease 的 list 和 watch 权限。

如果关闭内置 kube-scheduler、接入独立部署的调度器,不能直接沿用上述选主配置:扩展器通过自身主机名匹配 Lease 持有者,独立调度器通常不满足这一条件,会使扩展器持续不就绪,无法推进设备注册。采用单扩展器部署时,使用以下配置,并保留外部调度器的接入配置:

scheduler:
kubeScheduler:
enabled: false
leaderElect: false
livenessProbe: false

此组合按该版本 Chart 的模板要求同时关闭内置存活探针,并固定为一个扩展器副本。它关闭的是扩展器对内置调度器选主状态的跟随,不影响外部调度器自身的选主。

检查证书轮换与配额​

证书热更新依赖挂载的证书文件更新完成。scheduler.admissionWebhook.failurePolicy 默认仍为 Ignore,Webhook 调用失败时可能放行未完成 HAMi 注入的 Pod。如果部署要求调用失败时阻止创建,可配置为 Fail,并接受 Webhook 不可用期间相关 Pod 创建受阻的行为。

依赖旧版多容器配额计算的工作负载,升级后可能因总申请超过命名空间配额而无法调度。升级前应按同一 Pod 内所有 GPU 容器的合计显存和算力申请检查 ResourceQuota。

保留企业版设备配置与监控口径​

默认设备配置中的 nvidia.useDownward 和 nvidia.postNvidiaSmi 均为 true。后者会为申请 NVIDIA 设备的容器设置执行 nvidia-smi 的 postStart 钩子;容器镜像需能执行该命令,已有 postStart 也需核对是否被替换。需要调整这两个字段时,应修改该版本使用的设备配置,不应把它们写成不存在的顶层 Helm 参数。

如果在 Chart 中提供 files/device-config.yaml,该文件会完整替换默认设备配置,不会逐项合并。自定义配置需保留实际使用的企业版字段;调整配置后,按更新后的配置部署调度器和设备插件,并为依赖注入变化的工作负载重新创建 Pod。

采集端可通过 hami_build_info 检查组件构建信息。调用 scheduler version 或 vGPUmonitor version 的脚本应按新的多字段输出解析;此前已有的企业版显存明细和授权指标继续使用。

安装包、配套企业版运行时与授权资料通过约定的交付渠道获取。查看 Chart 与 appVersion 对应关系或软件中心。

Values 说明​

以下参数说明取自 Chart 2.8.0-rc0 发布包随附的 README,保留原文。默认配置以该版本的 values.yaml 为准。

展开参数表

Global Configuration

ParameterDescriptionDefault Value
global.imageRegistryGlobal Docker image registry""
global.imagePullSecretsGlobal Docker image pull secrets[]
global.imageTagImage tag"v2.8.0"
global.gpuHookPathGPU Hook path/usr/local
global.labelsGlobal labels{}
global.annotationsGlobal annotations{}
global.managedNodeSelectorEnableWhether to enable managed node selectorfalse
global.managedNodeSelector.usageManaged node selector usage"gpu"
nameOverrideName override""
fullnameOverrideFull name override""
namespaceOverrideNamespace override""

Resource Name Configuration

NVIDIA GPU Resources

ParameterDescriptionDefault Value
resourceNameGPU resource name"nvidia.com/gpu"
resourceMemGPU memory resource name"nvidia.com/gpumem"
resourceMemPercentageGPU memory percentage resource name"nvidia.com/gpumem-percentage"
resourceCoresGPU core resource name"nvidia.com/gpucores"
resourcePriorityGPU priority resource name"nvidia.com/priority"

Cambricon MLU Resources

ParameterDescriptionDefault Value
mluResourceNameMLU resource name"cambricon.com/vmlu"
mluResourceMemMLU memory resource name"cambricon.com/mlu.smlu.vmemory"
mluResourceCoresMLU core resource name"cambricon.com/mlu.smlu.vcore"

Hygon DCU Resources

ParameterDescriptionDefault Value
dcuResourceNameDCU resource name"hygon.com/dcunum"
dcuResourceMemDCU memory resource name"hygon.com/dcumem"
dcuResourceCoresDCU core resource name"hygon.com/dcucores"

Metax GPU Resources

ParameterDescriptionDefault Value
metaxResourceNameGPU resource name"metax-tech.com/sgpu"
metaxResourceCoreGPU core resource name"metax-tech.com/vcore"
metaxResourceMemGPU memory resource name"metax-tech.com/vmemory"
metaxsGPUTopologyAwareGPU topology awareness"false"

Enflame GCU Resources

ParameterDescriptionDefault Value
enflameResourceNameVGCUvGCU resource name"enflame.com/vgcu"
enflameResourceNameVGCUPercentagevGCU percentage resource name"enflame.com/vgcu-percentage"

Kunlunxin XPU Resources

ParameterDescriptionDefault Value
kunlunResourceNameXPU resource name"kunlunxin.com/xpu"

Scheduler Configuration

ParameterDescriptionDefault Value
schedulerNameScheduler name"hami-scheduler"
scheduler.nodeNameDefine node name, scheduler will schedule to this node""
scheduler.overwriteEnvWhether to overwrite environment variables"false"
scheduler.defaultSchedulerPolicy.nodeSchedulerPolicyNode scheduler policybinpack
scheduler.defaultSchedulerPolicy.gpuSchedulerPolicyGPU scheduler policyspread
scheduler.metricsBindAddressMetrics bind address":9395"
scheduler.forceOverwriteDefaultSchedulerWhether to force overwrite default schedulertrue
scheduler.livenessProbeWhether to enable liveness probefalse
scheduler.leaderElectWhether to enable leader electiontrue
scheduler.replicasNumber of replicas1

Kube Scheduler Configuration

ParameterDescriptionDefault Value
scheduler.kubeScheduler.enabledWhether to run kube-scheduler container in scheduler podtrue
scheduler.kubeScheduler.image.registryKube scheduler image registry"registry.cn-hangzhou.aliyuncs.com"
scheduler.kubeScheduler.image.repositoryKube scheduler image repository"google_containers/kube-scheduler"
scheduler.kubeScheduler.image.tagKube scheduler image tag""
scheduler.kubeScheduler.image.pullPolicyKube scheduler image pull policyIfNotPresent
scheduler.kubeScheduler.image.pullSecretsKube scheduler image pull secrets[]
scheduler.kubeScheduler.extraNewArgsExtra new arguments["--config=/config/config.yaml", "-v=4"]
scheduler.kubeScheduler.extraArgsExtra arguments["--policy-config-file=/config/config.json", "-v=4"]

Extender Configuration

ParameterDescriptionDefault Value
scheduler.extender.image.registryScheduler extender image registry"docker.io"
scheduler.extender.image.repositoryScheduler extender image repository"projecthami/hami"
scheduler.extender.image.tagScheduler extender image tag""
scheduler.extender.image.pullPolicyScheduler extender image pull policyIfNotPresent
scheduler.extender.image.pullSecretsScheduler extender image pull secrets[]
scheduler.extender.extraArgsScheduler extender extra arguments["--debug", "-v=4"]

Admission Webhook Configuration

ParameterDescriptionDefault Value
scheduler.admissionWebhook.enabledWhether to enable admission webhooktrue
scheduler.admissionWebhook.customURL.enabledWhether to enable custom URLfalse
scheduler.admissionWebhook.customURL.hostCustom URL host127.0.0.1
scheduler.admissionWebhook.customURL.portCustom URL port31998
scheduler.admissionWebhook.customURL.pathCustom URL path/webhook
scheduler.admissionWebhook.reinvocationPolicyReinvocation policyNever
scheduler.admissionWebhook.failurePolicyFailure policyIgnore

TLS Certificate Configuration

ParameterDescriptionDefault Value
scheduler.certManager.enabledWhether to use cert-manager to generate self-signed certificatesfalse
scheduler.patch.enabledWhether to use kube-webhook-certgen to generate self-signed certificatestrue
scheduler.patch.image.registryCertgen image registry"docker.io"
scheduler.patch.image.repositoryCertgen image repository"jettech/kube-webhook-certgen"
scheduler.patch.image.tagCertgen image tag"v1.5.2"
scheduler.patch.image.pullPolicyCertgen image pull policyIfNotPresent
scheduler.patch.imageNew.registryNew certgen image registry"docker.io"
scheduler.patch.imageNew.repositoryNew certgen image repository"liangjw/kube-webhook-certgen"
scheduler.patch.imageNew.tagNew certgen image tag"v1.1.1"

Scheduler Service Configuration

ParameterDescriptionDefault Value
scheduler.service.typeService typeNodePort
scheduler.service.httpPortHTTP port443
scheduler.service.schedulerPortScheduler NodePort31998
scheduler.service.monitorPortMonitor port31993
scheduler.service.monitorTargetPortMonitor target port9395

Device Plugin Configuration

ParameterDescriptionDefault Value
devicePlugin.image.registryDevice plugin image registry"docker.io"
devicePlugin.image.repositoryDevice plugin image repository"projecthami/hami"
devicePlugin.image.tagDevice plugin image tag""
devicePlugin.image.pullPolicyDevice plugin image pull policyIfNotPresent
devicePlugin.image.pullSecretsDevice plugin image pull secrets[]

Monitor Configuration

ParameterDescriptionDefault Value
devicePlugin.monitor.image.registryMonitor image registry"docker.io"
devicePlugin.monitor.image.repositoryMonitor image repository"projecthami/hami"
devicePlugin.monitor.image.tagMonitor image tag""
devicePlugin.monitor.image.pullPolicyMonitor image pull policyIfNotPresent
devicePlugin.monitor.image.pullSecretsMonitor image pull secrets[]
devicePlugin.monitor.ctrPathContainer path/usr/local/vgpu/containers
devicePlugin.monitor.extraArgsMonitor extra arguments["-v=4"]
devicePlugin.monitor.extraEnvsMonitor extra environments{}

Device Plugin Other Configuration

ParameterDescriptionDefault Value
devicePlugin.deviceSplitCountInteger type, default value: 10. Maximum number of tasks assigned to a single GPU device10
devicePlugin.deviceMemoryScalingDevice memory scaling ratio1
devicePlugin.deviceCoreScalingDevice core scaling ratio1
devicePlugin.runtimeClassNameRuntime class name""
devicePlugin.createRuntimeClassWhether to create runtime classfalse
devicePlugin.migStrategyString type, "none" means ignore MIG functionality, "mixed" means allocate MIG devices through independent resources"none"
devicePlugin.disablecorelimitString type, "true" means disable core limit, "false" means enable core limit"false"
devicePlugin.passDeviceSpecsEnabledWhether to enable passing device specsfalse
devicePlugin.extraArgsDevice plugin extra arguments["-v=4"]
devicePlugin.nodeConfiguration.configNode configuration for device plugin by jsonAn example of default configuration.
devicePlugin.nodeConfiguration.externalConfigNameNode configuration for device plugin by external congimap""
devicePlugin.extraEnvsDevice plugin extra environments{}

Device Plugin Service Configuration

ParameterDescriptionDefault Value
devicePlugin.service.typeService typeNodePort
devicePlugin.service.httpPortHTTP port31992

Device Plugin Deployment Configuration

ParameterDescriptionDefault Value
devicePlugin.pluginPathPlugin path/var/lib/kubelet/device-plugins
devicePlugin.libPathLibrary path/usr/local/vgpu
devicePlugin.nvidiaNodeSelectorNVIDIA node selector{"gpu": "on"}
devicePlugin.updateStrategy.typeUpdate strategy typeRollingUpdate
devicePlugin.updateStrategy.rollingUpdate.maxUnavailableMaximum unavailable count1

Device Configuration

AWS Neuron

ParameterDescriptionDefault Value
devices.awsneuron.customresourcesCustom resources["aws.amazon.com/neuron", "aws.amazon.com/neuroncore"]

Kunlunxin

ParameterDescriptionDefault Value
devices.kunlun.enabledWhether to enabletrue
devices.kunlun.customresourcesCustom resources["kunlunxin.com/xpu"]

Mthreads

ParameterDescriptionDefault Value
devices.mthreads.enabledWhether to enabletrue
devices.mthreads.customresourcesCustom resources["mthreads.com/vgpu"]

NVIDIA

ParameterDescriptionDefault Value
devices.nvidia.gpuCorePolicyGPU core policydefault
devices.nvidia.libCudaLogLevelCUDA library log level1

Huawei Ascend

ParameterDescriptionDefault Value
devices.ascend.enabledWhether to enablefalse
devices.ascend.imageImage""
devices.ascend.imagePullPolicyImage pull policyIfNotPresent
devices.ascend.extraArgsExtra arguments[]
devices.ascend.nodeSelectorNode selector{"ascend": "on"}
devices.ascend.tolerationsTolerations[]
devices.ascend.customresourcesCustom resources["huawei.com/Ascend910A", "huawei.com/Ascend910A-memory", ...]

Iluvatar

ParameterDescriptionDefault Value
devices.iluvatar.enabledWhether to enablefalse
devices.iluvatar.customresourcesCustom resources["iluvatar.ai/BI-V150-vgpu", "iluvatar.ai/BI-V150.vMem","iluvatar.ai/BI-V150.vCore", ...]