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

4 分钟阅读
0

我的 Worker 节点不会加入我的 Amazon Elastic Kubernetes Service(Amazon EKS)集群。

简述

要让您的 Worker 节点加入您的 Amazon EKS 集群,请完成以下步骤:

  • 使用 AWS Systems Manager Automation 运行手册来确定常见问题。
  • 确认您的 Amazon Virtual Private Cloud(Amazon VPC)拥有 DNS 支持。
  • 确认您的实例配置文件的 Worker 节点具有正确的权限。
  • 为您的 Worker 节点配置用户数据。
  • 验证您的 Amazon VPC 子网的网络配置是否正确。
  • 确认您的 Worker 节点与 EKS 集群位于同一 VPC 中。
  • 使用 Worker 节点的 NodeInstanceRole 更新 aws-auth ConfigMap。
  • 确保您的 Worker 节点满足安全组要求。
  • 为您的 Worker 节点设置标签。
  • 确认您的 Worker 节点可以访问您的 EKS 集群的 API 服务器端点。
  • 确认您的 EKS 集群角色配置正确。
  • 对于支持 AWS Security Token Service(AWS STS)端点的 AWS 区域,请确认区域 AWS STS 端点已激活。
  • 确保将 AMI 配置为可与 Amazon EKS 配合工作并包含必需的组件。
  • 使用 SSH 连接到您的 Worker 节点的 Amazon Elastic Compute Cloud(Amazon EC2)实例,然后在 kubelet 代理日志中搜索错误。
  • 使用 Amazon EKS 日志收集器脚本对错误进行故障排除。

**重要信息:**以下步骤不包括在不满足以下条件的环境中注册 Worker 节点所需的配置:

  • 在您的集群的 VPC 中,配置参数 domain-name-servers 设置为 AmazonProvidedDNS。有关更多信息,请参阅 DHCP 选项集
  • 您正在使用亚马逊 EKS 优化的 Linux 亚马逊云机器镜像(AMI)来启动您的 Worker 节点。
    注意:Amazon EKS 优化的 Linux AMI 提供所有必要的配置,包括 /etc/eks/bootstrap.sh 引导脚本,用于将 Worker 节点注册到您的集群。

解决方案

使用 Systems Manager Automation 运行手册确定常见问题

使用 AWSSupport-TroubleshootEKSWorkerNode 运行手册查找阻止 Worker 节点加入集群的常见问题。

重要信息:要使自动化正常工作,您的 Worker 节点必须具有访问 Systems Manager 的权限并在运行 Systems Manager。要授予此权限,请将 AmazonSSMManagedInstanceCore 策略附加到 AWS Identity and Access Management(IAM)角色。这是与您的 Amazon EC2 实例配置文件相对应的 IAM 角色。这是您通过 eksctl 创建的 Amazon EKS 托管节点组的默认配置。使用以下格式作为您的集群名称:[-a-zA-Z0-9]{1,100}$

  1. 打开运行手册
  2. 检查 AWS 管理控制台中的 AWS 区域是否设置为与您的集群相同的区域。
    注意:查看运行手册的文件详细信息部分可以了解有关运行手册的更多信息。
  3. 输入参数部分中,在 ClusterName 字段中指定集群的名称,在 WorkerID 字段中指定 Amazon EC2 实例 ID。
  4. **(可选)**在 AutomationAssumeRole 字段中,指定 IAM 角色以允许 Systems Manager 执行操作。如果您未指定,则将使用当前 IAM 实体的 IAM 权限执行运行手册中的操作。
  5. 选择执行
  6. 查看 Outputs 部分,了解您的 Worker 节点未加入集群的原因,以及您可以采取哪些措施来解决该问题。

确认您的 Amazon VPC 拥有 DNS 支持

确认您的 EKS 集群的 Amazon VPC 已开启 DNS 主机名DNS 解析

要检查并启用这些属性,请完成以下步骤:

  1. 打开 Amazon VPC 控制台
  2. 在导航窗格中,选择您的 VPC
  3. 选择要编辑的 VPC。
  4. 详细信息选项卡下,检查 DNS 主机名和 DNS 解析是否已开启。
  5. 如果未开启,请为这两个属性选择启用
  6. 选择保存更改

有关更多信息,请参阅查看和更新 VPC 的 DNS 属性

确认您的实例配置文件的 Worker 节点具有正确的权限

将以下 AWS 托管策略附加到与您的实例配置文件的 Worker 节点关联的角色:

  • AmazonEKSWorkerNodePolicy
  • AmazonEKS_CNI_Policy
  • AmazonEC2ContainerRegistryReadOnly

要将策略附加到角色,请参阅添加 IAM 身份权限(控制台)

为您的 Worker 节点配置用户数据

**注意:**如果您使用 AWS CloudFormation 启动 Worker 节点,则无需为 Worker 节点配置用户数据。如果不是,请按照在 AWS 管理控制台中启动自管 Amazon Linux 节点的说明进行操作。

如果您使用托管节点组启动 Worker 节点,则无需使用 Amazon EKS 优化的 Amazon Linux AMI 配置任何用户数据。只有在使用定制 AMI 通过托管节点组启动 Worker 节点时,才必须配置用户数据。

如果您使用带有定制启动模板的亚马逊托管节点组,请在启动模板中指定正确的用户数据。如果 Amazon EKS 集群是使用 VPC 端点建立连接的完全私有集群,则在用户数据中指定以下内容:

  • certificate-authority
  • api-server-endpoint
  • DNS 集群 IP

如果需要,提供用户数据以将参数传递给 Amazon EKS 优化的 Linux/Bottlerocket AMI 中包含的 bootstrap.sh 文件

要为您的 Worker 节点配置用户数据,请在启动 Amazon EC2 实例时指定相关用户数据

例如,如果您使用第三方工具,例如 Terraform,则更新用户数据字段以启动您的 EKS Worker 节点:

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

重要信息:

  • ${ClusterName} 替换为您的 EKS 集群的名称。
  • ${BootstrapArguments} 替换为其他引导值,或者将此属性留空。

验证您的 Amazon VPC 子网的网络配置是否正确

  • 如果您使用互联网网关,请确保它正确连接到路由表,没有任何黑洞。
  • 如果您使用 NAT 网关,请确保它在公共子网中配置正确。此外,请验证路由表中没有包含任何黑洞。
  • 如果您为完全私有集群使用 VPC 私有端点,请确保您有以下端点:
    com.amazonaws.region.ec2(接口端点)
    com.amazonaws.region.ecr.api(接口端点)
    com.amazonaws.region.ecr.dkr(接口端点)
    com.amazonaws.region.s3(网关端点)
    com.amazonaws.region.sts(接口端点)
  • 您为服务账户配置了 IAM 角色的容器组(pod)从 AWS Security Token Service(AWS STS)API 调用中获取凭证。如果没有出站互联网访问权限,则必须在 VPC 中创建和使用 AWS STS VPC 端点。
  • VPC 端点的安全组必须具有允许来自端口 443 的流量的入站规则。有关更多信息,请参阅使用安全组控制流向资源的流量
  • 确保附加到 VPC 端点的策略具有所需的权限。

**注意:**如果您正在使用任何其他 AWS 服务,则必须创建这些端点。有关一些常用服务和端点的信息,请参阅私有集群要求。此外,您可以基于自己的应用案例创建端点服务

确认您的 Worker 节点与 EKS 集群位于同一 Amazon VPC 中

  1. 打开 Amazon EKS 控制台
  2. 选择集群,然后选择您的集群。
  3. 网络部分中,确定与您的集群关联的子网。

**注意:**您可以配置不同的子网来启动您的 Worker 节点。子网必须存在于同一 Amazon VPC 中并配置了合适的标签。Amazon EKS 仅自动管理您在集群创建期间配置的子网的标签。因此,请确保为子网配置适当的标签。

有关更多信息,请参阅子网要求和注意事项

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

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

要检查 aws-auth ConfigMap 文件,请运行以下命令:

kubectl describe configmap -n kube-system aws-auth

如果 aws-auth ConfigMap 的配置不正确,那么您会看到以下错误:

571 reflector.go:153\] k8s.io/kubernetes/pkg/kubelet/kubelet.go:458 : Failed to list \*v1.Node: Unauthorized

确保您的 Worker 节点满足安全组要求

确认您的控制面板安全组和 Worker 节点安全组是按照入站和出站流量设置的最佳实践进行设置的。此外,请确认您的自定义网络 ACL 规则已配置为允许流量通过端口 804431025-65535 进出 0.0.0.0/0

为您的 Worker 节点设置标签

对于 Worker 节点的标签属性,将密钥设置为 kubernetes.io/cluster/clusterName 并将设置为自有

有关更多信息,请参阅 VPC 要求和注意事项

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

请考虑以下事项:

  • 您可以在与路由表关联的子网中启动 Worker 节点,该路由表通过 NAT 或互联网网关路由到 API 端点。
  • 如果您在受限的私有网络中启动 Worker 节点,请确认您的 Worker 节点可以访问 EKS API 服务器端点。
  • 如果您使用自定义 DNS 而不是 AmazonProvidedDNS 的 Amazon VPC 启动 Worker 节点,则它们可能无法解析端点。当端点的公共访问被停用并且仅激活私有访问权限时,就会出现端点无法解析的情况。有关更多信息,请参阅为 Amazon EKS 集群端点启用 DNS 解析

确认已为您的集群正确配置了集群角色

您的集群必须要有拥有最低 AmazonEKSClusterPolicy 权限的集群角色。此外,您的集群的信任关系必须允许 eks.amazonaws.com 服务执行 sts:AssumeRole

示例:

{
  "Version": "2012-10-17",
  "Statement": \[
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "eks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  \]
}

有关更多信息,请参阅 Amazon EKS 集群 IAM 角色

确认区域 STS 端点已激活

如果集群位于支持 STS 端点的区域,则激活区域 STS 端点来验证 kubelet。然后 kubelet 就可以创建节点对象。

确保将 AMI 配置为可与 EKS 配合工作并包含必需的组件

如果用于 Worker 节点的 AMI 不是 Amazon EKS 优化的 Amazon Linux AMI,请确认以下 Kubernetes 组件处于活动状态:

  • kubelet
  • AWS IAM 身份验证器
  • Docker(Amazon EKS 版本 1.23 及更早版本)
  • containerd

使用 SSH 连接到您的 EKS Worker 节点实例并查看 kubelet 代理日志

kubelet 代理被配置为系统服务。

1.要验证您的 kubelet 日志,请运行以下命令:

journalctl -f -u kubelet

2.要解决任何问题,请查看 Amazon EKS 故障排除指南以了解常见错误。

使用 Amazon EKS 日志收集器脚本对错误进行故障排除

您可以使用日志文件和操作系统日志来解决 Amazon EKS 中的问题。

您必须使用 SSH 连接到出现问题的 Worker 节点并运行以下脚本:

curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh

sudo bash eks-log-collector.sh

相关信息

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

AWS 官方
AWS 官方已更新 1 年前