Terraform创建EKS托管节点组时双Launch Template问题咨询
我们用Terraform搭建EKS基础设施,配置了自定义的Launch Template并指定给节点组,但实际生成了两个Launch Template。当给自定义模板添加user_data后,节点组并未生效,因为Auto Scaling Group用的是AWS自动创建、不受Terraform管理的第二个模板。现咨询两个问题:
- 既然已指定自定义Launch Template给节点组,第二个自动生成的Launch Template的作用是什么?
- 如何避免AWS自动创建这个额外的Launch Template?
module "eks-cluster" { source = "../../aws/eks-cluster-v2" name = var.eks_cluster_name role_arn = var.eks_cluster_iam_role_arn eks_cluster_version = var.eks_cluster_version enabled_cluster_log_types = var.eks_cluster_enabled_log_types subnet_ids = var.eks_cluster_subnet_ids endpoint_private_access = var.eks_cluster_endpoint_private_access public_access_cidrs = var.eks_cluster_public_access_ips tags = { Environment = var.environment Name = var.eks_cluster_name Version = var.eks_cluster_version } depends_on = [module.eks-cluster-cloudwatch-log-group] } module "eks-nodegroup-launch-template" { source = "../../aws/launch-template" name = "${var.eks_cluster_name}-${var.eks_nodegroup_name}-launch-template" update_default_version = var.launch_template_update_default_version instance_type = var.launch_template_instance_type key_name = var.launch_template_key_pair_name block_device_name = var.launch_template_block_device_name volume_size = var.launch_template_disk_size ebs_optimized = var.launch_template_ebs_optimized monitoring_enabled = var.launch_template_monitoring_enabled resources_to_tag = var.launch_template_resource_type tags = { Environment = var.environment Name = "${var.eks_cluster_name}-${var.eks_nodegroup_name}-nodes" } } module "eks-nodegroup" { source = "../../aws/eks-nodegroup-v2" cluster_name = module.eks-cluster.eks_cluster_name node_group_name = var.eks_nodegroup_name node_role_arn = var.eks_nodegroup_iam_role_arn subnet_ids = var.eks_nodegroup_subnet_ids desired_size = var.eks_nodegroup_desired_size max_size = var.eks_nodegroup_max_size min_size = var.eks_nodegroup_min_size launch_template_id = module.eks-nodegroup-launch-template.launch_template_id launch_template_version = var.eks_nodegroup_launch_template_version labels = { "env" = var.environment "nodegroup_name" = var.eks_nodegroup_name } tags = { Environment = var.environment cluster_name = var.eks_cluster_name } depends_on = [module.eks-nodegroup-launch-template, module.eks-cluster] }
1. 第二个Launch Template的作用
AWS EKS节点组要求实例必须包含特定初始化配置才能正确注册到集群,比如kubelet参数、EKS bootstrap脚本、IAM实例配置文件关联等。当你提供的自定义Launch Template缺少这些EKS必需的初始化内容时,EKS会自动创建一个衍生的Launch Template:它会复制你自定义模板的配置,然后添加EKS节点初始化所需的user_data(包含bootstrap脚本)以及其他集群关联的必要配置,最终用这个衍生模板创建Auto Scaling Group,确保节点能正常加入EKS集群。
这个自动生成的模板是EKS的兜底机制,目的是避免因自定义模板配置不全导致节点无法工作,但代价是你对自定义模板的修改(比如添加自己的user_data)不会被应用,因为实际生效的是EKS生成的模板。
2. 避免自动创建额外Launch Template的方法
要让EKS直接使用你自定义的Launch Template,必须在模板中包含EKS节点初始化所需的完整配置,核心是正确配置user_data:
步骤1:在自定义Launch Template中添加EKS bootstrap脚本
修改eks-nodegroup-launch-template模块,添加user_data参数,内容为EKS的bootstrap脚本(根据EKS版本调整):
module "eks-nodegroup-launch-template" { source = "../../aws/launch-template" # 原有配置保留... name = "${var.eks_cluster_name}-${var.eks_nodegroup_name}-launch-template" update_default_version = var.launch_template_update_default_version instance_type = var.launch_template_instance_type # ...其他原有参数 # 添加user_data配置 user_data = base64encode(<<-EOF #!/bin/bash set -o xtrace /etc/eks/bootstrap.sh ${var.eks_cluster_name} \ --kubelet-extra-args "--node-labels=env=${var.environment},nodegroup_name=${var.eks_nodegroup_name}" EOF ) # 原有tags保留... }
${var.eks_cluster_name}替换为你的集群名称--kubelet-extra-args可添加节点标签、kubelet参数等自定义配置- 脚本必须用
base64encode处理,因为Launch Template的user_data要求base64编码
步骤2:确保关联正确的IAM实例配置文件
自定义Launch Template必须指定关联了EKS节点角色的IAM实例配置文件(如果你的launch-template模块支持iam_instance_profile参数,需添加该参数并传入正确的实例配置文件ARN),确保节点拥有访问EKS集群的权限。
步骤3:检查必要配置完整性
确认自定义Launch Template包含以下内容:
- 正确的Amazon EKS优化AMI(或自定义AMI包含EKS所需组件)
- 符合EKS要求的实例类型
- 正确的子网、安全组配置(如果模块支持安全组参数,需传入EKS节点安全组)
完成以上配置后,EKS会直接使用你自定义的Launch Template创建Auto Scaling Group,不会再生成额外模板,你对user_data的修改也会正常生效。
内容的提问来源于stack exchange,提问作者Oguzhan Aygun

