Helm 和 Kustomize 有什么区别?

What is the difference between Helm and Kustomize?

我使用 Kubernetes 和 Helm 有一段时间了,现在第一次接触 Kustomize。

但是Kustomize和Helm到底有什么区别呢?

捆绑服务、部署等 K8s 元素的解决方案是否完全不同?或者同时使用 Helm 和 Kustomize 是否有意义?

几乎所有。就像问 Apache 和 Nginx 之间有什么区别 :) 他们做的工作大致相似,但量化差异是不可能的。

简而言之,Helm 是一个基于去中心化模型的模板驱动系统,用于图表共享。 Kustomize 基于 YAML 数据的深度合并和其他结构化转换。

有些情况下两者同时使用是合理的,例如将 helm 模板的输出馈送到 kustomize 以进行叠加。

描述差异的最佳方式是将它们称为不同类型的部署引擎。一种是 模板引擎,一种是叠加引擎

那么这些是什么?好吧,当您使用模板引擎时,您会创建文件的样板示例。从那里,您可以使用已知过滤器抽象出内容,并在这些抽象中提供对变量的引用。这些变量通常被抽象到另一个文件,您可以在其中插入特定于您的环境的信息然后,在运行时,当您执行模板引擎时,模板被加载到内存中,所有变量都与其占位符交换。

这在一些细微的方面与覆盖引擎不同。通常是关于信息如何进入配置示例。请注意我是如何使用 examples 这个词来代替 templates 的。这是故意的,因为 Kustomize 不使用模板。相反,您创建一个 Kustomization.yml 文件。然后这个文件指向两个不同的东西。您的 BaseOverlays。在运行时,您的 Base 被加载到内存中,如果存在任何匹配的 Overlay,它们将合并到您的 Base 配置之上。

后一种方法可以让您更轻松地将配置扩展到大量变体。想象一下,为 10,000 种不同的配置维护 10,000 组不同的变量文件。现在想象一下,维护一个可以以任何组合或排列继承的模块化和小型配置的层次结构?它将大大减少冗余并大大提高可管理性。

另一个需要注意的细微差别是项目的所有权。 Helm 由第三方运营。 Kustomize 由 Kubernetes 团队直接开发。事实上,Kubectl 直接支持 Kustomize 功能。您可以像这样构建和执行 Kustomize 项目:kubectl apply -k DIR。但是,嵌入在 kubectl 二进制文件中的 kustomize 版本已经过时并且缺少一些新功能。

Kustomize 中还有其他一些改进,这些改进虽然较小,但仍值得一提。它可以引用来自 Internet 或其他非标准路径的库。它支持生成器根据文件和字符串文字自动为您构建配置文件。它支持强大且精细的 JSON 补丁。它支持跨配置文件注入元数据。

在下面的评论中添加了以下链接以进行更多比较:

两者各有利弊。让我们看看这个 table

Helm 对​​于打包、移植和安装定义明确的应用特别有用,而 Kustomize 最适合修改现有的 Kubernetes 应用。

事实上,Kustomize 和 Helm 提供了独特的特定优势,最好的做法是同时使用这两个工具。