Terraform创建私有子网EKS托管节点组:实例无法加入集群
解决Terraform部署私有子网EKS托管节点组无法加入集群的问题
问题说明
用eksctl部署私有子网中的EKS集群和托管节点组时,必须添加privateNetworking: true才能避免节点无法加入集群的错误。但使用Terraform的terraform-aws-modules/eks/aws模块时,没有对应参数,部署后遇到相同的"Instances failed to join the Kubernetes cluster"错误。
解决方案
eksctl的privateNetworking: true核心作用是让节点组实例仅使用私有IP,不分配公网IP,同时确保节点通过私有网络访问EKS控制平面。在Terraform中可以通过以下配置实现等效效果:
- 确保节点组使用的子网是私有子网(子网配置中未开启"自动分配公网IP")
- 在托管节点组的配置中,通过
launch_template显式禁用公网IP分配 - 确认EKS控制平面的私有访问已启用(已设置
cluster_endpoint_private_access = true) - 确保节点安全组允许与EKS控制平面的私有网络通信
调整后的Terraform代码
module "eks" { source = "terraform-aws-modules/eks/aws" version = "~> 20.0" cluster_name = "clusterFoo" cluster_version = "1.31" bootstrap_self_managed_addons = false cluster_addons = { coredns = {} eks-pod-identity-agent = {} kube-proxy = {} vpc-cni = {} } cluster_security_group_id = "sg-567" # 启用私有端点访问,禁用公网访问,匹配eksctl的私有网络配置 cluster_endpoint_public_access = false cluster_endpoint_private_access = true enable_cluster_creator_admin_permissions = true vpc_id = "vpc-123" # 使用私有子网ID subnet_ids = [ "subnet-234", "subnet-345" ] eks_managed_node_group_defaults = { instance_types = ["t2.medium"] } eks_managed_node_groups = { example = { ami_id = "ami-678" instance_types = ["t2.medium"] min_size = 1 max_size = 1 desired_size = 1 # 关键配置:禁用公网IP分配,等效于eksctl的privateNetworking: true launch_template = { metadata_options = { http_tokens = "required" } network_interfaces = { associate_public_ip_address = false } } # 若使用自定义AMI,可添加与eksctl一致的bootstrap命令 override_bootstrap_command = <<-EOT #!/bin/bash /etc/eks/bootstrap.sh clusterFoo EOT } } tags = { Environment = "dev" Terraform = "true" } }
额外检查项
- 确认私有子网有正确的路由表配置,能访问EKS控制平面的私有端点(通常通过VPC端点或NAT网关访问AWS服务)
- 节点IAM角色具备
AmazonEKSWorkerNodePolicy、AmazonEC2ContainerRegistryReadOnly等必要权限 - 自定义AMI需包含EKS bootstrap工具,且版本与集群版本匹配
内容的提问来源于stack exchange,提问作者Stephan
相关产品推荐
相关产品推荐

