Helm与Kustomize差异比较介绍
Kubernetes 本身提供了管理应用程序部署所需的核心工具。然而,虽然应用原始 YAML 清单是一个简单的过程,但在微服务环境中开发很快就会随着支持整个系统所需的部署数量而失控。
Helm与Kustomize有哪些区别?本文比较了两种旨在简化应用程序部署管理的流行工具 - Helm 和 Kustomize。
Helm:主要特性
Helm 是 Kubernetes 的包管理器。它通过使用 helm charts、包含使用 Go 模板语言修改的 YAML 文件的包以及来自 Sprig 库的模板函数来帮助安装和管理 Kubernetes 应用程序。
注意: Helm 是一个功能丰富的工具,可以执行本文范围之外的许多功能,例如打包、挂钩和回滚。本文重点介绍与 Kustomize 相当的 Helm 功能。要了解更多信息,请阅读我们的文章Helm 是什么?
通过使用模板和动态值,Helm 提供了在整个软件开发生命周期中微调配置的能力。
Helm与Kustomize哪个更好?随着 Helm 3 的推出,Helm 不再依赖 Tiller 进行动态配置文件生成。这消除了 Helm 2 的主要安全问题之一——默认情况下为每个有权访问 Tiller 的人授予广泛的权限。Helm 现在具有基于角色的访问控制 (RBAC) 和Kustomize资源定义 (CRD) 的特权访问管理组件。
Helm 模板的另一个有用属性是封装。Kubernetes 对象的 YAML 定义,例如 Deployment、Service、ConfigMap或Kubernetes Secret,可以封装在单个模板中。此属性有助于部署时配置。
一个简单的Helm图包括:
- 一个Chart.yaml声明图表文件。
- 一个values.yaml文件,其中包含要与模板一起使用的图表参数。
- 包含用于构建图表内容的模板文件的模板目录。
模板文件具有 YAML 文件的结构,但它还包含在部署时替换为values.yaml文件中提供的值的模板变量。
这是典型的deployment.yaml的内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.test }}
labels:
app: {{ .Values.test }}
spec:
selector:
matchLabels:
app: {{ .Values.test }}
template:
metadata:
labels:
app: {{ .Values.test }}
tier: web
spec:
containers:
- name: {{ .Values.test }}
image: {{ .Values.test }}
ports:
- containerPort: 8080
在上面的示例中,Helm 查看values.yaml文件中的test
变量值。相关的values.yaml文件包含变量定义:
test: default
根据values.yaml定义,Helm 构建以下deployment.yaml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: default
labels:
app: default
spec:
selector:
matchLabels:
app: default
template:
metadata:
labels:
app: default
tier: web
spec:
containers:
- name: default
image: default
ports:
- containerPort: 8080
在 CLI 中发出构建命令时,Helm 能够使用标志覆盖values.yaml 中的值--set
。
它还包括helm lint
检查图表问题的命令,验证它是否是根据标准设计的。
注意:要了解有关 Helm Chart 的更多信息,请阅读如何创建和部署 Helm Chart。为了让你开始使用 Helm,phoenixNAP 提供了一个可免费下载的Helm 命令备忘单。
Helm与Kustomize差异比较 - Kustomize:主要功能
Kustomize是一种使用层和补丁而不是模板来定制Kubernetes对象的工具。介绍了kustomization.yaml清单文件,用户在其中存储特定于部署的配置。
从1.14 版开始,该工具内置于kubectl中,这意味着它现在在 Kubernetes 中是本机的。但是,你也可以独立安装它。
Helm与Kustomize有哪些区别?通过 Kustomize,用户可以使用声明式方法管理任意数量的 Kubernetes 配置,每个配置都有其独特的定制。它允许开发人员定义应用程序的多个版本并在子目录中管理它们。基本目录包含通用配置,而子目录包含特定于版本的补丁。
每个目录都包含其kustomization.yaml文件,该文件指定需要对配置进行哪些更改以及应使用哪些资源。例如,下面的kustomization.yaml文件添加一个共同的标签app:test
两者deployment.yaml和service.yaml在基本目录:
commonLabels:
app: my-wordpress
resources:
- deployment.yaml
- service.yaml
然后通过在命令行中键入以下命令来应用更改:
kubectl apply -k base
如果 Kustomize 用作独立工具,则命令会有所不同:
kustomize build base | kubectl apply -f -
Helm 和 Kubernetes:优点和缺点 - Helm与Kustomize哪个更好?
优点
- Helm 提供了许多超越简单应用程序部署配置管理的功能,例如打包、挂钩和回滚。
- 它通过允许用户设置默认值来简化应用程序安装,如有必要,他们可以使用这些值进一步配置。
- Helm 为开发人员所熟知,它拥有众多用户和强大的在线支持。
- Helm 模板函数可以引入条件和循环,定义帮助器并访问 Sprig 函数库。
- 大多数常用的应用程序都可以在线获取 Helm 图表,这可以节省时间并提高生产力。
缺点
- Helm 增加了更多的抽象层,并且学习曲线陡峭。
- 它将应用程序的定制限制为预先存在的配置选项。
- 模板容易出错,尤其是在 YAML 的正确对齐方面。
- Kubernetes 本身不支持 Helm,这会产生外部依赖。
- 这往往是必不可少的。Helm 在运行时将值注入到模板中,因此如果模板发生变化,系统可能会与用户期望的不同。
- 图表仍然需要运行时自定义,这使得它们在实施 CI/CD 管道时难以管理。
- 随着时间的推移,可读性较差的模板不可避免地会导致可定制性降低。
- 由于应用程序安装过程中缺乏可见性和透明度,它存在安全问题。
Kustomize 和 Kubernetes:优点和缺点
优点
- Kustomize 使用起来很简单。
- 它是声明式的,符合Kubernetes 的理念。
- Kustomize 支持继承的基础模型,这使得它比 Helm 更好地扩展。
- 使用集成到 kubectl 中的原生版本消除了外部依赖。
- 它可以更轻松地使用现成的应用程序。
- 它只使用普通的 YAML 文件。
缺点
- Kustomize 不提供很多功能。
- 它不是为了遵循 DRY(不要重复自己)原则而设计的。
- 用户必须在kustomization.yaml 中手动声明资源和补丁,并且每当添加新文件时必须手动更新该文件。
- kubectl 中嵌入的原生版本比当前的独立版本要旧得多。
- 很难找到 Kustomize 的在线支持。
Helm与Kustomize有哪些区别:比较表
特征 | Helm | Kustomize |
---|---|---|
模板制作 | 是的 | 不 |
叠加 | 不 | 是的 |
包装 | 是的 | 不 |
验证钩子 | 是的 | 不 |
回滚 | 是的 | 不 |
原生 K8s 集成 | 不 | 是的 |
声明性质 | 主要是命令式的 | 是的 |
可见性和透明度 | 虚弱的 | 强的 |
Helm与Kustomize哪个更好:如何选择?
要决定是选择 Helm 还是 Kustomize,请考虑以下几点:
- 如果你打算自己编写所有配置,并且你对YAML 的工作原理有很好的了解,请选择 Kustomize 。虽然 Kustomize 允许你快速执行复杂的自定义,但它要求你能够可视化补丁和图层如何组合在一起。
- 另一方面,如果你希望你的开发人员能够以安全且简单的方式添加新的应用程序和服务,那么创建 Helm 图表是更好的解决方案。
- 选择 Helm 的另一个原因是需要减少花在 YAML 文件上的时间。Helm 模板具有参数,可以更轻松地理解服务的工作方式,而无需深入研究 YAML。
鉴于 Helm 和 Kustomize 都提供特定于工具的好处并相互补充,最好的做法是将这两种工具并排使用。Helm 对于打包、共享和安装定义明确的应用程序特别有用,而 Kustomize 最适合对现有 Kubernetes 应用程序进行最后修改。
Helm与Kustomize差异比较总结
Helm与Kustomize有哪些区别?本文提供了 Helm 和 Kustomize 这两个用于 Kubernetes 应用程序部署配置的工具之间的正面比较。要阅读有关有用 Kubernetes 工具的更多信息,请阅读15 个用于部署、监控、安全等的最佳 Kubernetes 工具。