写在开篇
几年前应用过 terraform 用于治理 VMware 和 OpenStack,并做了一些自动化相干的事件。而到了明天是云原生的时代,最支流、最牛逼的开源容器编排平台莫过于 K8S 了。就在昨天,忽然又想起了 terraform。时隔近 3 年多了,再次接触它的时候,它的变化很大,反对的 provider 更多、更强悍了。于是,打算再次对它下手,玩一玩它的 Kubernetes provider,体验一下它的:轻松地定义、部署和治理 Kubernetes 上的基础架构和应用程序的快感。
Terraform 是什么鬼
Terraform 是一个开源的基础设施即代码(Infrastructure as Code)工具,能够帮忙用户自动化创立、变更和治理基础架构资源。应用 Terraform,用户能够通过编写简略的申明式语言来形容他们须要的基础架构资源,而后 Terraform 会主动实现创立、更新和删除等操作,从而简化了基础架构治理的过程。
Terraform 反对多种基础架构提供商,例如 Amazon Web Services(AWS)、Microsoft Azure、Google Cloud Platform(GCP)、OpenStack、VMware 等,以及多种基础架构资源,例如虚拟机、网络、存储、负载平衡、数据库等。用户能够在一个 Terraform 配置文件中定义他们须要的资源,而后应用 Terraform 命令行工具来执行这些操作。
Terraform 的次要长处包含:
- 简化基础架构治理 – 应用 Terraform,用户能够通过编写简略的配置文件来治理基础架构资源,从而简化了基础架构治理的过程。
- 自动化基础架构 – 应用 Terraform,用户能够自动化创立、更新和删除基础架构资源,从而进步了生产力和效率。
- 可重复性 – 应用 Terraform,用户能够确保基础架构资源的配置是可反复的,从而缩小了谬误和不一致性。
- 多云反对 – Terraform 反对多种基础架构提供商,从而让用户能够在不同的云环境中应用雷同的工具和流程来治理基础架构资源。
记住,Terraform 是一个功能强大的基础设施即代码工具,能够帮忙你自动化创立、变更和治理基础架构资源,从而进步生产力和效率。
Terraform 能够对 Kubernetes 做什么
- 在 Kubernetes 上部署应用程序 – Terraform 能够应用 Kubernetes provider 来定义和治理 Kubernetes 资源,例如部署、服务和 Ingress 等,从而轻松在 Kubernetes 上部署应用程序。
- 治理 Kubernetes 集群 – Terraform 能够应用 Kubernetes provider 治理 Kubernetes 集群中的节点、命名空间、角色和权限等资源,从而简化集群治理工作。
- 在 Kubernetes 上治理长久化存储 – Terraform 能够应用 Kubernetes provider 治理 Kubernetes 中的存储类、卷和 PVC 等资源,从而简化在 Kubernetes 上治理长久化存储的工作。
- 在 Kubernetes 上管理网络 – Terraform 能够应用 Kubernetes provider 治理 Kubernetes 中的网络策略、服务负载平衡和 Ingress 等资源,从而简化在 Kubernetes 上管理网络的工作。
- 在 Kubernetes 上治理配置 – Terraform 能够应用 Kubernetes provider 治理 Kubernetes 中的 ConfigMap 和 Secret 等资源,从而简化在 Kubernetes 上治理配置的工作。
综上所述,Terraform 和 Kubernetes 能够联合应用来简化在 Kubernetes 上管理应用程序和基础架构的工作,并进步生产力和效率。
装置 terraform
Terraform 反对多个操作系统,能够从官网下载相应的二进制文件,或应用包管理工具进行装置。具体装置步骤请参考 Terraform 官网的装置指南,上面给出一个在 linux 环境下的装置演示,它还反对 Windows 哦,不过我没玩过。
下载实用于您零碎的 Terraform 压缩包,例如:
wget https://releases.hashicorp.com/terraform/1.1.4/terraform_1.1.4_linux_amd64.zip
解压缩下载的文件:
unzip terraform_1.1.4_linux_amd64.zip
将解压缩的二进制文件复制到零碎 PATH 能够拜访的目录中:
mv terraform /usr/local/bin/
验证 Terraform 是否已装置:
terraform --version
如果您看到 Terraform 的版本信息,则示意装置胜利。当初,您已胜利在 Linux 零碎上装置了 Terraform。
装置 Kubernetes provider 插件
- 下载 Kubernetes provider 插件 下载最新版本的 Kubernetes provider 插件,能够从 Terraform 官方网站或 Github 上下载。
- 解压缩 Kubernetes provider 插件 将下载的 Kubernetes provider 插件解压缩到 Terraform 插件目录中。在 Linux 上,通常是在 $HOME/.terraform.d/plugins 目录下。
mkdir -p ~/.terraform.d/plugins
unzip terraform-provider-kubernetes_v1.22.0_linux_amd64.zip -d ~/.terraform.d/plugins
- 配置 provider 在 Terraform 配置文件中增加 Kubernetes provider 的配置信息,例如:
provider "kubernetes" {
# 配置 Kubernetes API 访问信息
host = "https://<Kubernetes API server IP>:<Kubernetes API server port>"
token = "<Kubernetes API server token>"
cluster_ca_certificate = "<Kubernetes API server CA certificate>"
}
Kubernetes provider 须要配置 Kubernetes API 访问信息,包含 API server 的地址、拜访令牌和 CA 证书。能够从 Kubernetes 集群的配置中获取这些信息。
- 运行 Terraform init 运行 terraform init 命令来初始化 Terraform 配置,并装置 Kubernetes provider 插件。
terraform init
实现上述步骤后,就能够应用 Terraform 来创立、更新和删除 Kubernetes 资源了。
terraform 连贯 k8s
在应用 Terraform 治理 Kubernetes(k8s)的基础设施时,须要应用 Terraform 的 Kubernetes Provider 来连贯 k8s 集群。
在 Terraform 中,Provider 是指连贯和治理云服务或基础设施的插件,Kubernetes Provider 则是连贯和治理 k8s 集群的插件。要应用 Kubernetes Provider,须要在 Terraform 的配置文件中指定 Provider,并提供连贯 k8s 集群所需的认证信息和 API 服务器的地址,例如:
provider "kubernetes" {config_context_cluster = "my-cluster"}
其中,config_context_cluster 参数指定了要连贯的 k8s 集群的名称。
接下来,用户能够应用 Terraform 的 Kubernetes 资源来定义 k8s 资源,例如:
resource "kubernetes_deployment" "example" {
metadata {name = "example"}
spec {
replicas = 3
selector {
match_labels = {app = "example"}
}
template {
metadata {
labels = {app = "example"}
}
spec {
container {
image = "nginx:latest"
name = "nginx"
}
}
}
}
}
以上配置将定义一个名为 “example” 的 Deployment,该 Deployment 由 3 个正本组成,每个正本都运行一个名为 “nginx” 的容器。
在应用 Terraform 连贯 k8s 集群时,用户须要留神:
- Terraform 须要连贯 k8s 集群的 API 服务器。为此,用户须要确定 k8s 集群的 API 服务器地址,并将其配置为 Kubernetes Provider 的参数之一。
- Terraform 须要连贯 k8s 集群的认证信息,包含证书、密钥和 CA 证书。这些信息能够通过 kubectl 命令行工具来获取,用户须要将其配置为 Kubernetes Provider 的参数之一。
- Terraform 中的 Kubernetes 资源与 k8s 集群中的 Kubernetes 资源是一一对应的,即每个 Terraform 资源对应一个 k8s 资源。在应用 Terraform 治理 k8s 集群时,须要放弃 Terraform 和 k8s 集群中的 Kubernetes 资源同步。
实际案例
上面给出一个最简略的场景:应用 Terraform 创立一个 Pod 并创立一个 NodePort 类型的 Service,用于将该 Pod 裸露到 Kubernetes 集群内部。
以下是一个示例配置文件:
resource "kubernetes_pod" "my-pod" {
metadata {name = "my-pod"}
spec {
container {
image = "nginx:latest"
name = "my-container"
port {container_port = 80}
}
}
}
resource "kubernetes_service" "my-service" {
metadata {name = "my-service"}
spec {
selector = {app = kubernetes_pod.my-pod.metadata.0.name}
type = "NodePort"
port {
name = "http"
port = 80
target_port = 80
}
node_port {http = 30080}
}
}
在这个配置文件中,咱们应用 kubernetes_pod 资源类型定义了一个名为 my-pod 的 Pod,应用了 nginx 镜像,并将容器端口设置为 80。
而后,咱们应用 kubernetes_service 资源类型定义了一个名为 my-service 的 Service,应用了 NodePort 类型。在 spec 中,咱们指定了 Service 的 selector 为 kubernetes_pod.my-pod.metadata.0.name,示意该 Service 将会裸露与 my-pod 相干的 Pod。
接下来,咱们定义了一个端口 http,将容器端口 80 映射到该 Service 的 target_port,并定义了一个 node_port,用于将该 Service 裸露到 Kubernetes 集群的 30080 端口。
应用这个配置文件,咱们能够在 Kubernetes 集群上创立一个 Pod 并将其裸露到集群内部。
最初的总结
Terraform 作为一种基础设施即代码工具,能够帮忙开发人员和运维人员更加轻松地治理 Kubernetes 集群,进步生产力,缩小出错率,从而晋升整个业务的稳定性和可靠性。
具体来说,Terraform 与 Kubernetes 联合能够实现以下指标:
- 基础设施即代码:应用 Terraform 治理 Kubernetes,能够将 Kubernetes 的基础架构视为代码,通过代码编写、版本控制和测试等流程进行治理,防止手动操作带来的不稳定性和谬误。
- 集群自动化:Terraform 能够自动化 Kubernetes 集群的创立、配置和治理。能够应用 Terraform 来创立 Pod、Deployment、Service 等 Kubernetes 资源,从而构建残缺的 Kubernetes 应用程序。
- 集成测试:Terraform 能够集成 Kubernetes 的测试流程,例如应用测试框架在 Pod 上运行测试,确保 Kubernetes 应用程序的正确性。
- 资源优化:Terraform 能够通过基础设施即代码的形式,让开发人员和运维人员更好地了解 Kubernetes 资源的应用状况,从而优化资源的利用率和老本。
总的来说,Terraform 能够让 Kubernetes 集群更加容易治理和保护,进步整个业务的可靠性和效率。
本文转载于 WX 公众号:不背锅运维(喜爱的盆友关注咱们):https://mp.weixin.qq.com/s/QRIGwzwBM5sj_vtxrg4VBQ