我使用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…)。