Пометка групп автомасштабирования, созданных 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 .