如何使用 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他们作为评论或其他答案。