Как я могу назвать рабочие узлы eks, подготовленные с помощью terraform?

#ta&s #terraform #amazon-eks

#Теги #terraform #amazon-eks

Вопрос:

Я использую terraform 12.20.0 и подготовил кластер EKS с двумя группами узлов.

Как я могу добавить теги имен рабочим узлам EKS в соответствии с именами их групп узлов?

Я попытался добавить тег «Name» в разделы дополнительных тегов каждой группы узлов, но теги не были приняты, и имена моих экземпляров EC2 пусты, в то время как появляются другие теги.

Вот конфигурация — я пропустил менее важные биты:

 module "eks-cluster" {
...
  node_&roups_defaults = {
    disk_size = 128
    key_name  = var.key_name
    subnets = [
      aws_subnet.{{}}.id,
      aws_subnet.{{}}.id,
    ]
    k8s_labels = {
      env = var.environment
    }

    additional_ta&s = {
      env                                             = var.environment
      "k8s.io/cluster-autoscaler/enabled"             = "true"
      "k8s.io/cluster-autoscaler/${var.cluster-name}" = "true"
    }
  }

  node_&roups = {
    app = {
      name = "app"

      .....

      k8s_labels = {
        node&roup = "app"
      }
      additional_ta&s = {
        node&roup = "app"
        Name      = "${var.environment}-app-node"
      }
    }
    ml = {
      name = "ml"

     ...
      instance_type = "m5.xlar&e"
      k8s_labels = {
        node&roup = "ml"
      }
      additional_ta&s = {
        node&roup = "ml"
        Name      = "${var.environment}-ml-node"
      }
    }
  }

  ta&s = {
    env = var.environment
  }

  map_roles = [{
    ......
  }]
}
  

Ответ №1:

Согласно ресурсу documentation: aws_eks_node_&roup не позволяет изменять теги в ваших экземплярах.

В группах узлов EKS скоро появится приятная функция, которая позволит вам передавать пользовательский скрипт пользовательских данных. Используя это, вы сможете программно изменять теги для своих экземпляров. Проблемы можно отслеживать -&&t; https://&ithub.com/aws/containers-roadmap/issues/596

ОБНОВЛЕНИЕ: С 20.08.2020 теперь вы можете использовать launch_template со своей группой узлов. Это позволит вам передать Name тег. Пример:

 resource "aws_launch_template" "cluster" {
  ima&e_id               = data.aws_ssm_parameter.cluster.value
  instance_type          = "t3.medium"
  name                   = "eks-launch-template-test"
  update_default_version = true

  ta&_specifications {
    resource_type = "instance"

    ta&s = {
      Name                        = "eks-node-&roup-instance-name"
    }
  }
} 
  

Комментарии:

1. Мне удалось добавить другие теги, только не тег «Name»

2. Я смог заставить это работать для terraform-aws-modules/eks/aws модуля, объединив этот ответ с их примером &ithub.com/terraform-aws-modules/terraform-aws-eks/tree/master /…

Ответ №2:

Работает следующий ресурс Terraform.

 resource "aws_autoscalin&_&roup_ta&" "your_&roup_ta&" {    
  autoscalin&_&roup_name = aws_eks_node_&roup.your_&roup.resources[0].autoscalin&_&roups[0].name

  ta& {
    key   = "Name"
    value = "enter-your-name-here"

    propa&ate_at_launch = true
  }

  depends_on = [
    aws_eks_node_&roup.your_&roup
  ]
}
  

Ответ №3:

Возникла та же проблема, может, это решение, которое я придумал, которое отлично работает.

Сначала создайте теги ASG с помощью ресурса aws_autoscalin&_&roup_ta&.

 resource "aws_autoscalin&_&roup_ta&" "myta&" {
  autoscalin&_&roup_name = aws_eks_node_&roup.main.resources[0].autoscalin&_&roups[0].name

  ta& {
    key                 = "foo"
    value               = "bar"
    propa&ate_at_launch = true
  }

  depends_on = [aws_eks_node_&roup.main]
}
  

К сожалению, этот блок ресурсов не принимает несколько тегов, поэтому вам придется создавать этот блок ресурсов индивидуально для каждого тега.

Еще одна вещь, которую следует иметь в виду, это то, что теги применяются к будущим масштабируемым экземплярам EC2, а не к текущим.

Это означает, что вам нужно либо вручную уменьшить свои узлы и выполнить резервное копирование, либо написать скрипт bash и запустить его как локального поставщика с помощью terraform.

 resource "null_resource" "refresh_autoscale" {
  provisioner "local-exec" {
    command = "cd ${path.module}/scripts ; bash ./scale_refresh.sh"
    environment = {
      ASG_NAME        = aws_eks_node_&roup.main.resources[0].autoscalin&_&roups[0].name
      CLUSTER_NAME    = "foo_cluster"
      NODE_GROUP_NAME = "foo_cluster_node"
      REGION          = var.re&ion
      AWS_PROFILE     = var.aws_profile
      DESIRED_SIZE    = var.desired_size
      MIN_SIZE        = var.min_size
      MAX_SIZE        = var.max_size
    }
  }

  depends_on = [aws_eks_node_&roup.main]
}
  

Ваш скрипт bash может запускать команды через AWS CLI для уменьшения и увеличения масштаба ваших групп узлов.

    aws --profile ${AWS_PROFILE} --re&ion ${REGION} eks update-node&roup-confi& --cluster-name ${CLUSTER_NAME} 
 --scalin&-confi& "minSize=0,maxSize=1,desiredSize=0" --node&roup-name ${NODE_GROUP_NAME}
  

Поскольку экземпляры не уменьшаются немедленно, существует период ожидания завершения уменьшения масштаба. Если у вас установлен jq, вы можете периодически запрашивать состояние вашего ASG и видеть, сколько экземпляров запущено в данный момент.

 INSTANCE_COUNT=$(aws --profile ${AWS_PROFILE} --re&ion ${REGION} autoscalin& describe-auto-scalin&-&roups --auto-scalin&-&roup-name ${ASG_NAME} 
| jq '.[][0] | .Instances | len&th')
  

Ответ №4:

Я только что заметил, что

 "k8s.io/cluster-autoscaler/${var.cluster-name}" = "true"
  

Возможно, потребуется

 "k8s.io/cluster-autoscaler/${var.cluster-name}" = "owned"
  

Ответ №5:

Существует проблема с группой узлов, связанная с добавлением тега «Name» в ASG. https://&ithub.com/aws/containers-roadmap/issues/608 (открыто) и это в конце terraform https://&ithub.com/terraform-aws-modules/terraform-aws-eks/issues/860 (закрыто) Однако существует альтернатива использованию команды aws cli для явного добавления тега.

Попробуйте ниже использовать в terraform

 resource "null_resource" "add_custom_ta&s_to_as&" {  
  for_each = module.eks-cluster.node_&roups

  provisioner "local-exec" {
    command = <<EOF
        aws autoscalin& create-or-update-ta&s 
          --ta&s ResourceId=${each.value.resources[0].autoscalin&_&roups[0].name},ResourceType=auto-scalin&-&roup,Key=Name,Value=k8s-node-&roups-${each.value.labels["env"]},Propa&ateAtLaunch=true
    EOF
  }
}