You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform创建EKS托管节点组时双Launch Template问题咨询

问题背景

我们用Terraform搭建EKS基础设施,配置了自定义的Launch Template并指定给节点组,但实际生成了两个Launch Template。当给自定义模板添加user_data后,节点组并未生效,因为Auto Scaling Group用的是AWS自动创建、不受Terraform管理的第二个模板。现咨询两个问题:

  1. 既然已指定自定义Launch Template给节点组,第二个自动生成的Launch Template的作用是什么?
  2. 如何避免AWS自动创建这个额外的Launch Template?
现有Terraform配置
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 23:15:00