如何使用 Terraform 为 EKS 受管节点编辑 EC2 中的 "Name" 标签?
How do I use terraform to edit the "Name" tag in EC2 for a EKS managed node?
tldr;在 AWS 的 EKS 集群中使用 Terraform 启动节点时,您无法更改 EC2 中显示的“名称”标签。
加长版:
在 AWS 中使用 terraform 时,可以创建 node_group,但不能设置“Name”标签。这意味着当您在 EC2 中查看时,该实例看起来是空白的,您需要在标签窗格中查看它是什么实例。
问题在于 EKS 无法直接更改“名称”标签。标签配置块在那里,但它不起作用。例如,这应该有效:
resource "aws_eks_node_group" "my_node" {
...
tag {
key = "Name"
value = "my_eks_node_group"
propagate_at_launch = true
}
但事实并非如此。我可以通过 GUI 设置标签,但这没什么用。有人知道通过 terraform 设置“名称”标签的方法吗??
这是一个 long-standing 问题,显然已经失去了它过去的一些动力。没关系,有几个解决方案。
选项 1
我们拥有的最佳解决方案是使用 aws_autoscaling_group_tag
,它将向旋转起来的 NEW 节点添加标签。例如,这是我的 EKS node_group,它位于 Terraform 的一个模块中,而 aws_autoscaling_group_tag 为 node_group 设置“名称”标签:
resource "aws_eks_node_group" "nodes_group" {
cluster_name = aws_eks_cluster.eks_cluster.name
node_role_arn = aws_iam_role.eks_assume_role.arn
subnet_ids = var.subnet_ids
###########
# Optional
ami_type = "AL2_x86_64"
disk_size = 60
instance_types = ["m6i.xlarge"]
node_group_name = "worker"
version = var.kubenetes_version
scaling_config {
desired_size = 2
max_size = 4
min_size = 1
}
update_config {
max_unavailable = 2
}
# Ensure that IAM Role permissions are created before and deleted after EKS Node Group handling.
# Otherwise, EKS will not be able to properly delete EC2 Instances and Elastic Network Interfaces.
depends_on = [
aws_iam_role_policy_attachment.EKS-AmazonEKSWorkerNodePolicy,
aws_iam_role_policy_attachment.EKS-AmazonEKS_CNI_Policy,
aws_iam_role_policy_attachment.EKS-AmazonEC2ContainerRegistryReadOnly,
]
}
#EKS can't directly set the "Name" tag, so we use the autoscaling_group_tag resource.
resource "aws_autoscaling_group_tag" "nodes_group" {
for_each = toset(
[for asg in flatten(
[for resources in aws_eks_node_group.nodes_group.resources : resources.autoscaling_groups]
) : asg.name]
)
autoscaling_group_name = each.value
tag {
key = "Name"
value = "eks_node_group"
propagate_at_launch = true
}
}
然后会将 Name
标签设置为 eks_node_group
。
请注意,这仅适用于 NEW 节点。如果您有现有节点,则必须将它们循环出去,或者手动添加标签。但它确实适用于新节点。
并感谢 andre-lk 在 github 问题中 post 给出了这个答案。 Github issue thread
选项 2
使用启动模板。您可以通过启动模板设置“名称”标签。这里有一个教程:Tutorial on launch templates
选项 3
使用 lambda。您可以在实例启动后启动一个将 运行 的 lambda,然后以这种方式标记您的节点。
选项 4
如果您没有很多节点,您可以通过 GUI 手动标记它们。但这不是最好的主意。
总结
可能还有其他选项,但我认为设置 aws_autoscaling_group_tag 是最干净的。这只是意味着您必须循环一次节点才能显示标签。
如果其他人有更好的想法,请在下面post他们作为评论或其他答案。
tldr;在 AWS 的 EKS 集群中使用 Terraform 启动节点时,您无法更改 EC2 中显示的“名称”标签。
加长版: 在 AWS 中使用 terraform 时,可以创建 node_group,但不能设置“Name”标签。这意味着当您在 EC2 中查看时,该实例看起来是空白的,您需要在标签窗格中查看它是什么实例。
问题在于 EKS 无法直接更改“名称”标签。标签配置块在那里,但它不起作用。例如,这应该有效:
resource "aws_eks_node_group" "my_node" {
...
tag {
key = "Name"
value = "my_eks_node_group"
propagate_at_launch = true
}
但事实并非如此。我可以通过 GUI 设置标签,但这没什么用。有人知道通过 terraform 设置“名称”标签的方法吗??
这是一个 long-standing 问题,显然已经失去了它过去的一些动力。没关系,有几个解决方案。
选项 1
我们拥有的最佳解决方案是使用 aws_autoscaling_group_tag
,它将向旋转起来的 NEW 节点添加标签。例如,这是我的 EKS node_group,它位于 Terraform 的一个模块中,而 aws_autoscaling_group_tag 为 node_group 设置“名称”标签:
resource "aws_eks_node_group" "nodes_group" {
cluster_name = aws_eks_cluster.eks_cluster.name
node_role_arn = aws_iam_role.eks_assume_role.arn
subnet_ids = var.subnet_ids
###########
# Optional
ami_type = "AL2_x86_64"
disk_size = 60
instance_types = ["m6i.xlarge"]
node_group_name = "worker"
version = var.kubenetes_version
scaling_config {
desired_size = 2
max_size = 4
min_size = 1
}
update_config {
max_unavailable = 2
}
# Ensure that IAM Role permissions are created before and deleted after EKS Node Group handling.
# Otherwise, EKS will not be able to properly delete EC2 Instances and Elastic Network Interfaces.
depends_on = [
aws_iam_role_policy_attachment.EKS-AmazonEKSWorkerNodePolicy,
aws_iam_role_policy_attachment.EKS-AmazonEKS_CNI_Policy,
aws_iam_role_policy_attachment.EKS-AmazonEC2ContainerRegistryReadOnly,
]
}
#EKS can't directly set the "Name" tag, so we use the autoscaling_group_tag resource.
resource "aws_autoscaling_group_tag" "nodes_group" {
for_each = toset(
[for asg in flatten(
[for resources in aws_eks_node_group.nodes_group.resources : resources.autoscaling_groups]
) : asg.name]
)
autoscaling_group_name = each.value
tag {
key = "Name"
value = "eks_node_group"
propagate_at_launch = true
}
}
然后会将 Name
标签设置为 eks_node_group
。
请注意,这仅适用于 NEW 节点。如果您有现有节点,则必须将它们循环出去,或者手动添加标签。但它确实适用于新节点。 并感谢 andre-lk 在 github 问题中 post 给出了这个答案。 Github issue thread
选项 2
使用启动模板。您可以通过启动模板设置“名称”标签。这里有一个教程:Tutorial on launch templates
选项 3
使用 lambda。您可以在实例启动后启动一个将 运行 的 lambda,然后以这种方式标记您的节点。
选项 4
如果您没有很多节点,您可以通过 GUI 手动标记它们。但这不是最好的主意。
总结
可能还有其他选项,但我认为设置 aws_autoscaling_group_tag 是最干净的。这只是意味着您必须循环一次节点才能显示标签。
如果其他人有更好的想法,请在下面post他们作为评论或其他答案。