在充斥着大量组件和配置的环境中,配置和管理基础架构可能会让人十分头疼。尤其是当您还需要手动完成这些操作时,或者您需要部署许多类似的环境,而每个环境只需进行些许更改。
幸运的是,基础架构即代码 (IaC) 可以帮助您解决这个难题。
对于 Kubernetes (K8S) 来说尤其如此,因为其本身就是一个完整的生态系统。
由于本文不仅面向初学者,也面向有经验的 DevOps 从业者,因此我们将从简短的背景介绍开始。如果您已了解 IaC、K8S 和 Terraform 的背景,那么请直接跳到技术部分阅读。
什么是基础架构即代码(IaC)?
与通过使用交互式配置工具的手动过程不同,基础架构即代码(IaC)是一种通过代码来管理和配置基础架构的过程。
IaC 通过定义你可以版本化、重用和共享的资源配置,让您实现基础架构的构建、更改、管理和监视,安全、一致、可重复。使用 IaC 之后,配置文件会包含基础架构的各项具体规范,这让编辑配置更容易,也能保证相同的环境每次都能得到配置。
什么是 Kubernetes?
Kubernetes(K8S) 是一个开源平台,用于在一个或多个主机上部署和管理容器化应用程序。使用 K8S, 容器管理的操作任务可自动化,且更易管理。比如部署新应用程序、推出新版本、自动扩展应用程序副本或监视应用程序活动等。
什么是 Terraform?
Terraform 是 HashiCorp 公司开发的 一种 IaC 工具。Terraform 定义用户可读的声明性配置文件中的资源和基础架构,并管理基础架构的生命周期。
配置文件使用一种类似于 JSON 的语言——HCL(HashiCorp 配置语言)语言编写。
HCL 语法简单,通过 HCL 开发运维(DevOps)团队能够轻松地跨多个云提供商和本地数据中心对基础架构进行配置和再配置。
您可在此处了解关于 Terraform 的更多信息。
在三大云提供商平台上使用 terraform 进行 K8S 集群配置
虽然市场上有许多云提供商,但在本文中,我们将重点关注三大云供应商:AWS(亚马逊网络服务)、Google Cloud(谷歌云)和 Microsoft Azure(微软智能云)。我们将在每个使用的 Terraform 上配置一个托管单节点 k8s。
我们将探索在每个云提供商上使用 Terraform 配置 Kubernetes 的复杂性,并且对其进行比较之后作一个简短的总结,以帮助您作出决策。
为更加简结明了,我们将使用一些预先准备好的代码,把重点放在研究密钥差异性上。
克隆这个包含基本 k8s 集群配置文件的 Git 存储库,其可以用于在 AWS、Azure 和 GCP 上进行配置。
clone https://github.com/omermishania/deploy-clusters-using-terraform-on-the-3-big-clouds.git
在 AWS 上使用 Terraform 对 K8S 进行配置
走查介绍
在 AWS 上使用 Terraform 来配置 K8S,您将需要五个文件:
- vpc.tf —— 使用 AWS VPC 模块定义选定区域内 EKS 集群的虚拟私有云 (VPC)、子网和可用性区域。
- eks-cluster.tf —— 使用 AWS EKS 模块定义设置 EKS 集群所需的资源和基本配置,例如所选 VPC 内的集群版本和工作组。
- security-groups.tf —— 定义 EKS 集群使用的安全组。
- outputs.tf —— 定义在执行配置计划时系统提示的输出。
- versions.tf —— 设置所需的 Terraform 版本和提供商所需的各种版本。
将创建的部分资源包括 VPC、子网、nat 网关、安全组、EKS 和节点组。AWS 的基本 Terraform 的 k8s 模块提供了广泛的网络配置选项,如配置集群自身、配置节点组、配置安全组规则、配置不同的 IAM 策略、配置自动缩放组等。
若要使用多个工作节点,只需在 eks-cluster.tf 文件中更改节点组中的节点数即可。每个集群最多可部署 30 个托管节点组,每个节点组最多可部署 450 个节点(每个集群共有 13500 个节点)。如需自动调整工作节点数,可使用 aws_autoscaling_group 资源。
配置的总平均时长约为 11 分钟,而销毁所有资源的总平均时长约为 3 分钟。
走查的先决条件:
走查
在 Git 存储库目录中,将目录更改为 AWS 目录
cd aws
编辑 vpc.tf 文件
vim vpc.tf
将区域变量值更改为将要部署的集群所需区域
项目模块初始化
terraform init
设置配置计划
terraform plan
执行配置计划
terraform apply
利用集群访问凭据更新本地 Kube 配置文件
aws eks kube-config --region <region> --name <cluster-name>
在 GCP 上使用 Terraform 对 K8S 进行配置
走查介绍
在 GCP 上使用 Terraform 配置 K8S,您将需要五个文件:
- vpc.tf 使用 GCP 提供商 为 GKE 集群定义 VPC 和子网。
- gke.tf 使用 GCP 提供商 定义 GKE 集群,托管节点池,定义集群的工作虚拟机的数量和大小。
- terraform.tfvars声明 project_id 和区域为变量,以供 Terraform 进行配置。
- outputs.tf 定义在执行配置计划时系统提示的输出。
- versions.tf 设置所需的 Terraform 版本和提供商所需的各种版本。
将创建的部分资源包括 VPC、子网、GKE 和节点池。GCP 的基本 Terraform 的 k8s 模块提供了有限的网络配置选项,如配置集群本身、配置 VPC、配置子网、配置集群自动缩放程序和节点池。
如果需要增加工作节点的数量,只需将 gke_num_nodes 变量值更改为 gke.tf 文件中所需的工作节点数量。版本 1.17 及以下的 GKE 最多可使用 5,000 个节点,版本 1.18 及以上的 GKE 最多可使用 15,000 个节点。如果您希望在需要时自动调整工作节点数,可在 google_container_cluster 资源下添加 cluster_autoscaling 块,并根据您的需求对其进行相关配置。例如:
cluster_autoscaling { enabled = true resource_limits { resource_type = "cpu" minimum = 1 maximum = 10 } }
配置的总平均时长与销毁所有资源的总平均时长都约为 8 分钟。
走查的前提
- 已配置gcloud CLI
- Terraform CLI
- 为您的谷歌云项目启用Compute Engine(计算引擎)和Kubernetes 引擎 API
走查
在 GCP Web 控制台上,添加计算管理员角色。
在 Git 存储库目录中,将目录更改为 GCP目录
cd gcp
编辑 terraform.tfvars 文件
vim terraform.tfvars
将 project_id 和区域变量值分别更改为 GCP 项目 ID 和要部署的集群区域
模块初始化
terraform init
设置配置计划
terraform plan
执行配置计划
terraform apply
利用集群访问凭据更新本地 Kube 配置文件
gcloud container clusters get-credentials $(terraform output -raw kubernetes_cluster_name) --region $(terraform output -raw region)
在 Azure 上使用 Terraform 对 K8S 进行配置
走查介绍
在 Azure 上使用 Terraform 来配置 K8S,您将需要五个文件:
- aks-cluster.tf 使用 Azure AKS 模块定义资源组,定义该资源组内的 AKS 集群,定义集群的工作虚拟机的数量和大小。
- terraform.tfvars定义 Azure appId 和密码变量来验证 Azure。
- variables.tf 声明 Azure appID 和密码为变量,以供 Terraform 进行配置。
- outputs.tf 定义在执行配置计划时系统提示的输出。
- versions.tf 设置所需的 Terraform 版本和提供商所需的各种版本。
将创建的部分资源包括资源组和 AKS。在我们正在研究的这三个供应商中,Azure 的基本 Terraform 的 k8s 模块提供的网络配置选项最少(如果使用额外的 Azure 模块,那么几乎可进行任何配置)。您可配置集群本身、自动缩放程序配置文件和节点池。
如果要增加工作节点的数量,只需编辑 aks-cluster.tf 文件,并将节点池中的 node_count 变量值更改为所需的工作节点数量或添加另一个节点池。在所有节点池中,每个 AKS 最多可使用 1000 个节点。如果您希望在需要时自动调整工作节点数,可添加 auto_scaler_profile 资源,并根据您的需求对其进行相关配置。(如果进行此操作,请勿忘记使用 Terraform’s ignore_changes functionality 来忽略对 node_count 字段的更改)。
配置的总平均时长约为 3 分钟,销毁所有资源的总平均时长约为 7 分钟。
走查的前提
走查
在 Git 存储库目录中,将目录更改为 Azure 目录
cd azure
在 Azure 上创建 Active Directory(活跃目录)服务主帐户。
az ad sp create-for-rbac --skip-assignment
输出应该是这样的:
{ "appId": "your-app-id-should-go-here", "displayName": "azure-cli-current-date-hour", "name": "http://azure-cli-current-date-hour", "password": "your-pwd-should-go-here", "tenant": "a1b2c3d4-a1b2-a1b2-a1b2-a1b2c3d4e5f6" }
在本教程中,我们只需要应用 appID 和密码值。复制并保存您的 appID 和密码值,下一步需要使用。
编辑 terraform.tfvars 文件
vim terraform.tfvars
将 appID 和密码变量的值更新为您刚才复制的值
项目模块初始化
terraform init
设置配置计划
terraform plan
执行配置计划
terraform apply
更新本地 Kube 配置文件
az aks get-credentials --resource-group $(terraform output -raw resource_group_name) --name $(terraform output -raw kubernetes_cluster_name)
结论
无论您使用什么云平台,Terraform 都可以显著改善基础架构生命周期的管理。
您可在以下任何情况下进行Kubernetes 集群配置:开发环境、生产工作负载、无状态工作负载、有状态工作负载、远程开发人员环境(而不是本地环境),甚至是在拥有不同配置的 K8S 集群上测试应用程序的临时环境中等。
对于某些实际情况来说,每一种配置都可以再优化,但是如果在 CI 过程中配置和销毁集群对您很重要,那么您可以考虑使用一个能更快完成这一操作的云提供商。如果您需要在不同环境中部署多个集群,那么使用一个除 Terraform 配置本身之外无需任何其他操作的云提供商,对您来说这可能是个不错的选择。但是,如果您认为拥有一个高规模的生产系统更重要,则可以查看在哪种云提供商里规模不那么受限。