跳到主要内容

HAMi AI Platform Chart 0.21.2

发布时间:2026-10-16(UTC)

版本状态:有已知问题

本版将后端升级至 v0.15.1,使 Chart 0.21.1 的站点域名配置在默认后端镜像中生效。默认 UI v0.12.1 与新版工作负载模板接口存在 GPU 资源格式不匹配,影响页面中的 GPU 工作负载创建、复制和编辑。该问题已在 Chart 0.21.3 的默认 UI v0.13.0 中修复;依赖这些操作的环境应避免本版默认组件组合,并在升级前查阅修复版的适用范围与版本状态。

版本比较基线本版
Chart0.21.10.21.2
appVersion0.15.00.15.1
API Serverv0.15.0v0.15.1
Controller Managerv0.15.0v0.15.1
数据库迁移镜像v0.15.0v0.15.1
UIv0.12.1v0.12.1

数据库迁移容器仅在启用认证且 auth.storeBackend=sqlite 时运行。

HAMi Enterprise 兼容性​

以下为本版相关接口与协议的最低配套版本。资源池为可选功能,其门槛不自动成为平台基础运行门槛;这些结论不替代具体硬件环境验收。

功能或使用场景最低可用 HAMi Enterprise 版本本版配套要求与升级结论
读取已分配设备的四字段注解,含多容器空槽;NVIDIA、AMD、Ascend、Iluvatar、AWS Neuron、Enflame vGPU、Alibaba PPUv2.9.0-rc0仅约束分配记录读取。本版修复平台解析,无需为此升级已有匹配协议的 Enterprise;不代表这些厂商的全部调度、隔离或监控能力均由此版本覆盖。
NVIDIA/Ascend 常规业务容器资源池管理、命名空间授权、配额、显式选池及 binpack/spread 自动选池v2.9.0-rc0独立 CRD Chart 最低 0.4.2、RPM 应用最低 v0.0.1;默认组件正确的 RPM Chart 最低 0.0.5。RPM Chart 0.0.4 只有显式改用正确的 RPM 镜像才满足条件。上述 RPM 制品组合按 amd64 确认。
NVIDIA 业务容器前有不申请 GPU 的初始化容器v2.9.0-rc1使用 scheduler.useDownward=true。更早版本的容器索引处理不满足此模板;启用资源池时另满足上一行独立组件要求。
NVIDIA 初始化容器申请 GPU,包括仅初始化容器申请 GPUv2.10.0-r0使用 scheduler.useDownward=true,需要完整的初始化容器注解与插件配套。启用资源池时另满足上述 RPM/CRD 要求。
NVIDIA 资源池内使用 GPU mutex、numa 或组合策略v2.10.0-r0配套上述 RPM/CRD。这些是池内 GPU 策略,与 RPM 的池间 binpack/spread 自动选池不同。
HCU 资源池管理与调度接口v2.10.0-r3CRD Chart 最低 0.4.2、RPM 应用最低 v0.0.2、默认 RPM Chart 最低 0.0.6;HCU device plugin 最低 v3.0.0,启用 RESOURCE_REGISTER_STRATEGY=hami。插件制品按 amd64 确认。旧 DCU 命名协议不能替代 HCU 协议。

HAMi Enterprise 的 rc 后缀不代表测试版或预发布版。v2.9.0-rc0 和 v2.9.0-rc1 的旧镜像当前不可拉取,新部署需选择满足上述接口条件且制品可取得的版本。最低版本不构成对所有后续版本无回归的保证。

资源池要求 Kubernetes 1.30 或更高版本及 HAMi extender 模式,不适用于 DRA。表中的 Ascend 资源池用法限定常规业务容器;Ascend 或 NVIDIA 非 Downward 模式的仅初始化容器设备请求不在已确认组合内,当前正式发布中的设备加锁路径仍未覆盖该条件。

软件变更​

  • 工作负载域名路由修复。 控制平面的 Flow 工作负载路由(包括 Jupyter、VS Code)、vLLM Demo 和 CloudShell 读取 gateway.hostnames,避免工作负载路径落入平台 UI 的域名路由而显示 403 页面。vLLM Demo 不再固定使用 dashboard.hami.run。成员集群的工作负载路由不继承控制平面域名。
  • 主监听器选择修复。 配置了站点域名的 Flow 和 CloudShell 路由优先绑定 Gateway 的第一个 HTTPS 监听器,没有 HTTPS 时使用第一个 HTTP 监听器,避免更具体的工作负载路径绕过 HTTP 到 HTTPS 的跳转。无法读取 Gateway 或找不到合适监听器时返回错误。
  • Flow 模板扩展。 API 的 spec.template 改为 Kubernetes 原生 PodTemplateSpec 结构,可保留初始化容器、亲和性、安全上下文等字段。资源请求与限制使用 Kubernetes 原生的资源名到数量映射;旧客户端需要调整请求结构。默认 UI 的相关限制见「已知问题」。
  • 工作负载保存前校验。 创建或更新 Deployment 类型的 Flow 时,先向目标集群对最终 Deployment 执行 dry-run 校验,再保存 Flow,提前返回无效模板、资源冲突或准入错误。使用通用临时卷的请求需要 storage.manage 权限。启用插件时,首个业务容器不接受自定义 readinessProbe、livenessProbe 或 lifecycle,初始化容器名称 init-container 保留给平台使用。
  • 设备分配信息解析修复。 正确处理 HAMi 多容器设备分配注解中的空容器和空设备槽,避免分隔符混入设备 UUID,影响分配信息读取。

Chart 变更​

Chart 的配置项、模板和依赖相对 0.21.1 没有新增变化;本版更新 Chart 元数据及默认后端、迁移镜像版本。UI 镜像保持不变。

已知问题​

问题影响范围规避方法修复版本
默认 UI 提交的 GPU 资源结构与后端模板接口不匹配UI v0.12.1 的工作负载表单启用 GPU 后,将加速器资源放在 resources.limits.resources 对象中。API Server v0.15.1 按原生 Kubernetes 资源数量解析,创建、复制或编辑请求会被拒绝。本版 UI 内无已验证的规避方法。升级到 Chart 0.21.3 的默认组件组合,并确认 UI 镜像未被固定为旧版;升级前查阅该版状态与验证范围。Chart 0.21.3,默认 UI v0.13.0

该问题依据已发布镜像对应源码和本地请求解析复现确认,尚未完成浏览器或集群端到端验证。影响范围限于 GPU 工作负载表单提交,不涉及该资源格式的 CPU-only 请求和已有 Pod 的运行不在此问题范围内。

升级说明​

  • 按上述场景核对配套版本。只采用本版注解解析修复且配套已满足协议时,无需升级 Enterprise;新采用初始化容器模板或资源池高级策略时,先满足对应主版本条件。
  • 启用资源池时,先安装 CRD Chart,再准备表中 Enterprise 和对应设备插件,最后安装 RPM 并更新平台。RPM 的 hami.existingConfigMap 指向同命名空间中现有调度器设备配置,需启用 RPM webhook 和控制器;Ascend 在 RPM Chart 0.0.4/0.0.5 设置 hami.ascendEnabled=true,0.0.6 改为 devices.ascend.enabled=true;HCU 在 0.0.6 设置 devices.hygon.enabled=true;全局选池设置还需其运行时 ConfigMap。设备配置变化后同步更新 RPM。保留 RPM Chart 0.0.4 时,显式设置 image.repository=ghcr.io/dynamia-ai/resource-pool-manager、image.tag=v0.0.1;直接采用默认组合时从 RPM Chart 0.0.5 起选用,HCU 从 0.0.6 起选用。
  • 从 Chart 0.21.1 升级前,先评估上述 UI 问题。自定义 API 客户端需同步更新 spec.template:例如将 limits.resources["nvidia.com/gpu"] 移到 limits["nvidia.com/gpu"];requests 同样使用扁平资源映射。直接使用 gRPC 的客户端需按新版 API 定义重新生成客户端并调整模板构造。
  • 如覆盖了镜像,核对 apiserver.image.tag、controllerManager.image.tag 和 auth.image.tag,三者目标值均为 v0.15.1。ui.image.tag 的默认值仍为 v0.12.1;固定旧后端镜像会跳过本次修复。镜像地址由各组件的 registry、repository、tag 拼接,global.imageRegistry 覆盖 registry。
  • 使用域名入口时,设置 gateway.hostnames 为 DNS 名称列表,不带协议、端口和路径;首项使用具体域名,HTTPS 证书须覆盖配置的域名。默认空列表不限制域名。API Server 与 Controller Manager 更新后读取该配置;Flow 控制器会在协调时更新已有路由。既有 CloudShell 和 vLLM Demo 路由不会因本次升级自动改写,需要重新创建相关会话或 Demo 后生效。
  • 直接管理后端进程环境变量的部署,将原有 GATEWAY_ENDPOINT 配置迁移为 GATEWAY_HOSTNAMES,多个域名用逗号分隔;首项用于控制平面集群访问地址。工作负载路径前缀仍使用 GATEWAY_BASE_URL。
  • API 创建和更新 Flow 现在依赖目标集群完成 Deployment dry-run;检查目标集群连接、操作权限及准入服务。授权失败、限流或准入超时会阻止保存,不应按无效模板处理。启用通用临时卷或插件的自定义模板需满足前述权限与字段限制。
  • 本版没有新增数据库迁移脚本或 CRD schema 变更。SQLite 部署仍在 API Server 启动前执行迁移容器;保持现有数据持久化配置并在升级前备份数据。Helm 回滚不等于数据库数据恢复。

查看Chart 与 appVersion 对应关系或软件中心。

Values 说明​

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

展开参数表
KeyTypeDefaultDescription
apiserver.affinityobject{}apiserver affinity settings
apiserver.clusterAPIBurstint100Burst to use while talking with cluster kube-apiserver
apiserver.clusterAPIQPSint50QPS to use while talking with cluster kube-apiserver
apiserver.image.pullPolicystring"IfNotPresent"kantaloupe image pull policy
apiserver.image.pullSecretslist[]Specify docker-registry secret names as an array
apiserver.image.registrystring"ghcr.io"kantaloupe image registry
apiserver.image.repositorystring"dynamia-ai/kantaloupe-apiserver"kantaloupe image repository
apiserver.image.tagstring"v0.15.1"kantaloupe image tag (immutable tags are recommended)
apiserver.labelsobject{}apiserver labels
apiserver.leaderElection.enabledbooltrueEnable apiserver leader election for auth singleton bootstrap when auth.storeBackend=crd
apiserver.leaderElection.leaseDurationstring"15s"Lease duration for apiserver leader election
apiserver.leaderElection.renewDeadlinestring"10s"Renew deadline for apiserver leader election
apiserver.leaderElection.resourceNamespacestring""Namespace of the Lease object; empty means use the release namespace
apiserver.leaderElection.retryPeriodstring"2s"Retry period for apiserver leader election
apiserver.livenessProbe.enabledboolfalseEnable livenessProbe on apiserver containers
apiserver.logLevelint4apiserver glog verbosity level (0=minimal, 4=info, 5=debug)
apiserver.meteringGRPCAddressstring""Optional upstream metering gRPC service address. Leave empty to disable metering APIs
apiserver.nodeSelectorobject{}apiserver node labels for pod assignment
apiserver.podAnnotationsobject{}apiserver pod annotations
apiserver.podLabelsobject{}apiserver pod labels
apiserver.prometheusAddrstring""Prometheus server address for apiserver metrics querying
apiserver.readinessProbe.enabledboolfalseEnable readinessProbe on ui containers
apiserver.replicaCountint1apiserver target replica count
apiserver.resourcesobject{}apiserver resource requests and limits
apiserver.service.nodePortint31800
apiserver.service.portint8000
apiserver.service.typestring"ClusterIP"
apiserver.tolerationsobject{}apiserver tolerations for pod assignment
auth.apiserverServiceAccountNamestring""ServiceAccount name of the kantaloupe-apiserver, used by the auth assignment admission webhook to validate the requester identity. Defaults to the release fullname.
auth.bootstrapAdminEmailstring"[email protected]"Bootstrap PlatformAdmin email address
auth.bootstrapAdminFullNamestring"Platform Administrator"Bootstrap PlatformAdmin full name (display name)
auth.bootstrapAdminPasswordstring"admin12345"Bootstrap admin password (plain text, dev only)
auth.bootstrapAdminUsernamestring"bootstrap-platform-admin"Bootstrap PlatformAdmin username
auth.crdAuditWindowSizeint1000Max number of audit CRDs retained by the apiserver write path
auth.dbPathstring"/data/kantaloupe/auth.db"SQLite database path for auth data when auth.storeBackend=sqlite
auth.dryRunboolfalseAllow requests without enforcing auth; inject bootstrap admin when no valid token is provided
auth.enabledbooltrueEnable kantaloupe auth (JWT login, RBAC, audit)
auth.existingAuthSecretstring""Name of an existing K8s Secret with keys "jwt-secret" and "bootstrap-admin-password" (use instead of plain-text values for production)
auth.image.pullPolicystring"IfNotPresent"db-migrate image pull policy for sqlite backend
auth.image.registrystring"ghcr.io"db-migrate image registry for sqlite backend
auth.image.repositorystring"dynamia-ai/kantaloupe-db-migrate"db-migrate image repository for sqlite backend
auth.image.tagstring"v0.15.1"db-migrate image tag for sqlite backend
auth.jwtSecretstring"your-own-jwt-secret"JWT signing secret (plain text, dev only)
auth.persistence.enabledboolfalseEnable persistence using PVC for sqlite backend (PV is dynamically provisioned via cluster default StorageClass)
auth.persistence.existingClaimstring""Name of an existing PVC to use for sqlite backend (if set, a new PVC will not be created)
auth.persistence.sizestring"1Gi"PVC storage size for sqlite backend
auth.persistence.storageClassstring""PVC storage class for sqlite backend (empty = use cluster default StorageClass for dynamic PV provisioning)
auth.storeBackendstring"crd"Auth store backend. Supported values: crd, sqlite
cloudtty.enabledbooltrue
controlPlaneNamestring"control-plane"
controllerManager.affinityobject{}controllerManager affinity settings
controllerManager.enablePromoteKantaloupeflowControllerboolfalseAutomatically create KantaloupeFlow CRs for existing GPU deployments in member clusters.
controllerManager.image.pullPolicystring"IfNotPresent"kantaloupe image pull policy
controllerManager.image.pullSecretslist[]Specify docker-registry secret names as an array
controllerManager.image.registrystring"ghcr.io"kantaloupe image registry
controllerManager.image.repositorystring"dynamia-ai/kantaloupe-controller-manager"kantaloupe image repository
controllerManager.image.tagstring"v0.15.1"kantaloupe image tag (immutable tags are recommended)
controllerManager.labelsobject{}controllerManager labels
controllerManager.livenessProbe.enabledboolfalseEnable livenessProbe on controllerManager containers
controllerManager.metricsPortint31001
controllerManager.nodeSelectorobject{}controllerManager node labels for pod assignment
controllerManager.podAnnotationsobject{}controllerManager pod annotations
controllerManager.podLabelsobject{}controllerManager pod labels
controllerManager.prometheusAddrstring""The Prometheus-compatible query endpoint for controller-manager. If empty, uses the default value from Go code.
controllerManager.readinessProbe.enabledboolfalseEnable readinessProbe on controllerManager containers
controllerManager.replicaCountint1controllerManager target replica count
controllerManager.resourcesobject{}controllerManager resource requests and limits
controllerManager.tolerationsobject{}controllerManager tolerations for pod assignment
controllerManager.webhook.certDirstring"/var/run/kantaloupe/webhook-certs"
controllerManager.webhook.certNamestring"tls.crt"
controllerManager.webhook.enabledbooltrue
controllerManager.webhook.keyNamestring"tls.key"
controllerManager.webhook.portint9443
controllerManager.webhook.servicePortint443
fullnameOverridestring"kantaloupe"String to fully override the fullname template
gateway.apiserverCorsobject{"allowCredentials":false,"allowHeaders":["authorization","content-type","accept","origin"],"allowMethods":["GET","POST","PUT","PATCH","DELETE","OPTIONS"],"allowOrigins":[],"enabled":false,"exposeHeaders":[],"maxAge":null}Optional CORS policy attached only to the apiserver HTTPRoute (/apis)
gateway.apiserverCors.allowCredentialsboolfalseWhether credentialed cross-origin requests are allowed
gateway.apiserverCors.allowHeaderslist["authorization","content-type","accept","origin"]Allowed request headers returned on CORS preflight responses
gateway.apiserverCors.allowMethodslist["GET","POST","PUT","PATCH","DELETE","OPTIONS"]Allowed methods returned on CORS preflight responses
gateway.apiserverCors.allowOriginslist[]Allowed browser origins for apiserver CORS; required when enabled
gateway.apiserverCors.enabledboolfalseEnable Envoy Gateway SecurityPolicy-based CORS on the apiserver route
gateway.apiserverCors.exposeHeaderslist[]Response headers exposed to browser JavaScript
gateway.apiserverCors.maxAgestringnilOptional browser preflight cache max age in seconds
gateway.apiserverHostnameslist[]Dedicated external hostnames for direct apiserver access, separate from gateway.hostnames (the UI/site domain). When non-empty, a dedicated HTTPRoute routes these hosts to the apiserver; they must be covered by the HTTPS listener's TLS certificate.
gateway.classNamestring"kantaloupe"GatewayClass name
gateway.enabledbooltrueEnable Gateway API resources
gateway.envoyobject{"proxy":{"image":{"pullSecrets":[],"registry":"","repository":"","tag":""}},"service":{"ports":{"http":{"nodePort":30080},"https":{"nodePort":30443}},"type":"NodePort"}}Envoy Gateway implementation details
gateway.envoy.proxy.image.pullSecretslist[]Image pull secrets for Envoy proxy pods
gateway.envoy.proxy.image.registrystring""Envoy proxy image registry
gateway.envoy.proxy.image.repositorystring""Envoy proxy image repository. When set without a tag, renders the EnvoyProxy imageRepository field.
gateway.envoy.proxy.image.tagstring""Envoy proxy image tag. When set, renders a complete EnvoyProxy image reference.
gateway.envoy.serviceobject{"ports":{"http":{"nodePort":30080},"https":{"nodePort":30443}},"type":"NodePort"}Envoy service configuration
gateway.envoy.service.ports.httpobject{"nodePort":30080}HTTP port configuration
gateway.envoy.service.ports.http.nodePortint30080HTTP NodePort
gateway.envoy.service.ports.httpsobject{"nodePort":30443}HTTPS port configuration
gateway.envoy.service.ports.https.nodePortint30443HTTPS NodePort
gateway.envoy.service.typestring"NodePort"Envoy service type (LoadBalancer or NodePort)
gateway.hostnameslist[]List of site hostnames (DNS names or wildcard names such as *.example.com, without scheme, port, or path). Applied to UI/API routes and passed to controller-manager and apiserver as GATEWAY_HOSTNAMES for control-plane workload, vLLM demo, and CloudShell HTTPRoutes. Member-cluster workload routes do not inherit the control-plane site hostnames. An empty list leaves site routes unrestricted by hostname. The first entry also supplies the control-plane cluster gateway address for generated access URLs; use a concrete hostname first. HTTPS certificates must cover these names.
gateway.ipAddressstring""Gateway IP address
gateway.listenerslist[{"name":"http","port":80,"protocol":"HTTP"}]Gateway listeners configuration
global.imagePullSecretslist[]Global Docker image pull secrets
global.imageRegistrystring""Global Docker image registry
hamiNamespacestring"hami-system"
hook.image.pullPolicystring"IfNotPresent"CRD hook image pull policy
hook.image.pullSecretslist[]Specify docker-registry secret names as an array
hook.image.registrystring"ghcr.io"CRD hook image registry
hook.image.repositorystring"cloudtty/cloudshell"CRD hook image repository
hook.image.tagstring"v0.8.9"CRD hook image tag (immutable tags are recommended)
installCRDsbooltruedefine flag whether to install CRD resources
monitoring.enabledbooltrue
monitoring.hamiServiceMonitor.enabledbooltrue
monitoring.serviceMonitorLabelsobject{}Labels added to ServiceMonitor and PrometheusRule resources for discovery by Prometheus-compatible operators. When empty, defaults to release: prometheus; providing any labels replaces that fallback. The built-in app, role, and control-plane labels cannot be overridden.
monitoring.vendorServiceMonitor.enableAMDServiceMonitorboolfalseEnable AMD GPU Operator exporter discovery and AMD recording rules in the control plane. Required for monitoring AMD devices in local or member clusters.
monitoring.vendorServiceMonitor.enableAlibabaPPUServicemonitorboolfalseEnable Alibaba PPU exporter discovery and Alibaba PPU recording rules in the control plane. Required for monitoring Alibaba PPU devices in local or member clusters.
monitoring.vendorServiceMonitor.enableAscendServicemonitorboolfalseEnable Ascend exporter discovery and Ascend recording rules in the control plane. Required for monitoring Ascend devices in local or member clusters.
monitoring.vendorServiceMonitor.enableEnflameServicemonitorboolfalseEnable Enflame GCU exporter discovery and Enflame recording rules in the control plane. Required for monitoring Enflame devices in local or member clusters.
monitoring.vendorServiceMonitor.enableHygonServicemonitorboolfalseEnable HCU exporter discovery and Hygon device recording rules in the control plane. Required for monitoring Hygon devices in local or member clusters. Discovers hcu-exporter in the monitoring namespace.
monitoring.vendorServiceMonitor.enableIluvatarServicemonitorboolfalseEnable Iluvatar ix-exporter and vgpu-manager discovery and Iluvatar recording rules in the control plane. Required for monitoring Iluvatar devices in local or member clusters.
monitoring.vendorServiceMonitor.enableMetaxServicemonitorboolfalseEnable MetaX exporter discovery and MetaX recording rules in the control plane. Required for monitoring MetaX devices in local or member clusters.
monitoring.vendorServiceMonitor.enableNvidiaServicemonitorbooltrueEnable NVIDIA exporter discovery and NVIDIA recording rules in the control plane. Required for monitoring NVIDIA devices in local or member clusters.
monitoring.vendorServiceMonitor.enabledbooltrueCreate vendor ServiceMonitor templates and recording rules for enabled vendors.
mpu.enabledboolfalse
mpu.image.pullPolicystring"IfNotPresent"MPU image pull policy
mpu.image.pullSecretslist[]
mpu.image.registrystring"ghcr.io"
mpu.image.repositorystring"dynamia-ai/mpu"
mpu.image.tagstring"dev-ubuntu24.04"
nameOverridestring""String to partially override the fullname template (will maintain the release name)
ui.affinityobject{}ui affinity settings
ui.apiBackendURLstring""Optional backend address for UI API requests. Leave empty to use same-origin requests
ui.forceChineseboolfalseForce UI to display Chinese language
ui.image.pullPolicystring"IfNotPresent"kantaloupe image pull policy
ui.image.pullSecretslist[]Specify docker-registry secret names as an array
ui.image.registrystring"ghcr.io"kantaloupe image registry
ui.image.repositorystring"dynamia-ai/kantaloupe-ui"kantaloupe image repository
ui.image.tagstring"v0.12.1"kantaloupe image tag (immutable tags are recommended)
ui.labelsobject{}ui labels
ui.livenessProbe.enabledboolfalseEnable livenessProbe on ui containers
ui.nodeSelectorobject{}ui node labels for pod assignment
ui.podAnnotationsobject{}ui pod annotations
ui.podLabelsobject{}ui pod labels
ui.readinessProbe.enabledboolfalseEnable readinessProbe on ui containers
ui.replicaCountint1ui target replica count
ui.resourcesobject{}ui resource requests and limits
ui.service.nodePortint31300
ui.service.portint80
ui.service.typestring"ClusterIP"
ui.tolerationsobject{}ui tolerations for pod assignment