#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
}
}