【问题标题】:Multiple environments with one cluster sharing the same terraform state一个集群的多个环境共享相同的 terraform 状态
【发布时间】:2021-05-27 17:17:23
【问题描述】:

我使用 terraform-aws-modules/vpc/aws 和 Terraform 创建了 EKS 集群,我在法兰克福的每个 AZ 上使用一个具有 3 个私有子网的 VPC。我创建了两个服务(tomcat 和 psql)和部署,它们通过 LoadBalancer 公开并通过 Internet 访问。到目前为止看起来还不错。 但问题是它只是一个环境(DEV)。我想在一个 VPC 和一个集群内创建多个环境,如阶段、测试等,如何使用 terraform 来实现?我应该为每个环境创建新文件吗?这没有任何意义,但我什么都没有想到......我也在考虑工作区,但问题是新工作区需要新状态 - 这意味着我需要为每个工作区创建具有新集群的新 VPC!也许我应该将我的 terraform 文件划分为“通用”工作区之类的东西,并且对 VPC 和集群进行配置,并为每个环境创建新的工作区?您有什么想法或更好的解决方案吗?

VPC - 172.26.0.0/16 +---------------------+-------------- --------+ | | | | | Kubernetes 集群 | | +-------------------------------------------------- + | | | | | | | | | | | | | | | +-----------------+ +-----------------+ | | | | | | | | | | | | |测试环境 | |开发环境 | | | | | | +-----+ +-----+ | | +-----+ +-----+ | | | | | | |tomcat| |psql | | | |tomcat |psql | | | | | | | +-----+ +-----+ | | +-----+ +-----+ | | | | | | | | | | | | | +-----------------+ +-----------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | +-------------------------------------------------- + | | | +-------------------------------------------------- --------+

【问题讨论】:

    标签: amazon-web-services kubernetes amazon-eks


    【解决方案1】:

    可以在单个 K8s 集群中创建多个环境。您可以为此使用namespace。要从集群外部访问不同的环境,您可以为每个环境使用不同的域名。

    例如dev.abc.com 访问开发环境,test.abc.com 访问测试环境。

    【讨论】:

    • 它对我没有帮助...我已经写过 - 我使用 terraform,你想如何在一个 terraform 状态下管理 terraform 和 k8s 命名空间?假设我们有一项服务,我需要定义它应该部署在哪个命名空间上。如果我按照你的方式去,我只能使用一种环境
    • Terraform 用于维护 infra 端。您可以使用 helm 或 kustomize 等工具为您的不同环境构建 yamls
    • codefresh.io/helm-tutorial/helm-deployment-environments 这篇文章解释了使用 helm 设置多个环境
    【解决方案2】:

    您可以在其自己的状态文件中“分离 vpc”。然后为每个 EKS 集群创建一个工作区。对于 EKS,您可以通过以下两种方式之一从 AWS 数据源中提取 VPC 信息,或者从状态文件中提取。

    你的树形结构看起来像这样:

    ├── vpc
    │   ├── main.tf
    │   └── outputs.tf
    └── eks
        └── main.tf
    

    vpc/main.tf的后端设置中添加以下内容:

    terraform {
      backend "s3" {
        ...
        key                  = "vpc/terraform.tfstate"
        workspace_key_prefix = "vpc"
        ...
      }
    }
    

    eks/main.tf:

    terraform {
      backend "s3" {
        ...
        key                  = "eks/terraform.tfstate"
        workspace_key_prefix = "eks"
        ...
      }
    }
    

    将 VPC 传递到 EKS 部分:

    选项 1(按名称从 aws 数据源中提取,参考 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/vpc):

      data "aws_vpc" "selected" {
        filter {
          ...
        }
      }
    

    选项 2(从状态文件中提取):

    data "terraform_remote_state" "vpc" {
      backend = "s3"
    
      config = {
        ...
        key                  = "vpc/terraform.tfstate"
        workspace_key_prefix = "vpc"
        ...
      }
    }
    

    【讨论】:

      【解决方案3】:

      在 terraform 中管理您的应用程序不是一个好习惯,您可以使用 terraform 来创建您的集群(基础架构)EC2、EKS、VPC..但是在集群内部,您可以使用 helm/kubectl.. .. 管理您的 pod,例如,您可以有两个存储库,一个用于 terraform iac,另一个用于项目,然后您可以通过命名空间管理您的环境(dev、staging、prod...)...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-31
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2020-08-21
        • 2018-09-18
        相关资源
        最近更新 更多