Terraform vs Kubernetes - 你需要知道的一切
艾莉·奥巴雷 如果没有自动化,推出新产品或改进现有基础设施通常是一项艰巨的任务。幸运的是,有许多自动化工具可以让您的项目生命周期更有效率。 本文将探讨两种流行的自动化工具,Terraform 和 Kubernetes。在这篇文章中,您将了解每种工具,以及它们之间的异同——以及它们如何共同构成强大的组合。 地形 Terraform是由HashiCorp构建和管理的开源工具。 Terraform 允许
艾莉·奥巴雷
如果没有自动化,推出新产品或改进现有基础设施通常是一项艰巨的任务。幸运的是,有许多自动化工具可以让您的项目生命周期更有效率。
本文将探讨两种流行的自动化工具,Terraform 和 Kubernetes。在这篇文章中,您将了解每种工具,以及它们之间的异同——以及它们如何共同构成强大的组合。
地形
Terraform是由HashiCorp构建和管理的开源工具。 Terraform 允许您使用代码来定义、配置和维护基础架构,该框架称为基础架构即代码。 Terraform 使您能够安全高效地开发、自动化和版本化任何基础架构(无论其部署在何处)。
您可以通过 Terraform 中的声明性配置文件规划和启动数百种资源,包括计算、网络和存储节点。
为什么选择 Terraform
当您需要重复配置资源以部署大型系统时,Terraform 是首选工具。 Terraform 允许您创建一个高级基础设施描述,然后使用它来生成和执行计划以匹配任何所需的最终状态,所有这些都来自一个工作流。该工具还可以在需要时快速重新配置基础架构配置更改。
Kubernetes
Kubernetes,有时缩写为 K8s,是一个行业领先的开源容器编排工具,用于运行和维护生产服务和工作负载。由谷歌开发,2014 年捐赠给云原生计算基金会并开源。 Kubernetes 通过跟踪其状态来管理容器化应用程序。
Kubernetes 在应用程序和容器生命周期中提供细粒度控制,尤其是在动态环境中。使用控制器可以简化 pod 跟踪、可用性和部署等任务,控制器是监控 Kubernetes 集群并根据需要进行更改以保持预期状态的控制循环。
为什么选择 Kubernetes
Kubernetes 为构建、测试和发布/部署应用程序的过程引入了速度和可见性,并且是最流行和广泛支持的容器编排工具。它使您的容器工作负载保持运行和扩展,并监控性能以确保您的应用程序具有高可用性。
Kubernetes 还具有令人难以置信的可扩展性。开发人员可以使用 Kubernetes API 集成其他平台和应用程序(例如VMware vRealize Operations、GitLab等),以提高性能、添加功能、改进监控等。 Kubernetes 支持广泛的工作负载和应用程序框架,允许组织轻松构建和部署无状态、有状态和其他与数据相关的工作负载。
使用 Terraform
使用 Terraform,您可以在以 HashiCorp 配置语言 (HCL) 编写的人类可读配置文件中定义网络和服务器等低级资源,以及 DNS 和 SaaS 等高级资源。从这些配置文件创建的任何基础设施也可以进行版本控制、重用和共享。
例如,假设您使用 AWS 作为您的云提供商,并且您希望在特定区域创建多个给定类型的 Elastic Cloud 服务器。您需要做的就是编写一个配置文件,指定要创建的实例的类型和数量。
要使用 Terraform 配置基础架构,您需要在编写任何配置文件之前了解项目的范围。然后 Terraform 使用配置文件并连接到您的提供商的 API 以启动所需的实例。
Terraform 工作流程
Terraform 在创建、更新或销毁资源时遵循特定的工作流程。
- Write: 在这个阶段,您可以使用代码定义您希望创建的任何资源,就像您编写任何其他项目一样。资源可以像虚拟私有云中的虚拟机一样简单。下面是一个在写入阶段的简单 Terraform 配置文件。
# Create repository
$ git init test-infra && cd test-infra
Initialized empty Git repository in /.../test-infra/.git/
# Write initial config
$ vim test.tf
# Initialize Terraform
$ terraform init
Initializing provider plugins...
# ...
Terraform has been successfully initialized!
进入全屏模式 退出全屏模式
-
计划: 在这个阶段,Terraform 使用
terraform plan
命令生成一个执行对象。该对象显示将被创建、版本化或缩减的资源。 -
应用: 运行
terraform apply
命令时,Terraform 执行配置计划中脚本化的操作以创建可重现的基础架构。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Si0CxpoH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://loft .sh/blog/images/content/terraform-vs-kubernetes-tf-workflow.png)
_图片由 HashiCorp Learn提供 _
常见用例
您可以使用 Terraform 执行许多任务,但这些是最常见的一些。
跟踪基础设施
Terraform 使用状态文件跟踪您部署的资源,当要对资源进行更改时,该文件用作参考点。使用状态文件,Terraform 可以确定需要对基础架构进行哪些更改才能匹配任何所需的最终状态。
多云部署
Terraform 是一个与云无关的平台。您可以使用以 HCL 编写的配置文件来管理托管在多个云提供商中的基础架构资源。它还处理跨云依赖项。
跨多个云环境部署资源引入了健壮性和容错性。
管理多层应用程序
多层应用程序有一个工作流,它通过指定一个逻辑来为每一层执行来分离功能。每一层都被定义为资源的集合,Terraform 会自动处理每一层之间所需的依赖关系。为了确保各层之间的一致性,需要依赖项和插件,而手动安装可能具有挑战性。
Terraform 配置可确保每次都正确安装和实施这些依赖项。例如,Terraform 在配置 Web 服务器和负载均衡器之前确认数据库层的可用性。
软件定义网络
Terraform 可以与软件定义网络 (SDN) 交互,以根据其应用程序的需要自动配置网络。这使您可以从基于工单的工作流程转变为自动化工作流程,从而减少部署时间。
使用 Kubernetes
由于 Kubernetes 为您提供了编排容器化应用程序的方法,它具有很大的灵活性和可移植性。作为开发人员,您可以选择操作系统、容器运行时、CI/CD 工具、云平台等。它还允许您选择自托管或使用托管平台。
借助 Kubernetes,您可以通过自动回滚、容器自我修复、秘密管理、平台独立性和负载平衡等功能,在不停机的情况下配置高度弹性的基础架构。
Kubernetes 组件
尽管 Kubernetes 是一个复杂的系统,但它可以分解为几个基本组件。
-
Cluster: 一组运行容器化应用程序的工作机器(节点)。
-
节点: 可以运行 Pod 的虚拟机或物理机的实例。
-
Pod: Kubernetes 可以管理的计算资源的最小单位。一个 pod 可以运行容器化应用程序的单个实例。
-
控制器: 一种监视集群或任何 Kubernetes 资源状态的机制。
图片由 Kubernetes 项目提供
常见用例
您可以将 Kubernetes 用于许多常见任务。本节将讨论一些最常见的用例。
跨多个主机编排容器
因为它独立于平台,Kubernetes 可以跨多个物理机或云实例托管您的容器应用程序。它还维护一个故障转移监视层以确保高可用性。
管理计算资源
运行单个专用 Kubernetes 集群通常比运行多个单独的服务器更便宜。此外,管理这样的集群比管理运行多个服务器的不同主机更容易。
运行 CI/CD 平台
Kubernetes 已成为 CI/CD 方法的主要部分,并且是运行 CI/CD 平台的首选选项,例如Jenkins、Spinnaker和Drone。只要 CI/CD 平台可以打包在一个容器中,Kubernetes 就可以运行它们。
存储编排
Kubernetes 支持动态存储卷配置。您可以从您选择的任何平台附加存储系统,包括本地存储、云存储和网络存储。
服务发现和负载均衡
Kubernetes 通过集群的 DNS 端点将容器集群服务暴露给其他平台。如果集群的网络流量很高,Kubernetes 可以负载均衡和分配流量,以保持部署的实例稳定和可用。
Terraform和Kubernetes的异同
在本节中,您将了解这两种工具之间的一些异同。重要的是要注意,这并不是试图确定哪种工具“更好”,因为它们的用途非常不同。 Kubernetes 是一个容器工具,而 Terraform 是一个基础设施工具。应用程序和实现的差异为开发人员创造了利用这两种工具的机会,从而形成了一个高度弹性的系统。
同时利用 Terraform 和 Kubernetes
配置 Kubernetes 集群是一项复杂的任务,尤其是在涉及多个云提供商时。在这种情况下,像 Terraform 这样高度独立于云的工具会派上用场。
尽管您可以使用kubectl
来管理 Kubernetes 资源的完整生命周期,如 YAML 文件中所述,但使用 Terraform 进行编排提供了一些好处。
通过诸如 Terraform 之类的描述性低代码工具,应用程序配置、部署管道,甚至 Kubernetes 中的扩展选项都变得容易,无论所涉及的平台如何。由于 Kubernetes 也是高度声明性的,因此 Terraform 和 Kubernetes 确实相得益彰。
Terraform 可用于管理 Kubernetes 基础架构,帮助您编排应用程序并大规模运行它们。这缓解了运行 Kubernetes 的一些挑战,包括检测 配置漂移,即计划内或计划外的更改等问题。
例如,如果你更新一个资源,比如删除它而不改变原来的 YAML 文件,Kubernetes 不会警告你。为了解决这个问题,您可以集成 Terraform 来帮助管理您的 Kubernetes 资源。 Terraform 工作流程,特别是在计划和应用阶段,能够检测配置更改,并让您有机会在将更改应用到下一个编排之前查看更改 - 这是kubectl
无法做到的。
通过 Terraform 定义 Kubernetes 资源需要提供者来管理 Kubernetes API 和执行资源配置。使用 Terraform 配置 Kubernetes 资源的一种常见方法是使用Kubernetes-Terraform 提供程序。使用 Terraform,您可以在许多流行的服务上编排集群,包括Amazon Web Services、Azure和Google Cloud。
相似之处
尽管它们用于非常不同的任务,但这两种工具之间有一些主要的相似之处。下图是这些相似之处的简化概述。
工具
资源
云
句法
可扩展性
自动化
地形
开源
支持多个云提供商
声明性命令 (HCL)
高度可扩展
支持 CI/CD 管道
Kubernetes
开源
支持多个云提供商
声明性命令(YAML 或 JSON)
高度可扩展
支持 CI/CD 管道
无代理操作
Terraform 和 Kubernetes 都不需要安装额外的代理才能正常运行。 Google Cloud、AWS 和 Azure 等平台负责将代理软件安装、管理和发布到您需要配置的部分资源中。
声明式方法
Terraform 模板是声明性的HCL文件,将基础设施定义为所需的最终状态。同样,Kubernetes 模板被编写为声明性YAML文件,最终产品是声明性部署对象。
这些声明性模板使您的 Terraform 和 Kubernetes 代码库更小、可重用且易于理解,因为它们在抽象逻辑和事件序列的同时捕获基础设施工作负载的完整状态。
版本控制
这两种工具都与 GitHub 等版本控制系统无缝集成,提供单一视角来查看配置中任何更改的状态和影响。
跨平台操作
您可以在本地裸机、OpenStack 甚至公共云上运行 Kubernetes 和 Terraform。这两种工具都利用了来自多个环境的 API,避免了供应商锁定问题。
状态管理
Terraform 和 Kubernetes 存储状态和集群来自您定义的配置的基础设施数据。您可以将资源与状态数据中的配置联系起来,并创建、更新或推送更改以管理您的基础架构。
Terraform 在名为100211 terraform.tfstate 100212 100210
的配置文件中存储基础设施对象的表示形式,以及它们的相互依赖关系和绑定。另一方面,Kubernetes 使用kubectl和Kubernetes 控制平面来主动管理每个对象的状态,将其与预配置的所需最终状态相匹配。
管理集群
Kubernetes 内置了很多工具,比如kubectl
,支持管理Kubernetes 集群对象的不同方式。但是,由于 Kubernetes 所需的专业知识水平,组织管理这些对象可能具有挑战性。托管 Kubernetes 选项,例如kubestack等第三方工具,可以帮助应对这一挑战。
虽然通常建议使用Kubernetes 原生工具通过 API 调用来管理集群对象,但通过 Terraform 工具管理相同的对象可以提供优势。一些开发人员更喜欢使用 Terraform提供程序,因为 Terraform 提供了单一的供应语言和统一的工作流程。这允许用户从单点管理集群基础设施和服务。
另一方面,一些开发人员认为提供程序增加了不必要的复杂性。即使提供商将 Kubernetes 资源集成到 Terraform 中,由于需要将每个 Kubernetes 资源的模式转换为 Terraform 模式,以 Terraform 配置语言维护 Kubernetes 资源可能会很棘手。
如果您的团队拥有 Kubernetes 集群管理所需的时间和技术知识,那么使用原生 Kubernetes 工具可能是您的正确选择。如果您对以更少的开销管理 Kubernetes 集群更感兴趣,您最好考虑为 Kubernetes 使用 Terraform 提供程序。
差异
尽管它们有很多相似之处,但这些工具也有一些主要区别。下表是这些差异的简化摘要。
工具
配置语言
工作流程
类型
终端工具
地形
盐酸
简单的
基础设施即代码工具
地形 CLI
Kubernetes
YAML
复杂的
编排
库贝尔
焦点
Terraform 专注于编码应用程序所依赖的资源,而 Kubernetes 用于自动化容器任务。
配置语言
Terraform 通过 Hashicorp 配置语言或 HCL 定义声明性对象。使用 HCL 文件,您可以创建将跨多个云平台运行的资源。另一方面,Kubernetes 将声明性对象定义为 YAML 或 JSON 文件,用于说明如何定义和管理 Kubernetes 对象。 YAML 在编写配置文件时比 JSON 更受欢迎,因为它对用户更友好,但出于此目的,它们可以互换使用。
资源创建
Terraform CLI 是 Terraform 的命令行界面,支持子命令和开关,例如terraform plan
和terraform apply
。Terraform 使用 CLI 运行命令来执行和管理声明性配置以创建任何所需的资源。
Kubernetes 有自己的用于操作容器集群和 Kubernetes 资源的命令行工具:kubectl。您可以将 kubectl 用于资源创建任务,例如为容器分配内存和 CPU、创建节点和部署应用程序。
结论
在本文中,您了解了 Terraform 和 Kubernetes 这两个工具,并检查了这些工具之间的异同。您已经看到 Terraform 使用单一框架在各种云平台中以声明方式自动化资源,而 Kubernetes 则介入为您的容器环境编排资源管理、部署和负载平衡。您还了解了这两个自动化工具如何协调工作,允许您使用 Terraform 创建和部署 Kubernetes 资源。
在项目中协调这两个工具后,您将能够更好地自动化基础设施、应用程序部署、监控等。
照片由Aaron Chavez拍摄于Unsplash
更多推荐
所有评论(0)