使用Terraform管理Kubernetes资源

2024-05-20 14:23:36 浏览数 (3)

使用 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 项目目录
代码语言:javascript复制
mkdir terraform-k8s && cd terraform-k8s
  • 创建一个provider.tf文件来定义 Kubernetes 提供程序
代码语言:javascript复制
terraform {
  required_providers {
    kubernetes = {
      source = "hashicorp/kubernetes"
    }
  }
}

provider "kubernetes" {
  config_path = "~/.kube/config"
}

注意:确保更新配置文件的路径

第 2 步:定义 Kubernetes 资源

  • 创建一个namespace.tf文件来定义 Kubernetes 命名空间。
代码语言:javascript复制
resource "kubernetes_namespace" "demo" {
  metadata {
    name = "demo-namespace"
  }
}
  • 创建deployment.tf用于部署应用程序的文件。
代码语言:javascript复制
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文件来公开部署。
代码语言:javascript复制
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文件来定义配置映射。
代码语言:javascript复制
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。
代码语言:javascript复制
resource "kubernetes_secret" "demo" {
  metadata {
    name = "demo-secret"
    namespace = kubernetes_namespace.example.metadata[0].name
  }

  data = {
    "password" = base64encode("supersecret")
  }
}

注意:使用 Kubernetes 本机密钥而不是使用外部密钥或密钥存储 csi 驱动程序并不是一个好的做法

  • 创建一个pvc.tf文件来定义 PersistentVolumeClaim。
代码语言:javascript复制
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"
      }
    }
  }
}

  • 现在,让我们修改部署以挂载 ConfigMapSecret
代码语言:javascript复制
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 应用更改后,验证资源是否已正确部署
代码语言:javascript复制
kubectl get all --namespace=demo-namespace

现在,您已经学习了如何使用 Terraform 创建各种 K8s 资源。您现在可以使用它并根据您的需要进行相应的修改。

0 人点赞