具有一个集群的多个环境共享相同的地形状态



我使用Terraform -aws-modules/vpc/aws创建了EKS集群,我在法兰克福的每个az上使用一个具有3个私有子网的vpc。我已经创建了两个服务(tomcat和psql)和部署,这是通过LoadBalancer暴露,并通过互联网访问。到目前为止看起来还不错。但问题是它只是一个环境(DEV)。我想在一个VPC和一个集群内创建多个环境,如阶段,测试和更多,如何使用terraform?我应该为每个环境创建新文件吗?这可能说不通,但我什么也想不起来……我也在考虑工作空间,但问题是新的工作空间需要新的状态——这意味着我需要为每个工作空间创建新的VPC和新的集群!也许我应该把我的地形文件划分成"general"工作空间,会有一个VPC和集群的配置,并为每个环境创建新的工作空间?你有什么想法或更好的解决方案吗?

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

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

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

可以"分隔"在它自己的状态文件中。然后为每个EKS集群创建一个工作空间。对于EKS,您可以通过以下两种方式之一获取VPC信息:通过标记从AWS数据源获取或从状态文件获取。

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

├── 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数据源中提取,ref 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"
...
}
}

在terraform内部管理应用程序不是一个好的做法,您可以使用terraform来创建您的集群(infra) EC2, EKS, VPC....但是在集群内部,您可以使用helm/kubectl....要管理您的pod,例如,您可以有两个存储库,一个用于terraform iac,另一个用于项目,然后您可以通过名称空间管理您的环境(dev, staging, prod…)。

相关内容

  • 没有找到相关文章

最新更新