HAMi Enterprise 2.8.0-rc0
| Chart 版本 | Chart 声明的 appVersion | 发布日期 |
|---|---|---|
2.8.0-rc0 | 2.8.0-rc0 | 2026 年 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
| Parameter | Description | Default Value |
|---|---|---|
global.imageRegistry | Global Docker image registry | "" |
global.imagePullSecrets | Global Docker image pull secrets | [] |
global.imageTag | Image tag | "v2.8.0" |
global.gpuHookPath | GPU Hook path | /usr/local |
global.labels | Global labels | {} |
global.annotations | Global annotations | {} |
global.managedNodeSelectorEnable | Whether to enable managed node selector | false |
global.managedNodeSelector.usage | Managed node selector usage | "gpu" |
nameOverride | Name override | "" |
fullnameOverride | Full name override | "" |
namespaceOverride | Namespace override | "" |
Resource Name Configuration
NVIDIA GPU Resources
| Parameter | Description | Default Value |
|---|---|---|
resourceName | GPU resource name | "nvidia.com/gpu" |
resourceMem | GPU memory resource name | "nvidia.com/gpumem" |
resourceMemPercentage | GPU memory percentage resource name | "nvidia.com/gpumem-percentage" |
resourceCores | GPU core resource name | "nvidia.com/gpucores" |
resourcePriority | GPU priority resource name | "nvidia.com/priority" |
Cambricon MLU Resources
| Parameter | Description | Default Value |
|---|---|---|
mluResourceName | MLU resource name | "cambricon.com/vmlu" |
mluResourceMem | MLU memory resource name | "cambricon.com/mlu.smlu.vmemory" |
mluResourceCores | MLU core resource name | "cambricon.com/mlu.smlu.vcore" |
Hygon DCU Resources
| Parameter | Description | Default Value |
|---|---|---|
dcuResourceName | DCU resource name | "hygon.com/dcunum" |
dcuResourceMem | DCU memory resource name | "hygon.com/dcumem" |
dcuResourceCores | DCU core resource name | "hygon.com/dcucores" |
Metax GPU Resources
| Parameter | Description | Default Value |
|---|---|---|
metaxResourceName | GPU resource name | "metax-tech.com/sgpu" |
metaxResourceCore | GPU core resource name | "metax-tech.com/vcore" |
metaxResourceMem | GPU memory resource name | "metax-tech.com/vmemory" |
metaxsGPUTopologyAware | GPU topology awareness | "false" |
Enflame GCU Resources
| Parameter | Description | Default Value |
|---|---|---|
enflameResourceNameVGCU | vGCU resource name | "enflame.com/vgcu" |
enflameResourceNameVGCUPercentage | vGCU percentage resource name | "enflame.com/vgcu-percentage" |
Kunlunxin XPU Resources
| Parameter | Description | Default Value |
|---|---|---|
kunlunResourceName | XPU resource name | "kunlunxin.com/xpu" |
Scheduler Configuration
| Parameter | Description | Default Value |
|---|---|---|
schedulerName | Scheduler name | "hami-scheduler" |
scheduler.nodeName | Define node name, scheduler will schedule to this node | "" |
scheduler.overwriteEnv | Whether to overwrite environment variables | "false" |
scheduler.defaultSchedulerPolicy.nodeSchedulerPolicy | Node scheduler policy | binpack |
scheduler.defaultSchedulerPolicy.gpuSchedulerPolicy | GPU scheduler policy | spread |
scheduler.metricsBindAddress | Metrics bind address | ":9395" |
scheduler.forceOverwriteDefaultScheduler | Whether to force overwrite default scheduler | true |
scheduler.livenessProbe | Whether to enable liveness probe | false |
scheduler.leaderElect | Whether to enable leader election | true |
scheduler.replicas | Number of replicas | 1 |
Kube Scheduler Configuration
| Parameter | Description | Default Value |
|---|---|---|
scheduler.kubeScheduler.enabled | Whether to run kube-scheduler container in scheduler pod | true |
scheduler.kubeScheduler.image.registry | Kube scheduler image registry | "registry.cn-hangzhou.aliyuncs.com" |
scheduler.kubeScheduler.image.repository | Kube scheduler image repository | "google_containers/kube-scheduler" |
scheduler.kubeScheduler.image.tag | Kube scheduler image tag | "" |
scheduler.kubeScheduler.image.pullPolicy | Kube scheduler image pull policy | IfNotPresent |
scheduler.kubeScheduler.image.pullSecrets | Kube scheduler image pull secrets | [] |
scheduler.kubeScheduler.extraNewArgs | Extra new arguments | ["--config=/config/config.yaml", "-v=4"] |
scheduler.kubeScheduler.extraArgs | Extra arguments | ["--policy-config-file=/config/config.json", "-v=4"] |
Extender Configuration
| Parameter | Description | Default Value |
|---|---|---|
scheduler.extender.image.registry | Scheduler extender image registry | "docker.io" |
scheduler.extender.image.repository | Scheduler extender image repository | "projecthami/hami" |
scheduler.extender.image.tag | Scheduler extender image tag | "" |
scheduler.extender.image.pullPolicy | Scheduler extender image pull policy | IfNotPresent |
scheduler.extender.image.pullSecrets | Scheduler extender image pull secrets | [] |
scheduler.extender.extraArgs | Scheduler extender extra arguments | ["--debug", "-v=4"] |
Admission Webhook Configuration
| Parameter | Description | Default Value |
|---|---|---|
scheduler.admissionWebhook.enabled | Whether to enable admission webhook | true |
scheduler.admissionWebhook.customURL.enabled | Whether to enable custom URL | false |
scheduler.admissionWebhook.customURL.host | Custom URL host | 127.0.0.1 |
scheduler.admissionWebhook.customURL.port | Custom URL port | 31998 |
scheduler.admissionWebhook.customURL.path | Custom URL path | /webhook |
scheduler.admissionWebhook.reinvocationPolicy | Reinvocation policy | Never |
scheduler.admissionWebhook.failurePolicy | Failure policy | Ignore |
TLS Certificate Configuration
| Parameter | Description | Default Value |
|---|---|---|
scheduler.certManager.enabled | Whether to use cert-manager to generate self-signed certificates | false |
scheduler.patch.enabled | Whether to use kube-webhook-certgen to generate self-signed certificates | true |
scheduler.patch.image.registry | Certgen image registry | "docker.io" |
scheduler.patch.image.repository | Certgen image repository | "jettech/kube-webhook-certgen" |
scheduler.patch.image.tag | Certgen image tag | "v1.5.2" |
scheduler.patch.image.pullPolicy | Certgen image pull policy | IfNotPresent |
scheduler.patch.imageNew.registry | New certgen image registry | "docker.io" |
scheduler.patch.imageNew.repository | New certgen image repository | "liangjw/kube-webhook-certgen" |
scheduler.patch.imageNew.tag | New certgen image tag | "v1.1.1" |
Scheduler Service Configuration
| Parameter | Description | Default Value |
|---|---|---|
scheduler.service.type | Service type | NodePort |
scheduler.service.httpPort | HTTP port | 443 |
scheduler.service.schedulerPort | Scheduler NodePort | 31998 |
scheduler.service.monitorPort | Monitor port | 31993 |
scheduler.service.monitorTargetPort | Monitor target port | 9395 |
Device Plugin Configuration
| Parameter | Description | Default Value |
|---|---|---|
devicePlugin.image.registry | Device plugin image registry | "docker.io" |
devicePlugin.image.repository | Device plugin image repository | "projecthami/hami" |
devicePlugin.image.tag | Device plugin image tag | "" |
devicePlugin.image.pullPolicy | Device plugin image pull policy | IfNotPresent |
devicePlugin.image.pullSecrets | Device plugin image pull secrets | [] |
Monitor Configuration
| Parameter | Description | Default Value |
|---|---|---|
devicePlugin.monitor.image.registry | Monitor image registry | "docker.io" |
devicePlugin.monitor.image.repository | Monitor image repository | "projecthami/hami" |
devicePlugin.monitor.image.tag | Monitor image tag | "" |
devicePlugin.monitor.image.pullPolicy | Monitor image pull policy | IfNotPresent |
devicePlugin.monitor.image.pullSecrets | Monitor image pull secrets | [] |
devicePlugin.monitor.ctrPath | Container path | /usr/local/vgpu/containers |
devicePlugin.monitor.extraArgs | Monitor extra arguments | ["-v=4"] |
devicePlugin.monitor.extraEnvs | Monitor extra environments | {} |
Device Plugin Other Configuration
| Parameter | Description | Default Value |
|---|---|---|
devicePlugin.deviceSplitCount | Integer type, default value: 10. Maximum number of tasks assigned to a single GPU device | 10 |
devicePlugin.deviceMemoryScaling | Device memory scaling ratio | 1 |
devicePlugin.deviceCoreScaling | Device core scaling ratio | 1 |
devicePlugin.runtimeClassName | Runtime class name | "" |
devicePlugin.createRuntimeClass | Whether to create runtime class | false |
devicePlugin.migStrategy | String type, "none" means ignore MIG functionality, "mixed" means allocate MIG devices through independent resources | "none" |
devicePlugin.disablecorelimit | String type, "true" means disable core limit, "false" means enable core limit | "false" |
devicePlugin.passDeviceSpecsEnabled | Whether to enable passing device specs | false |
devicePlugin.extraArgs | Device plugin extra arguments | ["-v=4"] |
devicePlugin.nodeConfiguration.config | Node configuration for device plugin by json | An example of default configuration. |
devicePlugin.nodeConfiguration.externalConfigName | Node configuration for device plugin by external congimap | "" |
devicePlugin.extraEnvs | Device plugin extra environments | {} |
Device Plugin Service Configuration
| Parameter | Description | Default Value |
|---|---|---|
devicePlugin.service.type | Service type | NodePort |
devicePlugin.service.httpPort | HTTP port | 31992 |
Device Plugin Deployment Configuration
| Parameter | Description | Default Value |
|---|---|---|
devicePlugin.pluginPath | Plugin path | /var/lib/kubelet/device-plugins |
devicePlugin.libPath | Library path | /usr/local/vgpu |
devicePlugin.nvidiaNodeSelector | NVIDIA node selector | {"gpu": "on"} |
devicePlugin.updateStrategy.type | Update strategy type | RollingUpdate |
devicePlugin.updateStrategy.rollingUpdate.maxUnavailable | Maximum unavailable count | 1 |
Device Configuration
AWS Neuron
| Parameter | Description | Default Value |
|---|---|---|
devices.awsneuron.customresources | Custom resources | ["aws.amazon.com/neuron", "aws.amazon.com/neuroncore"] |
Kunlunxin
| Parameter | Description | Default Value |
|---|---|---|
devices.kunlun.enabled | Whether to enable | true |
devices.kunlun.customresources | Custom resources | ["kunlunxin.com/xpu"] |
Mthreads
| Parameter | Description | Default Value |
|---|---|---|
devices.mthreads.enabled | Whether to enable | true |
devices.mthreads.customresources | Custom resources | ["mthreads.com/vgpu"] |
NVIDIA
| Parameter | Description | Default Value |
|---|---|---|
devices.nvidia.gpuCorePolicy | GPU core policy | default |
devices.nvidia.libCudaLogLevel | CUDA library log level | 1 |
Huawei Ascend
| Parameter | Description | Default Value |
|---|---|---|
devices.ascend.enabled | Whether to enable | false |
devices.ascend.image | Image | "" |
devices.ascend.imagePullPolicy | Image pull policy | IfNotPresent |
devices.ascend.extraArgs | Extra arguments | [] |
devices.ascend.nodeSelector | Node selector | {"ascend": "on"} |
devices.ascend.tolerations | Tolerations | [] |
devices.ascend.customresources | Custom resources | ["huawei.com/Ascend910A", "huawei.com/Ascend910A-memory", ...] |
Iluvatar
| Parameter | Description | Default Value |
|---|---|---|
devices.iluvatar.enabled | Whether to enable | false |
devices.iluvatar.customresources | Custom resources | ["iluvatar.ai/BI-V150-vgpu", "iluvatar.ai/BI-V150.vMem","iluvatar.ai/BI-V150.vCore", ...] |