Пометка групп автомасштабирования, созданных EKS

Я создал кластер AWS EKS с модулем terraform-aws-eks . Версия Terraform - 1.0.6, версия провайдера AWS - 3.60.0. В этих версиях я должен иметь возможность использовать ресурс aws_autoscaling_group_tag для пометки ASG, создаваемых EKS.

Моя проблема в том, что группы узлов в модуле представляют собой карту карт (описанную здесь ), и я не знаю, как перебирать мои группы узлов, чтобы пометить все ASG в них. Вот пример из terraform:

      resource "aws_eks_node_group" "example" {
  cluster_name    = "example"
  node_group_name = "example"

  # ... other configuration ...
}

resource "aws_autoscaling_group_tag" "example" {
  for_each = toset(
    [for asg in flatten(
      [for resources in aws_eks_node_group.example.resources : resources.autoscaling_groups]
    ) : asg.name]
  )

  autoscaling_group_name = each.value

  tag {
    key   = "k8s.io/cluster-autoscaler/node-template/label/eks.amazonaws.com/capacityType"
    value = "SPOT"

    propagate_at_launch = false
  }
}

В этом случае есть одна конкретная группа узлов. Но в моем случае есть 3 группы узлов, и я хочу, чтобы все ASG были помечены. Я пока мало работал с циклами в terraform и даже не уверен, что это сработает. Я ценю любую помощь!

2 ответа

Вы упомянули, что используете terraform-aws-eks module. При использовании модуля определение групп узлов (управляемых или самоуправляемых) является частью этого модуля. Этот модуль в основном использует подмодуль eks-managed-node-group, и этот подмодуль поддерживает тегирование. Модуль создает шаблоны запуска и группы ASG на основе этих шаблонов.

Нет необходимости помечать ASG вне модуля. Лучше этого не делать, так как это приведет к смещению конфигураций вашей инфраструктуры: в следующий раз, когда вы запустите команду apply для кода модуля, теги могут быть изменены.

Ваша конфигурация должна выглядеть примерно так:

      module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "~> 18.0"
  ..
  ..

  # EKS Managed Node Group(s)
  eks_managed_node_group_defaults = {
    tags = {
      "k8s.io/cluster-autoscaler/node-template/label/eks.amazonaws.com/capacityType" = "SPOT"
    }
  }

  eks_managed_node_groups = {
    blue = {}
    green = {
      min_size     = 1
      max_size     = 10
      desired_size = 1

      instance_types = ["t3.large"]
    }
  }

Указание тегов в eks_managed_node_group_defaultsбудет применяться ко всем группам узлов. Вы можете настроить его для каждой группы узлов (в приведенном выше примере синий и зеленый), если хотите, чтобы они были разными.

Обратите внимание, что использование tagsозначает, что все созданные ресурсы будут помечены. Я не считаю это проблематичным, но если вы это сделаете, здесь нужно другое решение.

Вот ссылка на все поддерживаемые входы для подмодуля.

Вы можете проверить документацию модулей для получения дополнительных примеров.


Если я вас правильно понял, вы хотите создать группу ASG с типом емкости SPOT-инстансов. В terraform-aws-eksмодуль имеет capacity_typeпараметр для того, что описано как тип емкости, связанный с группой узлов EKS. Допустимые значения: ON_DEMAND, SPOT

Тогда гораздо проще добиться того, что вы ищете:

        eks_managed_node_group_defaults = {
    capacity_type  = "SPOT"
  }
  • Cluster-autoscaler просматривает только теги ASG, а не NodeGroup (вероятно, поэтому он также поддерживает самоуправляемые группы узлов?)
  • отчеты модуля Chen A не передают эти теги в ASG https://github.com/terraform-aws-modules/terraform-aws-eks/issues/1886

Итак, у вас осталось решение, которое больше похоже на ваш вопрос, чем на единственный другой ответ здесь. Лучшее вдохновение, которое я нашел, находится по адресу https://github.com/terraform-aws-modules/terraform-aws-eks/issues/1886#issuecomment-1044516352 .

Другие вопросы по тегам