使用 Terraform 创建 Kubernetes (k8s) 资源涉及将基础设施定义为代码。这允许您的部署实现自动化、版本控制和可重复性。在这里,我将指导您使用 Terraform 创建一些常见的 Kubernetes 资源:命名空间、部署和服务。
为什么Terraform是配置Kubernetes集群的好工具:
- Terraform 允许用户在代码中维护 Kubernetes 集群定义。
- 它对较低的底层基础设施配置使用相同的声明性语法。
- 使用 Terraform,您可以通过变量修改 Kubernetes 集群。
- 可以在应用所做的更改之前对 Kubernetes 集群进行修改。
- Terraform 的一项重要优势是它能够使用相同的配置语言来配置 Kubernetes 并将应用程序部署到其中。
- 使用 Terraform,只需一个命令即可创建、更新和删除 pod 和资源,而无需检查识别这些资源的 API。
- Terraform 承认资源之间的关系,并对代码中的基础设施进行模块化。
- Terraform 缩短了产品交付时间,因为它有助于解决灾难恢复时间和发布问题。
先决条件:
- 正在运行的 Kubernetes 集群
- 安装和配置Terraform和kubectl
现在,让我们开始创建资源。
第 1 步:设置 Terraform 配置
- 创建 Terraform 项目目录
mkdir terraform-k8s && cd terraform-k8s
- 创建一个
provider.tf
文件来定义 Kubernetes 提供程序
terraform {
required_providers {
kubernetes = {
source = "hashicorp/kubernetes"
}
}
}
provider "kubernetes" {
config_path = "~/.kube/config"
}
注意:确保更新配置文件的路径
第 2 步:定义 Kubernetes 资源
- 创建一个
namespace.tf
文件来定义 Kubernetes 命名空间。
resource "kubernetes_namespace" "demo" {
metadata {
name = "demo-namespace"
}
}
- 创建
deployment.tf
用于部署应用程序的文件。
resource "kubernetes_deployment" "demo" {
metadata {
name = "demo-deployment"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
replicas = 3
selector {
match_labels = {
app = "demo"
}
}
template {
metadata {
labels = {
app = "demo"
}
}
spec {
container {
image = "nginx:latest"
name = "demo-deployment"
}
}
}
}
}
- 创建一个
service.tf
文件来公开部署。
resource "kubernetes_service" "demo" {
metadata {
name = "demo-service"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
selector = {
app = "example"
}
port {
port = 80
target_port = 80
}
type = "LoadBalancer"
}
}
- 创建一个
configmap.tf
文件来定义配置映射。
resource "kubernetes_config_map" "demo" {
metadata {
name = "demo-config"
namespace = kubernetes_namespace.example.metadata[0].name
}
data = {
"config.json" = jsonencode({
"key" = "value"
})
}
}
- 创建一个
secret.tf
文件来定义 Kubernetes Secret。
resource "kubernetes_secret" "demo" {
metadata {
name = "demo-secret"
namespace = kubernetes_namespace.example.metadata[0].name
}
data = {
"password" = base64encode("supersecret")
}
}
注意:使用 Kubernetes 本机密钥而不是使用外部密钥或密钥存储 csi 驱动程序并不是一个好的做法
- 创建一个
pvc.tf
文件来定义 PersistentVolumeClaim。
resource "kubernetes_persistent_volume_claim" "demo" {
metadata {
name = "demo-pvc"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
access_modes = ["ReadWriteOnce"]
resources {
requests = {
storage = "10Gi"
}
}
}
}
- 现在,让我们修改部署以挂载
ConfigMap
和Secret
。
resource "kubernetes_deployment" "demo" {
metadata {
name = "demo-deployment"
namespace = kubernetes_namespace.example.metadata[0].name
}
spec {
replicas = 3
selector {
match_labels = {
app = "demo"
}
}
template {
metadata {
labels = {
app = "demo"
}
}
spec {
container {
image = "nginx:latest"
name = "demo"
volume_mount {
mount_path = "/etc/config"
name = "config"
}
volume_mount {
mount_path = "/etc/secret"
name = "secret"
read_only = true
}
}
volume {
name = "config"
config_map {
name = kubernetes_config_map.example.metadata[0].name
}
}
volume {
name = "secret"
secret {
secret_name = kubernetes_secret.example.metadata[0].name
}
}
}
}
}
}
第 3 步:初始化工作目录
terraform init
在工作目录中运行命令。它将下载所有必要的提供程序和所有模块,并初始化后端。
第 4 步:创建 Terraform 计划
terraform plan
在工作目录中运行命令。它将给出执行计划。
第 5 步:运行 Terraform apply
- 在工作目录中运行
terraform apply
命令,它将在AWS上创建所有必需的资源。
第 6 步:验证资源
- Terraform 应用更改后,验证资源是否已正确部署
kubectl get all --namespace=demo-namespace
现在,您已经学习了如何使用 Terraform 创建各种 K8s 资源。您现在可以使用它并根据您的需要进行相应的修改。