前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Terraform管理Kubernetes资源

使用Terraform管理Kubernetes资源

作者头像
DevOps云学堂
发布2024-05-20 14:23:36
1300
发布2024-05-20 14:23:36
举报
文章被收录于专栏:DevOps持续集成DevOps持续集成

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DevOps云学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么Terraform是配置Kubernetes集群的好工具:
  • 先决条件:
  • 第 1 步:设置 Terraform 配置
  • 第 2 步:定义 Kubernetes 资源
  • 第 3 步:初始化工作目录
  • 第 4 步:创建 Terraform 计划
  • 第 5 步:运行 Terraform apply
  • 第 6 步:验证资源
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档