AWS EKS 节点组“创建失败”:实例无法加入 kubernetes 集群

Cod*_*ght 5 amazon-ec2 amazon-web-services kubernetes amazon-eks

我能够创建一个 EKS 集群,但是当我尝试添加节点组时,我收到一个“创建失败”错误和详细信息:“NodeCreationFailure”:实例无法加入 kubernetes 集群

我尝试了各种实例类型,并在没有运气的情况下增加了更大的卷大小 (60gb)。查看 EC2 实例,我只看到以下问题。但是,很难做任何事情,因为我没有直接启动 EC2 实例(EKS NodeGroup UI 向导正在这样做。)

如果在我可以跳入 ec2 机器并“修复”它们之前发生故障,那么如何前进?

亚马逊 Linux 2

x86_64 上的内核 4.14.198-152.320.amzn2.x86_64

ip-187-187-187-175 登录:[54.474668] cloud-init[3182]:配置的存储库之一失败(未知),[54.475887] cloud-init[3182]:yum 没有足够的缓存数据接着说。此时唯一的 [54.478096] cloud-init[3182]:yum 可以做的安全事情就是失败。有几种方法可以“修复”这个问题: [54.480183] cloud-init[3182]: 1. 联系上游的存储库并让他们解决问题。[54.483514]云初始化[3182]:2.重新配置baseurl/etc。对于存储库,指向一个工作 [54.485198] cloud-init[3182]: 上游。如果您使用更新的 [ 54.486906] cloud-init[3182]: 分发版本而不是存储库支持的版本(并且 [ 54.488316] cloud-init[3182]: 先前分发版本的包仍然有效),这通常很有用)。[ 54. 489660] cloud-init[3182]: 3. 在暂时禁用存储库的情况下运行命令 [ 54.491045] cloud-init[3182]: yum --disablerepo= ... [ 54.491285] cloud-init[3182]: 4. 禁用永久存储库,因此 yum 默认情况下不会使用它。Yum [54.493407] cloud-init[3182]:然后将忽略存储库,直到您永久启用它 [54.495740] cloud-init[3182]:再次或使用 --enablerepo 临时使用:[54.495996] cloud-init[3182] ]: yum-config-manager --disable

man*_*lam 17

就我而言,问题是我将节点组部署在私有子网中,但该私有子网没有关联的 NAT 网关,因此无法访问互联网。我所做的是:

  1. 创建NAT网关

  2. 创建一个新的路由表,其中包含以下路由(第二个是互联网访问路由,通过nat):

  • 目的地:VPC-CIDR-块 目标:本地
  • 目的地:0.0.0.0/0 目标:NAT 网关 ID
  1. 将私有子网与第二步中创建的路由表相关联。

之后,节点组毫无问题地加入集群。

  • 请注意,NAT 网关应创建在公共子网中。否则,私有子网中的实例将无法连接到互联网,我们将得到相同的 NodeCreationFailure 错误。 (4认同)

Rtm*_*tmY 12

添加另一个原因到列表中:

就我而言,节点在私有子网中运行,并且我尚未在API 服务器端点访问下配置私有端点。

更新后,节点组不会自动更新,因此我必须重新创建它们。


Gre*_*tin 9

我注意到这里没有答案,但在过去六个月里这个问题的访问量大约有 2000 次。出现这些失败的原因似乎有很多。要反省此处找到的 AWS 文档: https ://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html

  • aws-auth-cm.yaml 文件没有适合您的节点的正确 IAM 角色 ARN。确保在 aws-auth-cm.yaml 文件中指定节点 IAM 角色 ARN(不是实例配置文件 ARN)。有关更多信息,请参阅启动自我管理的 Amazon Linux 节点。

  • 节点 AWS CloudFormation 模板中的 ClusterName 与您希望节点加入的集群的名称不完全匹配。向此字段传递不正确的值会导致节点的 /var/lib/kubelet/kubeconfig 文件配置不正确,并且节点将不会加入集群。

  • 该节点未标记为由集群拥有。您的节点必须应用以下标签,其中 替换为您的集群的名称。

    Key Value kubernetes.io/cluster/<cluster-name> 
    Value owned
Run Code Online (Sandbox Code Playgroud)
  • 节点可能无法使用公共 IP 地址访问集群。确保为公共子网中部署的节点分配了公共 IP 地址。如果没有,您可以在节点启动后将弹性 IP 地址关联到节点。有关更多信息,请参阅将弹性 IP 地址与正在运行的实例或网络接口关联。如果公有子网未设置为自动将公有 IP 地址分配给部署到其中的实例,那么我们建议启用该设置。有关详细信息,请参阅修改子网的公共 IPv4 寻址属性。如果节点部署到私有子网,则该子网必须具有到分配了公共 IP 地址的 NAT 网关的路由。

  • 您的账户未启用您要将节点部署到的区域的 STS 终端节点。要启用区域,请参阅在 AWS 区域中激活和停用 AWS STS。

  • 工作节点没有私有 DNS 条目,导致 kubelet 日志包含节点“”未找到错误。确保创建工作节点的 VPC 已将域名和域名服务器的值设置为 DHCP 选项集中的选项。默认值为domain-name:.compute.internal 和domain-name-servers:AmazonProvidedDNS。有关更多信息,请参阅 Amazon VPC 用户指南中的 DHCP 选项集。

我自己在标签方面遇到了问题,我需要一个大写字母。实际上,如果您可以使用其他途径来部署 EKS 集群,我会推荐它(eksctl、aws cli、terraform 甚至)。