Nelm 与 Helm 4 的比较:现有差异与未来规划
Helm 4 已于最近发布,为此,Flant 团队将其与 werf 中开发的替代方案 Nelm 进行了比较。并介绍了 Nelm 与 Helm 4 两个项目的新功能,详细说明它们的差异,以及规划了 Nelm 的未来路线。
Helm 4 给云原生社区带来了一系列新功能。最重要的用户层面变化是采用了 Kubernetes 的 Server-Side Apply (SSA),取代了之前的 3-Way Merge,解决了资源更新错误的问题;并引入了基于 kstatus 的资源监控。其他新功能主要致力于减少技术负债。
虽然 SSA 的实现值得单独发布,但社区对 Helm 4 的期望更高。最受欢迎的需求包括 Go 模板的替代方案和更好地处理自定义资源定义(CRD)的部署。
Helm 的开发节奏在新版本发布前加快,但鉴于 Helm 在业界的广泛使用及严格的向后兼容要求,重大架构变更可能会推迟到下一次大版本。
Nelm 与 Helm 4 的区别
Nelm 是 Helm 4 的现代替代品,专注于引入新功能,同时保持对 Helm chart 和发布的向后兼容。
Nelm 在 werf 内部创建,源于用户对更强大部署能力的需求。后来独立成项目,可单独使用(无需 werf)来部署 Helm chart 到 Kubernetes。内部采用了 Helm 代码库的一部分,但对部署引擎等复杂部分进行了重写。
Nelm 早已支持 Server-Side Apply,并且不断增加用户功能。例如,最近引入了基于 werf.io/delete-policy、werf.io/ownership 和 werf.io/deploy-on 注释的资源生命周期管理。下面列出 Nelm 与 Helm 4 的主要差异。
1. CRD 部署
Helm 建议将 CRD 放在 chart 的 crds 目录,但该目录内资源只在首次安装时部署,无法更新,且 helm upgrade 会忽略它。
有些用户将 CRD 放在 templates 目录以当作普通资源部署,但这样难以维护部署顺序,且 CRD 文件大,可能超出 Secret 大小限制。
有些开源 chart 甚至单独用子 chart 来部署 CRD。
Nelm 只需将 CRD 放入 crds 目录,Nelm 提供完整的部署机制,CRD 会在每次升级时更新和部署。
2. 部署顺序定义
Helm 通常用 hooks 定义部署顺序,适合简单的 Job 在 rollout 前后运行。
但如果 Job 依赖 Deployment,或需要在发布中途运行,Helm 没有标准解决方案。
Nelm 在每次发布前构建操作图,定义资源的部署顺序。并提供 werf.io/deploy-dependency 注释,设置操作间的依赖关系,确定顺序。
示例:
kind: Deployment
metadata:
name: backend
annotations:
werf.io/deploy-dependency-db: state=ready,kind=StatefulSet,name=postgres
表示 backend Deployment 只有在 postgres StatefulSet 创建且就绪后才创建或更新。
该注释适用于普通资源和 hooks。未来计划支持对整个 chart 的依赖。
Nelm 还支持 werf.io/weight 注释,类似于 helm.sh/hook-weight,适用于 hooks 和普通资源。
此外,还有 external-dependency.werf.io/resource 注释,用于指定 Helm 发布外的资源依赖,比如 operator 创建的 Secret。
当然,Helm 原生的 hooks 和权重也支持。
3. 资源生命周期
Helm 通过 helm.sh/resource-policy: keep 防止资源删除,helm.sh/hook-delete-policy 控制 hook 删除时机。
但如果需要在发布中间部署不可变 Job,或部署后清理资源,或跨多个发布管理同一资源,Helm 很难满足。
Nelm 新增了一套资源生命周期管理注释:
-
werf.io/delete-policy:类似 helm.sh/hook-delete-policy,支持发布前重建(before-creation)、遇不可变字段错误时重建(before-creation-if-immutable)、发布成功后删除(succeeded)、发布失败后删除(failed)。适用于 hooks 和普通资源。
-
werf.io/ownership:让普通资源具备类似 hooks 的行为,防止应用或校验发布注释,防止资源被删除(如果从 chart 移除或发布被删除)。
-
werf.io/deploy-on:控制资源只在安装、升级、回滚或卸载时渲染,类似 Helm hooks,但不将资源变成 hook。
这些注释能模拟 Helm hook 的行为,无需正式声明 hook。
例如,以下 hook:
metadata:
annotations:
helm.sh/hook: pre-install
helm.sh/hook-delete-policy: before-hook-creation
相当于下面非 hook 资源:
metadata:
annotations:
werf.io/deploy-on: install
werf.io/delete-policy: before-creation
werf.io/ownership: anyone
建议 Nelm 用户尽量避免使用 Helm hooks,这样简化 chart、增强资源灵活性、加快发布速度。但如果要兼容原生 Helm,使用 hooks 仍可接受。
4. 高级资源跟踪
Helm 3 支持简单的资源就绪等待。Helm 4 用 kstatus 改进了准确度,但无根本改变。
Nelm 具有自己的高级资源跟踪系统,相比 Helm 4:
- 检测资源就绪更准确
- 不仅跟踪就绪,还能判断资源是否存在,检测探针失败等错误
- 支持热门自定义资源的就绪规则
- 对其他自定义资源用启发式方法判断就绪,误判少
- 部署时在终端实时显示状态、错误、日志和事件
无需配置即可使用,支持通过命令行和注释调优或关闭。
5. 加密 values.yaml 及其他文件
Helm 本身不支持 chart 内的加密文件,这由 helm-secrets 插件提供。
Nelm 原生支持加密 values 文件和 chart secrets 目录内的任意文件。操作更简单。
创建密钥和加密文件示例:
NELM_SECRET_KEY=$(nelm chart secret key create)
nelm chart secret values-file edit secret-values.yaml
然后像普通值一样使用:
# templates/secret.yaml
kind: Secret
stringData:
mySecret: {{ .Values.mySecretValue }}
nelm release install -n foo -r bar
6. 发布计划
Nelm 内置类似 helm diff 的功能。nelm release plan install 命令精确显示下一次发布将对集群资源做的变更。不同于 helm diff,Nelm 计划基于 Server-Side Apply 更新的资源操作计划,而非 3-Way Merge。
未来将支持用单命令创建保存计划(--save-plan),再用另一命令执行(--use-plan),确保操作完全可控。Helm 和 helm diff 目前无法实现此功能。
Nelm 缺少的功能
- 不支持 Helm 3 CLI 插件。它们依赖 Helm CLI 命令结构、选项和日志渲染,兼容性差。我们计划在 Nelm 内置实现最受欢迎的插件功能,如 helm diff 和 helm secrets。
- 不支持 post-renderers。计划推出 Go 模板替代方案,并内置资源 patch 功能,无需外部插件。详见 issues [#54](javascript:;) 和 [#115](javascript:;)。
- 目前无法与 Argo CD 和 Flux 结合,后续通过 Nelm operator 实现,相关 CR 会通过 Argo CD、Flux 或其它 GitOps 工具部署。
- Helmfile 和 Helmwave 不兼容 Nelm,计划实现 Nelmfile,方便 CLI 原生支持。Helmwave 项目考虑切换到 Nelm。
Helm 4.0 发布后 Nelm 的未来
Nelm 是 werf 的部署引擎,werf 已被 20,000+ 项目使用。Nelm 还在积极集成到 Deckhouse Kubernetes Platform 等产品中,发展前景稳固。
Helm 4.0 并未带来实质变化。凭借早期对新功能的聚焦,Nelm 功能领先且持续进步。过去一年稳定了 Nelm v1,重构了代码库,增加了诸多功能。未来将有两名全职开发加入,社区活跃度也在提升。
未来规划
未来半年计划发布 Nelm v2,迁移到 Helm 4 代码库,发布 Nelm operator 以支持 Argo CD 和 Flux。明年计划推出 Go 模板替代方案(现提议用 TypeScript 实现)、chart patch 和直接从 Git 下载 chart。
项目团队表示,会继续积极开发 Nelm,就像过去九年支持 werf 一样。


