我遇到了 Terraform EKS 标记问题,并且似乎没有找到可行的解决方案来在创建新集群时标记所有 VPC 子网。
提供一些背景信息:我们有一个 AWS VPC,在其中将多个 EKS 集群部署到子网中。我们不会在 EKS 集群创建过程中创建 VPC 或子网。因此,创建集群的 terraform 代码不会标记现有子网和 VPC。尽管 EKS 会添加所需的标签,但下次我们在 VPC 上运行 terraform apply 时,它们会自动删除。
我尝试的解决方法是在 VPC 内提供 terraform.tfvars 文件,如下所示:
eks_tags =
[
"kubernetes.io/cluster/${var.cluster-1}", "shared",
"kubernetes.io/cluster/${var.cluster-2}", "shared",
"kubernetes.io/cluster/${var.cluster-2}", "shared",
]
然后在 VPC 和子网资源中,我们执行以下操作
resource "aws_vpc" "demo" {
cidr_block = "10.0.0.0/16"
tags = "${
map(
${var.eks_tags}
)
}"
}
然而,上面的方法似乎不起作用。我尝试过各种 Terraform 0.11 功能https://www.terraform.io/docs/configuration-0-11/interpolation.html但他们都没有帮助。
有人能够解决这个问题吗?
我们总是为每个 EKS 集群创建新的 VPC 和子网的想法是错误的。显然,必须有一种使用 Terraform 标记现有 VPC 和子网资源的方法?
您现在可以使用 aws 提供商ignore_tags
属性,以便用aws_ec2_tag
下次应用VPC模块时资源不会被删除。
例如,提供者变为:
provider "aws" {
profile = "terraform"
region = "us-west-1"
// This is necessary so that tags required for eks can be applied to the vpc without changes to the vpc wiping them out.
// https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/resource-tagging
ignore_tags {
key_prefixes = ["kubernetes.io/"]
}
}
然后您可以利用aws_ec2_tag
在您的 EKS 模块中添加这样的资源,而不必担心下次应用 VPC 模块时标签会被删除。
/**
Start of resource tagging logic to update the provided vpc and its subnets with the necessary tags for eks to work
The toset() function is actually multiplexing the resource block, one for every item in the set. It is what allows
for setting a tag on each of the subnets in the vpc.
*/
resource "aws_ec2_tag" "vpc_tag" {
resource_id = data.terraform_remote_state.vpc.outputs.vpc_id
key = "kubernetes.io/cluster/${var.cluster_name}"
value = "shared"
}
resource "aws_ec2_tag" "private_subnet_cluster_tag" {
for_each = toset(data.terraform_remote_state.vpc.outputs.private_subnets)
resource_id = each.value
key = "kubernetes.io/cluster/${var.cluster_name}"
value = "shared"
}
resource "aws_ec2_tag" "public_subnet_cluster_tag" {
for_each = toset(data.terraform_remote_state.vpc.outputs.public_subnets)
resource_id = each.value
key = "kubernetes.io/cluster/${var.cluster_name}"
value = "shared"
}
/**
These tags have been decoupled from the eks module and moved to the more appropirate vpc module.
*/
resource "aws_ec2_tag" "private_subnet_tag" {
for_each = toset(data.terraform_remote_state.vpc.outputs.private_subnets)
resource_id = each.value
key = "kubernetes.io/role/internal-elb"
value = "1"
}
resource "aws_ec2_tag" "public_subnet_tag" {
for_each = toset(data.terraform_remote_state.vpc.outputs.public_subnets)
resource_id = each.value
key = "kubernetes.io/role/elb"
value = "1"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)