如何解决 Amazon EKS 托管节点组创建失败的问题?

3 分钟阅读
0

我的 Amazon Elastic Kubernetes Service(Amazon EKS)托管节点组创建失败。节点无法加入集群,我收到类似以下内容的错误: “Instances failed to join the kubernetes cluster”(实例无法加入 kubernetes 集群)。

解决方法

使用自动化运行手册来确定常见问题

使用 AWSSupport-TroubleshootEKSWorkerNode 运行手册查找常见问题。

**重要事项:**要使自动化正常工作,您的 Worker 节点必须具有访问 AWS Systems Manager 的权限并在运行 Systems Manager。要授予权限,请将 AmazonSSMManagedInstanceCore AWS 托管式策略附加到与您的 Amazon Elastic Compute Cloud (EC2) 实例配置文件对应的 AWS Identity and Access Management (IAM) 角色。这是通过 eksctl 创建的 Amazon EKS 托管节点组的默认配置。

完成以下步骤:

  1. 打开运行手册
  2. 检查 AWS 管理控制台中的 AWS 区域是否设置为与您的集群相同的区域。
    **注意:**请查看运行手册的“运行手册详细信息”部分,以了解有关运行手册的详细信息。
  3. Input parameters(输入参数)部分中,在 ClusterName 字段中指定您的集群的名称,在 WorkerID 字段中指定实例 ID。
  4. (可选)在 AutomationAssumeRole 字段中,指定 IAM 角色以允许 Systems Manager 执行操作。如果未指定,您当前 IAM 实体的 IAM 权限将用于执行运行手册中的操作。
  5. 选择 Execute(执行)。
  6. 查看“输出”部分,了解您的 Worker 节点未加入集群的原因以及要解决错误可以采取的步骤。

确认 Worker 节点安全组流量要求

确认您的控制面板的安全组和 Worker 节点安全组已配置针对入站和出站流量的要求。默认情况下,Amazon EKS 将集群安全组应用于节点组中的实例,以促进节点与控制面板之间的通信。如果您在托管节点组的启动模板中指定自定义安全组,Amazon EKS 不会添加集群安全组。

确认 Worker 节点 IAM 权限

确保与 Worker 节点关联的 IAM 实例角色附加有 AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryReadOnly 策略。

**注意:**您必须将 Amazon 托管式策略 AmazonEKS_CNI_Policy 附加到 IAM 角色。您可以将其附加到节点实例角色。不过,最佳做法是将策略附加到与 kube-system 命名空间中的 aws-node Kubernetes 服务账户关联的角色。有关详细信息,请参阅配置 Amazon VPC CNI 插件以使用 IRSA

确认您的集群的 Amazon VPC 支持 DNS 主机名和解析

为 EKS 集群端点配置私有访问权限后,必须为您的 Amazon Virtual Private Cloud (Amazon VPC) 启用 DNS 主机名和 DNS 解析。在您激活端点私有访问权限时,Amazon EKS 会为您创建一个 Amazon Route 53 私有托管区。然后,Amazon EKS 会将其与您的集群的 Amazon VPC 关联。有关详细信息,请参阅控制对集群 API 服务器端点的网络访问权限

使用 Worker 节点的 NodeInstanceRole 更新 aws-auth ConfigMap

确认 aws-auth ConfigMap 已使用您的 Worker 节点的 IAM 角色(而不是实例配置文件)正确配置。

为您的 Worker 节点设置标签

将 Worker 节点的 Tag 属性的设置为 kubernetes.io/cluster/clusterName,将设置为 owned

确认 Worker 节点的 Amazon VPC 子网有可用 IP 地址

如果您的 Amazon VPC 的 IP 地址用完,请将辅助 CIDR 关联到您现有的 Amazon VPC。有关详细信息,请参阅查看 Amazon EKS 对 VPC 和子网的联网要求

确认您的 Amazon EKS Worker 节点可以访问您的集群的 API 服务器端点

如果有通过以下网关的 Internet 路由,您可以在集群 VPC 或对等子网内的任何子网中启动 Worker 节点:

  • NAT
  • Internet
  • 中转

如果您的 Worker 节点在受限的私有网络中启动,请确认您的 Worker 节点可以访问 Amazon EKS API 服务器端点。有关详细信息,请参阅在无出站互联网访问的情况下在私有集群中运行 Amazon EKS 的要求

注意: 对于由 NAT 网关支持的私有子网中的节点,最佳做法是在公有子网中创建 NAT 网关。

如果您使用的不是 AWS PrivateLink 端点,请通过代理服务器验证对以下 AWS 服务的 API 端点的访问权限:

  • Amazon EC2
  • Amazon ECR
  • Amazon S3

要验证 Worker 节点是否可以访问 API 服务器,请使用 SSH 进行连接,然后运行以下 netcat 命令:

nc -vz 9FCF4EA77D81408ED82517B9B7E60D52.yl4.eu-north-1.eks.amazonaws.com 443

注意:9FCF4EA77D81408ED82517B9B7E60D52.yl4.eu-north-1.eks.amazonaws.com 替换为您的 API 服务器端点。

在仍连接到实例时检查 kubelet 日志:

journalctl -f -u kubelet

如果 kubelet 日志未提供有关问题来源的信息,检查 Worker 节点上 kubelet 的状态:

sudo systemctl status kubelet

收集 Amazon EKS 日志和操作系统日志以进行进一步的故障排除。

验证 API 端点是否可以访问您的 AWS 区域

使用 SSH 连接到其中一个 Worker 节点,然后为每个服务运行以下命令:

$ nc -vz ec2.region.amazonaws.com 443
$ nc -vz ecr.region.amazonaws.com 443
$ nc -vz s3.region.amazonaws.com 443

**注意:**请将 region 替换为您的 Worker 节点的 AWS 区域。

为 Worker 节点配置用户数据

对于带有指定 AMI 的托管节点组启动模板,必须提供引导命令,Worker 节点才能加入您的集群。Amazon EKS 不会将默认的引导命令合并到您的用户数据中。有关详细信息,请参阅在 Amazon EKS 托管节点组中引入启动模板和自定义 AMI 支持指定 AMI

带有引导命令的示例启动模板:

#!/bin/bashset -o xtrace/etc/eks/bootstrap.sh
${ClusterName} ${BootstrapArguments}

**注意:**请将 ${ClusterName} 替换为您的 Amazon EKS 集群的名称。如果需要,请将 ${BootstrapArguments} 替换为其他引导值。

相关信息

排查 Amazon EKS 集群和节点问题

如何让我的 Worker 节点加入我的 Amazon EKS 集群?

AWS 官方
AWS 官方已更新 4 个月前