跳到主要内容

HAMi Enterprise 2.9.0-r3

Chart 版本Chart 声明的 appVersion软件发布日期Chart 包发布日期
2.9.0-r32.9.0-r32026 年 6 月 26 日2026 年 6 月 29 日

本次为 patch 版本,以下变化以 HAMi Enterprise v2.9.0-rc2 为比较基线。安装包为 hami-enterprise-2.9.0-r3.tgz。

软件变更​

  • 修复 NVIDIA 运行库挂载顺序。 先挂载容器缓存目录,再挂载 libvgpu.so,避免目录挂载遮住运行库文件、导致预加载失败。
  • 补齐 Downward API 路径的共享缓存环境变量。 设备配置 nvidia.useDownward: true 时,为 GPU 业务容器注入 CUDA_DEVICE_MEMORY_SHARED_CACHE,按 Pod 命名空间、Pod 名称和容器名称定位缓存文件。本版 Chart 的设备配置默认开启 Downward API 路径。
  • 补齐初始化容器的 NVIDIA 设备分配标注。 标注阶段不再跳过初始化容器,普通容器继续按扣除初始化容器数量后的位置匹配。此项仅说明标注修复;Webhook 仍只遍历普通容器,不能将其视为初始化容器的 GPU 使用流程已完整支持。
  • 修复授权状态更新后调度器继续使用旧状态的问题。 即使节点设备注册信息没有变化,授权有效性和到期信息变化也能更新到调度状态中。
  • 增加授权相关 Kubernetes 事件。 授权加载失败、过期或失效等情况可通过关联授权 Secret 的事件查看,便于排查不可分配设备的原因。

Chart 变更​

调度器名称与组件标签​

schedulerName 默认值由 hami-enterprise-scheduler 恢复为 hami-scheduler。Chart 名称仍为 hami-enterprise;这项变化不等于 Kubernetes 资源对象名称也恢复为旧名称。

标签2.9.0-rc22.9.0-r3
调度器 app.kubernetes.io/componenthami-enterprise-schedulerhami-scheduler
设备插件 app.kubernetes.io/componenthami-enterprise-device-pluginhami-device-plugin
两类组件的 app.kubernetes.io/name默认 hami-enterprise固定 hami
两类组件的 app.kubernetes.io/instanceHelm release 名称固定 hami

组件选择器使用上述固定标签。依赖 release 名称筛选组件的脚本需要调整,尤其不能再假设 app.kubernetes.io/instance 等于实际 release 名称。

自定义 values 校验​

修复 2.9.0-rc2 将下列配置限定为 null 的问题,改为相应类型及默认值:

配置类型默认值
devicePlugin.nvidiaDriverRoot、devicePlugin.nvidiaHookPath字符串""
devicePlugin.gdrcopyEnabled、devicePlugin.gdsEnabled、devicePlugin.mofedEnabled布尔值false
scheduler.admissionWebhook.whitelistNamespaces列表[]
scheduler.admissionWebhook.namespaceSelector.matchLabels映射{}

驱动路径、GDRCopy、GDS、OFED 和命名空间筛选均为已有配置,本次修复其类型校验与模板判断。布尔开关为 false 时不注入相应启用环境变量,空驱动路径不生成对应驱动目录挂载。

global.imageTag 默认更新为 v2.9.0-r3,调度扩展器、NVIDIA 设备插件和监控容器的默认仓库仍为 ghcr.io/dynamia-ai/hami-enterprise。

升级说明​

从 2.9.0-rc2 升级时,需要处理调度器 Deployment 和设备插件 DaemonSet 的选择器变化。 Kubernetes 不允许原地修改这两类资源的 .spec.selector。默认配置下资源名称没有变化,但选择器已变化,直接原地升级会遇到不可变字段错误。

升级前保存现有 values 和资源清单,用实际 release 名称、命名空间及自定义 values 渲染目标 Chart,确认受影响的具体资源名。在维护窗口内安排这两类资源的重建并应用新 Chart,随后检查调度器就绪、设备插件重新注册和新建 GPU 工作负载的分配结果。不要只处理 Deployment 而遗漏 DaemonSet,也不要在未核对名称时套用固定名称的删除命令。

同时检查以下集成项:

  • 调度器名称:显式使用 hami-enterprise-scheduler 的工作负载模板应改用 hami-scheduler,或通过 Chart 的 schedulerName 显式保留原名称,使两端一致。
  • 标签选择器:更新自定义监控、巡检和 Service 选择器,使用上表目标标签;多套安装还应通过实际命名空间及资源名称区分实例。
  • 自定义 values:按表格类型迁移旧的 null 配置,并确认需要启用的布尔开关为 true。先验证合并后的 values,避免直接复用旧值导致校验或渲染结果不符预期。
  • 设备绑定授权:本版调整了设备绑定授权的要求。使用此类授权的部署,应在升级前通过交付方确认并准备与目标版本匹配的授权文件,避免升级后设备无法参与新工作负载分配。
  • NVIDIA 工作负载:共享缓存环境变量和挂载修复在新创建的容器上生效;已有容器不会因管理组件升级自动重新注入。

安装包及授权文件通过约定的交付渠道获取。查看Chart 与 appVersion 对应关系或软件中心。

Values 说明​

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

展开参数表
KeyTypeDefaultDescription
dcuResourceCoresstring"hygon.com/dcucores"Hygon DCU cores resource name
dcuResourceMemstring"hygon.com/dcumem"Hygon DCU memory resource name
dcuResourceNamestring"hygon.com/dcunum"Hygon DCU resource name
devicePlugin.createRuntimeClassboolfalseWhether to create runtime class
devicePlugin.deviceCoreScalingint1Device core scaling factor
devicePlugin.deviceListStrategystring"envvar"Device list strategy. Supported values: envvar, volume-mounts
devicePlugin.deviceMemoryScalingint1Device memory scaling factor
devicePlugin.deviceSplitCountint10Number of slices to split each GPU into
devicePlugin.disablecorelimitstring"false"Disable core limit
devicePlugin.enabledbooltrueEnable device plugin
devicePlugin.extraArgslist["-v=4"]Extra arguments for device plugin
devicePlugin.extraEnvsobject{}Extra environment variables for device plugin
devicePlugin.gdrcopyEnabledboolfalseEnable GDRCopy
devicePlugin.gdsEnabledboolfalseEnable GDS
devicePlugin.gpuOperatorToolkitReady.enabledboolfalseEnable GPU operator toolkit ready check
devicePlugin.gpuOperatorToolkitReady.hostPathstring"/run/nvidia/validations"Host path for GPU operator toolkit ready check
devicePlugin.image.pullPolicystring"IfNotPresent"Device plugin image pull policy
devicePlugin.image.pullSecretslist[]Specify docker-registry secret names as an array
devicePlugin.image.registrystring"ghcr.io"Device plugin image registry
devicePlugin.image.repositorystring"dynamia-ai/hami-enterprise"Device plugin image repository
devicePlugin.image.tagstring""Device plugin image tag (immutable tags are recommended)
devicePlugin.libPathstring"/usr/local/vgpu"Library path for vGPU
devicePlugin.migStrategystring"none"MIG strategy. Supported values: none, single, mixed
devicePlugin.mofedEnabledboolfalseEnable Mellanox OFED
devicePlugin.monitor.ctrPathstring"/usr/local/vgpu/containers"Container path for monitor
devicePlugin.monitor.extraArgslist["-v=4"]Extra arguments for monitor
devicePlugin.monitor.extraEnvsobject{}Extra environment variables for monitor
devicePlugin.monitor.image.pullPolicystring"IfNotPresent"Monitor image pull policy
devicePlugin.monitor.image.pullSecretslist[]Specify docker-registry secret names as an array
devicePlugin.monitor.image.registrystring"ghcr.io"Monitor image registry
devicePlugin.monitor.image.repositorystring"dynamia-ai/hami-enterprise"Monitor image repository
devicePlugin.monitor.image.tagstring""Monitor image tag (immutable tags are recommended)
devicePlugin.monitor.resourcesobject{}Resources for monitor container
devicePlugin.monitor.resyncIntervalstring"5m"Resync interval for monitor
devicePlugin.nodeConfiguration.configstring"{\n \"nodeconfig\": [\n {\n \"name\": \"your-node-name\",\n \"operatingmode\": \"hami-core\",\n \"devicememoryscaling\": 1,\n \"devicesplitcount\": 10,\n \"preconfigureddevicememory\": 0,\n \"migstrategy\": \"none\",\n \"filterdevices\": {\n \"uuid\": [],\n \"index\": []\n },\n \"enablegetpreferredallocation\": false\n }\n ]\n}\n"Node configuration for device plugin. If set, overrides the default config.json
devicePlugin.nodeConfiguration.externalConfigNamestring""Name of an existing ConfigMap to use for node configuration
devicePlugin.nvidiaDriverRootstring""Root path for NVIDIA driver
devicePlugin.nvidiaHookPathstring""Path for NVIDIA hook
devicePlugin.nvidiaNodeSelectorobject{"gpu":"on"}Node selector for NVIDIA device plugin
devicePlugin.passDeviceSpecsEnabledboolfalseEnable passing device specs
devicePlugin.pluginPathstring"/var/lib/kubelet/device-plugins"Path for device plugin socket
devicePlugin.podAnnotationsobject{}Annotations for device plugin pod
devicePlugin.preConfiguredDeviceMemoryint0Pre-configured device memory in MB for GPUs that don't support memory query. Set to 0 for auto-detection
devicePlugin.resourcesobject{}Resources for device plugin container
devicePlugin.runtimeClassNamestring""Runtime class name to be used by the device plugin
devicePlugin.service.annotationsobject{}Annotations for device plugin service
devicePlugin.service.httpPortint31992HTTP port for device plugin service
devicePlugin.service.labelsobject{}Labels for device plugin service
devicePlugin.service.typestring"NodePort"Service type for device plugin
devicePlugin.tolerationslist[]Tolerations for device plugin pod
devicePlugin.updateStrategy.rollingUpdate.maxUnavailableint1Maximum unavailable pods during update
devicePlugin.updateStrategy.typestring"RollingUpdate"Update strategy for device plugin DaemonSet
devices.alibaba.customresourceslist["alibaba.com/ppu","alibaba.com/ppu-memory","alibaba.com/gpu-core"]Custom resource definitions for Alibaba devices
devices.alibaba.enabledbooltrueEnable Alibaba PPU device
devices.alibaba.ppuCorePolicystring"default"PPU core policy for Alibaba devices
devices.amd.customresourceslist["amd.com/gpu","amd.com/gpumem"]Custom resource definitions for AMD devices
devices.ascend.customresourceslist["huawei.com/Ascend910A","huawei.com/Ascend910A-memory","huawei.com/Ascend910A-core","huawei.com/Ascend910B2","huawei.com/Ascend910B2-memory","huawei.com/Ascend910B2-core","huawei.com/Ascend910B3","huawei.com/Ascend910B3-memory","huawei.com/Ascend910B3-core","huawei.com/Ascend910B4","huawei.com/Ascend910B4-memory","huawei.com/Ascend910B4-core","huawei.com/Ascend910B4-1","huawei.com/Ascend910B4-1-memory","huawei.com/Ascend910B4-1-core","huawei.com/Ascend310P","huawei.com/Ascend310P-memory","huawei.com/Ascend310P-core","huawei.com/Ascend910C","huawei.com/Ascend910C-memory","huawei.com/Ascend910C-core"]Custom resource definitions for Ascend devices
devices.ascend.enabledboolfalseEnable Ascend device plugin
devices.ascend.extraArgslist[]Extra arguments for Ascend device plugin
devices.ascend.hamiVnpuCoreboolfalseEnable soft-partitioning based on hami-vnpu-core (node-level annotation takes higher priority)
devices.ascend.imagestring""Ascend device plugin image
devices.ascend.imagePullPolicystring"IfNotPresent"Image pull policy for Ascend device plugin
devices.ascend.nodeSelectorobject{"ascend":"on"}Node selector for Ascend device plugin
devices.ascend.runtimeClassNamestring""Runtime class name for Ascend NPU pods
devices.ascend.tolerationslist[]Tolerations for Ascend device plugin
devices.awsneuron.customresourceslist["aws.amazon.com/neuron","aws.amazon.com/neuroncore"]Custom resource definitions for AWS Neuron devices
devices.enflame.customresourceslist["enflame.com/vgcu","enflame.com/vgcu-percentage","enflame.com/gcu"]Custom resource definitions for Enflame devices
devices.enflame.enabledbooltrueEnable Enflame device plugin
devices.iluvatar.customresourceslist["iluvatar.ai/BI-V100-vgpu","iluvatar.ai/BI-V100.vCore","iluvatar.ai/BI-V100.vMem","iluvatar.ai/BI-V150-vgpu","iluvatar.ai/BI-V150.vCore","iluvatar.ai/BI-V150.vMem","iluvatar.ai/MR-V100-vgpu","iluvatar.ai/MR-V100.vCore","iluvatar.ai/MR-V100.vMem","iluvatar.ai/MR-V50-vgpu","iluvatar.ai/MR-V50.vCore","iluvatar.ai/MR-V50.vMem"]Custom resource definitions for Iluvatar devices
devices.iluvatar.enabledboolfalseEnable Iluvatar device plugin
devices.kunlun.customresourceslist["kunlunxin.com/xpu","kunlunxin.com/vxpu","kunlunxin.com/vxpu-memory"]Custom resource definitions for Kunlun devices
devices.kunlun.enabledbooltrueEnable Kunlun device plugin
devices.mthreads.customresourceslist["mthreads.com/vgpu"]Custom resource definitions for MThreads devices
devices.mthreads.enabledbooltrueEnable MThreads device plugin
devices.nvidia.gpuCorePolicystring"default"GPU core policy for NVIDIA devices
devices.nvidia.libCudaLogLevelint2libCUDA log level
devices.vastai.customresourceslist["vastaitech.com/va"]Custom resource definitions for Vastai devices
devices.vastai.enabledbooltrueEnable Vastai device plugin
dra.enabledboolfalseEnable DRA (Dynamic Resource Allocation)
enflameResourceNameVGCUstring"enflame.com/vgcu"Enflame VGCU resource name
enflameResourceNameVGCUPercentagestring"enflame.com/vgcu-percentage"Enflame VGCU percentage resource name
fullnameOverridestring""Override the fullname of the chart
global.annotationsobject{}Global annotations to add to all resources
global.gpuHookPathstring"/usr/local"Path for GPU hook installation on nodes
global.imagePullSecretslist[]Global Docker image pull secrets
global.imageRegistrystring""Global Docker image registry
global.imageTagstring"v2.9.0-r3"Global image tag for HAMi Enterprise components
global.labelsobject{}Global labels to add to all resources
global.managedNodeSelectorobject{"usage":"gpu"}Node selector configuration for managed GPU nodes
global.managedNodeSelectorEnableboolfalseEnable managed node selector for GPU nodes
hami-dra.drivers.nvidia.containerDriverbooltrueEnable container driver for NVIDIA DRA
hami-dra.drivers.nvidia.enabledbooltrueEnable NVIDIA DRA driver
hami-dra.drivers.nvidia.image.repositorystring"ghcr.io/project-hami/k8s-dra-driver"NVIDIA DRA driver image repository
hami-dra.drivers.nvidia.image.tagstring"main"NVIDIA DRA driver image tag
hami-dra.monitor.enabledbooltrueEnable monitor for hami-dra
kunlunResourceNamestring"kunlunxin.com/xpu"Kunlun XPU resource name
kunlunResourceVCountNamestring"kunlunxin.com/vxpu"Kunlun virtual XPU count resource name
kunlunResourceVMemoryNamestring"kunlunxin.com/vxpu-memory"Kunlun virtual XPU memory resource name
legacyMetricsboolfalseEnable legacy metrics
metaxResourceCorestring"metax-tech.com/vcore"Metax sGPU core resource name
metaxResourceMemstring"metax-tech.com/vmemory"Metax sGPU memory resource name
metaxResourceNamestring"metax-tech.com/sgpu"Metax sGPU resource name
metaxsGPUTopologyAwarestring"false"Enable Metax sGPU topology awareness
mluResourceCoresstring"cambricon.com/mlu.smlu.vcore"MLU cores resource name
mluResourceMemstring"cambricon.com/mlu.smlu.vmemory"MLU memory resource name
mluResourceNamestring"cambricon.com/vmlu"MLU resource name
mockDevicePlugin.enabledboolfalseEnable mock device plugin
mockDevicePlugin.image.pullPolicystring"IfNotPresent"Mock device plugin image pull policy
mockDevicePlugin.image.pullSecretslist[]Specify docker-registry secret names as an array
mockDevicePlugin.image.registrystring"docker.io"Mock device plugin image registry
mockDevicePlugin.image.repositorystring"projecthami/mock-device-plugin"Mock device plugin image repository
mockDevicePlugin.image.tagstring"1.0.1"Mock device plugin image tag
nameOverridestring""Override the chart name
namespaceOverridestring""Override the namespace
podSecurityPolicy.enabledboolfalseEnable PodSecurityPolicy
prometheus.enabledboolfalseEnable Prometheus metrics
resourceCoresstring"nvidia.com/gpucores"NVIDIA GPU cores resource name
resourceMemstring"nvidia.com/gpumem"NVIDIA GPU memory resource name
resourceMemPercentagestring"nvidia.com/gpumem-percentage"NVIDIA GPU memory percentage resource name
resourceNamestring"nvidia.com/gpu"NVIDIA GPU resource name
resourcePrioritystring"nvidia.com/priority"NVIDIA GPU priority resource name
scheduler.admissionWebhook.customURL.enabledboolfalseEnable custom webhook URL
scheduler.admissionWebhook.customURL.hoststring"127.0.0.1"Webhook host (must be an endpoint using https)
scheduler.admissionWebhook.customURL.pathstring"/webhook"Webhook path
scheduler.admissionWebhook.customURL.portint31998Webhook port
scheduler.admissionWebhook.enabledbooltrueEnable admission webhook. If disabled, pods must be configured with correct schedulerName manually
scheduler.admissionWebhook.failurePolicystring"Ignore"Failure policy for webhook
scheduler.admissionWebhook.namespaceSelectorobject{"matchExpressions":[],"matchLabels":{}}Namespace selector for webhook
scheduler.admissionWebhook.objectSelectorobject{"matchExpressions":[]}Object selector for webhook
scheduler.admissionWebhook.reinvocationPolicystring"Never"Reinvocation policy for webhook
scheduler.admissionWebhook.whitelistNamespaceslist[]Namespaces that the webhook will not be applied to
scheduler.certManager.enabledboolfalseEnable cert-manager for TLS certificate generation
scheduler.defaultSchedulerPolicy.gpuSchedulerPolicystring"spread"GPU-level scheduling policy. Supported values: binpack, spread
scheduler.defaultSchedulerPolicy.nodeSchedulerPolicystring"binpack"Node-level scheduling policy. Supported values: binpack, spread
scheduler.extender.extraArgslist["--debug","-v=4"]Extra arguments for scheduler extender
scheduler.extender.image.pullPolicystring"IfNotPresent"Scheduler extender image pull policy
scheduler.extender.image.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.extender.image.registrystring"ghcr.io"Scheduler extender image registry
scheduler.extender.image.repositorystring"dynamia-ai/hami-enterprise"Scheduler extender image repository
scheduler.extender.image.tagstring""Scheduler extender image tag (immutable tags are recommended)
scheduler.extender.resourcesobject{}Resources for scheduler extender container
scheduler.forceOverwriteDefaultSchedulerbooltrueForce overwrite the default scheduler name in pods when it equals the K8s default scheduler name
scheduler.kubeScheduler.enabledbooltrueWhether to run kube-scheduler container in the scheduler pod
scheduler.kubeScheduler.extraArgslist["--policy-config-file=/config/config.json","-v=4"]Extra arguments for kube-scheduler (legacy config format)
scheduler.kubeScheduler.extraNewArgslist["--config=/config/config.yaml","-v=4"]Extra arguments for kube-scheduler (new config format)
scheduler.kubeScheduler.image.pullPolicystring"IfNotPresent"kube-scheduler image pull policy
scheduler.kubeScheduler.image.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.kubeScheduler.image.registrystring"registry.cn-hangzhou.aliyuncs.com"kube-scheduler image registry
scheduler.kubeScheduler.image.repositorystring"google_containers/kube-scheduler"kube-scheduler image repository
scheduler.kubeScheduler.image.tagstring""kube-scheduler image tag (immutable tags are recommended)
scheduler.kubeScheduler.resourcesobject{}Resources for kube-scheduler container
scheduler.leaderElectbooltrueEnable leader election for scheduler
scheduler.livenessProbeboolfalseEnable liveness probe for scheduler
scheduler.metricsBindAddressstring":9395"Address to bind metrics server
scheduler.nodeLockExpirestring"5m"Node lock expiration time
scheduler.nodeNamestring""Node name for scheduler pod. If installing as default scheduler, set this to skip the schedule workflow
scheduler.overwriteEnvstring"false"Overwrite environment variables
scheduler.patch.enabledbooltrueEnable kube-webhook-certgen patch job
scheduler.patch.image.pullPolicystring"IfNotPresent"kube-webhook-certgen image pull policy
scheduler.patch.image.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.patch.image.registrystring"docker.io"kube-webhook-certgen image registry
scheduler.patch.image.repositorystring"jettech/kube-webhook-certgen"kube-webhook-certgen image repository
scheduler.patch.image.tagstring"v1.5.2"kube-webhook-certgen image tag
scheduler.patch.imageNew.pullPolicystring"IfNotPresent"New kube-webhook-certgen image pull policy
scheduler.patch.imageNew.pullSecretslist[]Specify docker-registry secret names as an array
scheduler.patch.imageNew.registrystring"docker.io"New kube-webhook-certgen image registry
scheduler.patch.imageNew.repositorystring"liangjw/kube-webhook-certgen"New kube-webhook-certgen image repository
scheduler.patch.imageNew.tagstring"v1.1.1"New kube-webhook-certgen image tag
scheduler.patch.nodeSelectorobject{}Node selector for patch job
scheduler.patch.podAnnotationsobject{}Annotations for patch job pod
scheduler.patch.priorityClassNamestring""Priority class name for patch job
scheduler.patch.runAsUserint2000User ID to run patch job as
scheduler.patch.tolerationslist[]Tolerations for patch job
scheduler.podAnnotationsobject{}Annotations for scheduler pod
scheduler.replicasint1Number of scheduler replicas (only effective when leaderElect is true)
scheduler.service.annotationsobject{}Annotations for scheduler service
scheduler.service.httpPortint443HTTP port for scheduler service
scheduler.service.httpTargetPortint443Target port for HTTP
scheduler.service.labelsobject{}Labels for scheduler service
scheduler.service.monitorPortint31993Monitoring port for scheduler service
scheduler.service.monitorTargetPortint9395Target port for monitoring
scheduler.service.schedulerPortint31998NodePort for scheduler HTTP
scheduler.service.typestring"NodePort"Service type for scheduler
scheduler.tolerationslist[]Tolerations for scheduler pod
schedulerNamestring"hami-scheduler"Name of the scheduler
vastaiResourceNamestring"vastaitech.com/va"Vastai resource name