Helm 与 Terraform:Kubernetes 管理工具选型指南
容器化的广泛采用催生了高效管理、调度和控制 Kubernetes(K8s 或 kube)集群的需求。市场上虽有多种与 K8s 环境交互的工具,但很少有选项能提供比 Helm 和 Terraform 更强大的能力。
本文是Helm 与 Terraform 的正面交锋对比。我们将分析两款供应工具的优缺点,解释它们在管理 K8s 部署方面的能力,帮助您为开发团队选择合适的工具。
Terraform:核心特性
Terraform 是一款开源基础设施即代码(IaC)工具,允许团队通过代码管理和自动化基础设施、平台和服务。该工具帮助工程师快速、轻松地:
- 启动虚拟机和容器。
- 配置服务器。
- 创建安全方案和控制。
- 添加或移除用户并设置权限。
- 管理云资源。
- 安装和管理 Docker 容器。
2017 年,Terraform 创建者 HashiCorp 发布了 Kubernetes Provider。因此,该工具获得了跨任意数量云服务商管理 K8s 集群的能力。
Terraform 在供应基础设施或管理 Kubernetes 时依赖声明式语言。工程师无需定义搭建基础设施的每个步骤。相反,开发者提供期望的最终状态,工具规划如何供应环境。例如,您可以为虚拟机、K8s 集群、VPC 和特定防火墙编写一组参数,而无需提供供应指令。
声明式配置文件有助于团队:
- 轻松调整文件以适应基础设施变更,无需编辑指令。
- 保持文件简洁短小。
- 快速编辑配置。
- 仅通过查看配置文件即可了解当前配置。
工程师请求供应后,命令 terraform plan 指示工具将现有设置(或首日空状态)与期望基础设施对比并制定计划。命令 terraform apply 然后通过云服务商 API 启动资源。
Terraform 是 DevOps 团队的热门选择,因工程师可利用它在 CI/CD 流水线中快速启动和编辑环境。
Terraform 主要特性
- Kubernetes Provider,支持以单一工具管理基础设施和部署。
- 使用声明式语言。
- IaC 方法,允许工程师像对待其他代码一样描述、处理和版本化基础设施。
- 可与云服务商 API 集成,实现平滑、高效、安全的供应。
- 适用于任何基于云的部署,无论公有、私有、混合还是多云。
- 不可变基础设施:替换服务器而非修改(简化运营,减少错误、威胁和配置漂移)。
- 可自动应用
changesets以节约资源并避免错误。 - 先进的漂移检测能力,始终展示当前状态与期望状态的差异。
- 可插拔设计,团队可自定义配置并添加能力。
- 工具理解资源间关系,有助于调度并将 Bug 降至最低。您还可以构建所有资源的图谱。
Helm:核心特性
Helm 是 Kubernetes 包管理器,非常适合向集群部署可重复的应用和服务。该工具允许用户通过Helm Charts 管理应用,简化 K8s 环境的定义、安装和升级。
Helm Charts 是文件和模板的包,可转换为 Kubernetes 清单文件。Chart 可复用,可包含基于 YAML 的模板:
- 不同的部署。
- ConfigMaps。
- Services。
此外,您可将 Chart 定义为依赖或嵌套 Chart 以获得更大灵活性。通过单一命令行界面(CLI)管理 Chart,简化了操作。虽然大多数 Chart 面向公众开放,但企业常编写自定义 Chart 供内部专用。
Helm 架构简洁,包含客户端和集群内的 Tiller 服务端:
- Helm Client 提供 CLI,供用户操作 Helm Charts 并与 Tiller 服务端交互。客户端允许用户执行安装、升级、回滚 Chart 等操作。
- Tiller Server 运行于集群内,与 K8s API Server 交互以安装、升级和移除 Kubernetes 资源。
Helm 优势众多,包括:
- 在不同环境中部署和管理 K8s 清单。
- 将复杂应用打包在一起。
- 批量回滚或升级多个对象。
- 快速更改配置参数。
- 单命令部署到多个环境。
Helm 及其模板引擎非常适合依赖 K8s 资源的 CI/CD 流程。工程师无需为每个微服务编辑文件,只需定义标准蓝图并用占位符替换动态值。团队随后创建 Chart,即可用一条命令在不同集群上重新部署同一应用。
Helm 主要特性
- 使用 Helm Charts,可复用模板快速供应基础设施和管理 Kubernetes 资源。
- 简化集群管理,轻松处理应用依赖和部署实例。
- 部署在集群内的 Tiller Server 允许用户直接与 Kubernetes API 交互。
- 支持跟踪后续发布版本。
- 支持批量回滚或升级多个对象。
- Chart 升级和卸载流程简易。
- 支持在私有、公有和混合云上管理容器。
Terraform 与 Kubernetes:优缺点
Terraform 的 Kubernetes Provider 提供诸多优势,但该能力与 Helm 相比仍相对年轻。偶发的 Bug 和功能缺失带来一些挑战。
Terraform 优点
- 可使用同一工具和代码库管理基础设施和集群。
- 开发者可用同一语言供应 Kubernetes 架构并部署应用到集群。
- 可将资源调度器设为 Provider。
- 拥有规划阶段,可在应用变更前预览操作结果。
- Terraform Kubernetes Provider 拥有强大社区支持。解决 K8s 问题通常只需几次 Google 搜索。
- 已熟悉 Terraform 的团队可快速上手管理 Kubernetes 集群。
Terraform 缺点
- Terraform Kubernetes Provider 仍相对较新。
- 缺乏对 Beta 对象的支持,增加了管理 K8s 集群内应用和资源的复杂性。若您使用 Beta 资源(
daemonset、statefulset等),采用 Terraform 将面临挑战。 - 若多个模块具有基于 Provider 的依赖,管理困难。
- 不完全支持 Google Kubernetes Engine (GKE)。
- 不在 K8s 集群内安装任何组件,因此无法实时管理运行中的 Pod。
了解更多关于 Terraform 与 Kubernetes 及其差异的信息,请阅读我们的文章《Terraform vs Kubernetes》。
Helm 与 Kubernetes:优缺点
与 Terraform 类似,Helm 提供一系列 K8s 优势,且其 Kubernetes 能力已相当成熟。但企业也应考虑使用 Helm 的少数负面因素。
Helm 优点
- Helm 对 K8s 的支持成熟且功能丰富,采用过程平滑。
- 拥有庞大的预构建仓库,提供各类应用和服务的实用 Chart。
- 可复用 Chart、原地升级和自定义更新钩子简化了复杂应用管理。
- Tiller Server 运行于 K8s 集群内并通过直接 API 调用交互。
- Tiller 可高效管理运行时资源。
- 回滚简单易行。
- 高级构造(流控、管道等)支持灵活部署模板。
- 允许定义变量并在不同环境和集群部署应用。
- Helm Charts 的灵活性使团队能在 Kubernetes 中标准化模板。
- 拥有丰富的用户社区和行业巨头支持(Microsoft、Google、Bitnami)。
Helm 缺点
- Helm 比 Terraform 更复杂,在 K8s 部署中承担相当大的责任。
- 无先前经验的团队学习 Helm 可能耗时较长。
- 团队需为每个项目构建新镜像以避免命令执行混淆。
- 虚拟机容量对容器伸缩至关重要。
Helm 与 Terraform:对比表
Helm 和 Terraform 作为开源工具,有许多相似之处,均允许工程师:
- 以代码形式描述和维护 K8s 对象。
- 在各层级和环境中使用和覆盖变量。
- 从多种来源安装(本地目录、Git 仓库等)。
- 设置空运行以在执行前查看操作结果(Helm 有
--dry-run标志,Terraform 有plan子命令)。 - 访问精选包列表。
- 寻求活跃用户社区帮助。
- 享受所有主流云服务商支持。
尽管相似,两者的差异使其适用于不同场景。下表展示 Terraform 与 Helm 的主要区别。
| Terraform | Helm |
| 相对较新的 Kubernetes Provider(但快速改进中) | 成熟工具,经验证的 K8s 能力 |
| 不在 Kubernetes 集群内安装任何组件 | 在集群内安装 Tiller Server 并连接 K8s API |
| 可安装 Kubernetes 集群 | 无法安装 Kubernetes 集群 |
| 依赖模块实现模块化 | 依赖子 Chart 实现模块化 |
| 使用 JSON/HCL 文件格式描述和维护 Kubernetes 对象 | 使用标准 K8s 清单和 Go 模板描述和维护 K8s 对象 |
| 缺乏 Beta 资源支持,使在已建立环境中切换到 Terraform 复杂 | 对 K8s 支持更成熟,采用更直接 |
| 运行时选项有限 | Tiller 提供丰富的运行时能力 |
| 支持环境变量 | 环境变量选项有限 |
| 注册表中无适用于 Kubernetes 的 Terraform 模块 | 稳定和孵化器 Chart 提供丰富包集 |
| Kubernetes Provider 尚不处理自定义资源 | 可管理自定义资源 |
| 回滚复杂但资源占用少 | 回滚容易但需要更多资源 |
Helm 与 Terraform:协同使用
Helm 和 Terraform 并非互斥,可在同一 K8s 部署中同时使用。两个平台能力广泛,工程师可:
- 使用 Terraform 创建和管理 Helm 资源。
- 在 Terraform 中使用 Helm 部署集群相关应用。
- 使用 Terraform 将 Helm Chart 部署到预供应的 Kubernetes 集群。
大多数同时依赖两者的团队倾向于用 Terraform 管理 K8s 集群,用 Helm 管理进入集群的资源。不过,双工具环境会增加项目复杂性,建议在搭建多工具环境前先考虑单平台方案。
Helm 与 Terraform:K8s 工具链中的两大强力选项
Terraform 和 Helm 都是强大的工具,让 Kubernetes 管理更轻松、快速、可靠。但上述细微差别使每个平台更适合不同用例,请选择与您的团队和项目更契合的工具。
继续了解 IaC 工具及其对比,请查看我们的 Ansible、Terraform 和 Puppet 对比文章。
云计算