使用Terraform管理Kubernetes资源

304efba0348caf31ed3e2edbdfc0aeef.png
使用 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"
      }
    }
  }
}
  • 现在,让我们修改部署以挂载 ConfigMapSecret

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 资源。您现在可以使用它并根据您的需要进行相应的修改。


<图书推荐>

2024年发布的一本关于DevOps企业级持续集成与持续交付实战记录!

<训练营动态>

2024年第⑧期 DevOps实战训练营已经在5月18日正式开营!基于微服务架构的应用在Kubernetes环境实战!

bcbe988c3aa6217258f49d5d50abbac0.jpeg

第⑧期DevOps实战营正式发布!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值