如何解决 Amazon EKS 托管节点组创建失败的问题?
我的 Amazon Elastic Kubernetes Service(Amazon EKS)托管节点组创建失败。节点无法加入集群,我收到类似以下内容的错误: “实例无法加入 kubernetes 集群”。
简述
要解决 Amazon EKS 托管节点组创建失败问题,请执行以下步骤:
- 使用 AWS Systems Manager Automation 运行手册来确定常见问题。
- 确认 Worker 节点安全组流量要求。
- 确认 Worker 节点 Identity and Access Management(IAM)权限。
- 确认您的集群的 Amazon Virtual Private Cloud(Amazon VPC)支持 DNS 主机名和解析。
- 使用您的 Worker 节点的 NodeInstanceRole 更新 aws-auth ConfigMap。
- 为您的 Worker 节点设置标签。
- 确认 Worker 节点的 Amazon VPC 子网有可用 IP 地址。
- 确认 Worker 节点可以访问您的集群的 API 服务器端点。
- 确认 Amazon Elastic Compute Cloud(Amazon EC2)、Amazon Elastic Container Registry(Amazon ECR)和 Amazon Simple Storage Service(Amazon S3)API 端点可以访问您的 AWS 区域。
解决方法
**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
使用 Systems Manager Automation 运行手册来确定常见问题
使用 AWSSupport-TroubleshootEKSWorkerNode 运行手册查找阻止 Worker 节点加入集群的常见问题。
**重要事项:**要使自动化正常工作,您的 Worker 节点必须具有访问 Systems Manager 的权限并在运行 Systems Manager。要授予权限,请将 AmazonSSMManagedInstanceCore AWS 托管策略附加到与您的 EC2 实例配置文件对应的 IAM 角色。这是通过 eksctl 创建的 EKS 托管节点组的默认配置。
- 打开运行手册。
- 检查 AWS 管理控制台中的 AWS 区域是否设置为与您的集群相同的区域。
注意:查看运行手册的文档详细信息部分可以了解有关运行手册的更多信息。 - 在输入参数部分,在 ClusterName 字段中指定您的集群的名称,在 WorkerID 字段中指定实例 ID。
- (可选)在 AutomationAssumeRole 字段中,指定 IAM 角色以允许 Systems Manager 执行操作。如果未指定,您当前 IAM 实体的 IAM 权限将用于执行运行手册中的操作。
- 选择执行。
- 查看输出部分,了解您的 Worker 节点未加入集群的原因以及您可以采取来解决问题的步骤。
确认 Worker 节点安全组流量要求
确认您的控制面板的安全组和 Worker 节点安全组已配置针对入站和出站流量的推荐设置。默认情况下,Amazon EKS 将集群安全组应用于节点组中的实例,以促进节点与控制面板之间的通信。如果您在托管节点组的启动模板中指定自定义安全组,Amazon EKS 不会添加集群安全组。
确认 Worker 节点 IAM 权限
确保与 Worker 节点关联的 IAM 实例角色附加有 AmazonEKSWorkerNodePolicy 和 AmazonEC2ContainerRegistryReadOnly 策略。
**注意:**您必须将 Amazon 托管策略 AmazonEKS_CNI_Policy 附加到 IAM 角色。您可以将其附加到节点实例角色。不过,最佳做法是将策略附加到与 kube-system 命名空间中的 aws-node Kubernetes 服务账户关联的角色。有关详细信息,请参阅为 Kubernetes 配置 Amazon VPC CNI 插件以在服务账户中使用 IAM 角色。
确认您的集群的 Amazon VPC 支持 DNS 主机名和解析
为 EKS 集群端点配置私有访问权限后,必须为您的 Amazon VPC 启用 DNS 主机名和 DNS 解析。在您激活端点私有访问权限时,Amazon EKS 会为您创建一个 Amazon Route 53 私有托管区。然后,Amazon EKS 会将其与您的集群的 Amazon VPC 关联。有关详细信息,请参阅 Amazon EKS 集群端点访问控制。
使用您的 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 连接到您的 Worker 节点,然后运行以下 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 日志和操作系统日志以进行进一步的故障排除。
确认 Amazon EC2、Amazon ECR 和 Amazon S3 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/bash set -o xtrace /etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments}
**注意:**请将 ${ClusterName} 替换为您的 Amazon EKS 集群的名称。如果需要,请将 ${BootstrapArguments} 替换为其他引导值。
相关信息
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前