Terraform创建AWS EKS节点组失败 实例无法加入K8s集群
EKS节点组CREATE_FAILED、节点无法加入集群排查清单
你遇到的NodeCreationFailure本质是EC2实例启动后,5分钟内未成功向EKS控制面完成注册,3台实例全失败基本可以排除单实例故障,按以下优先级逐一核对配置,90%的问题都能覆盖:
1. IAM配置问题(占这类报错的60%以上)
- 先核对节点组绑定的EC2实例角色(注意不是EKS集群的服务角色,别搞混),必须附加这两个基础策略:
AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryReadOnly(缺了这个节点拉不起kube-proxy、aws-node这些核心插件,直接卡注册流程)
- 检查角色信任关系:信任实体必须是
ec2.amazonaws.com,别错配成EKS服务主体。 - 必查
aws-auth配置:Terraform创建EKS集群和节点组时,不会自动把节点角色加到集群的aws-authConfigMap里,没加的话节点发注册请求直接被控制面返回403。
配置完kubeconfig后执行kubectl get configmap aws-auth -n kube-system -o yaml,确认mapRoles下存在如下条目:- rolearn: 你的节点实例角色完整ARN username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
2. 网络连通性问题(占这类报错的30%)
- 安全组规则核对:
- EKS控制面绑定的安全组,必须放通节点组安全组作为来源的TCP 443入站,不然节点根本连不上API Server。
- 节点组绑定的安全组,默认要开全量出站;同时放通同安全组内的所有协议流量,不然节点间组件通信异常。
- 子网与VPC配置核对:
- VPC必须开启
enable_dns_support和enable_dns_hostnames两个属性,关了的话EC2拿不到合法私有域名,kubelet注册时直接被校验打回。 - 如果节点部署在公有子网(路由表直连互联网网关),必须开子网的
map_public_ip_on_launch属性,不然节点没公网IP,连不上公网暴露的EKS API端点,也拉不到公网镜像。 - 如果节点部署在私有子网,路由表必须配好指向NAT网关的0.0.0.0/0路由;如果开了EKS私有API端点,要确保对应VPC终端节点的安全组放通节点访问。
- 别跨VPC选节点组子网,必须和EKS集群所在VPC一致。
- VPC必须开启
3. Terraform资源配置错误
- 检查
aws_eks_node_group资源的核心参数:node_role_arn别填成EKS集群服务角色的ARN,这个低级错误踩的人非常多。cluster_name必须和实际EKS集群名完全一致,大小写敏感。- 如果关联了自定义启动模板,确认模板里的AMI是和EKS版本严格匹配的官方EKS优化AMI,版本差1个以上小版本kubelet就会因为版本不兼容注册失败;别乱改启动模板里的kubelet启动参数,尤其是API Server地址、集群CA证书两个参数,错了直接连不上控制面。
4. 1分钟定位根因的方法
不用反复删了重建节点组碰运气,直接连实例看日志精准定位:
- 给节点实例角色加上
AmazonSSMManagedInstanceCore策略,等实例配置生效后,执行aws ssm start-session --target 你的实例ID(比如你列的i-04db15f25be4212fb)直接连实例,不用开SSH端口。 - 切root权限:
sudo su - 拉取kubelet日志:
journalctl -u kubelet -n 200
常见报错对应问题:- 报
i/o timeout连不上EKS API域名:就是网络不通,回头查安全组、路由、DNS配置 - 报
Unauthorized:就是aws-auth没配,或者节点角色ARN填错 - 报镜像拉取失败:就是缺ECR只读权限,或者网络不通拉不到镜像
- 报证书校验失败:要么API地址错了,要么路由配错连到了别的服务
- 报
内容的提问来源于stack exchange,提问作者Shay Pinchasi
相关产品推荐
相关产品推荐

