跳至内容

为什么 Worker 节点无法加入我的 Amazon EKS 集群?

4 分钟阅读
0

我尝试将 Worker 节点加入我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群。我收到了错误消息,或者节点没有加入集群。

简短描述

当您尝试将 Worker 节点加入您的 Amazon EKS 集群时,可能会遇到以下问题之一:

  • 当您在 EKS 集群中创建托管节点组时,托管节点组进入 Create failed(创建失败)状态。Worker 节点不加入 EKS 集群,并且您会收到错误消息,“Instances failed to join the kubernetes cluster”。
  • 升级 EKS 集群中的托管节点组时,新的 Worker 节点无法加入 EKS 集群。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

使用 Systems Manager Automation 运行手册

使用 AWSSupport-TroubleshootEKSWorkerNode 运行手册来确定您的 Worker 节点不加入集群的原因。

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

要运行自动化,请完成以下步骤:

  1. Systems Manager 控制台上,打开 AWSSupport-TroubleshootEKSWorkerNode 运行手册。
  2. 注意:查看运行手册的文档详细信息部分可以了解有关运行手册的更多信息。
  3. 检查您是否将 AWS 区域设置为与集群相同的区域。
  4. 输入参数部分中,在 ClusterName 字段中输入集群的名称,在 WorkerID 字段中输入 Amazon EC2 实例 ID。
  5. (可选)在 AutomationAssumeRole 字段中,输入允许自动化为您执行操作的 IAM 角色的 Amazon 资源名称 (ARN)。如果您未指定 IAM 角色,则自动化将使用启动运行手册的用户的权限。
  6. 选择 Execute(执行)。
  7. 查看输出部分,以确定问题的原因以及可以执行的解决此问题的步骤。

验证您的 Amazon VPC 的 DNS 支持

确认您在 EKS 集群的 Amazon Virtual Private Cloud (Amazon VPC) 中启用了 DNS 主机名和 DNS 解析

验证您的实例配置文件的 Worker 节点是否具有正确的权限

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

确保组织或账户级别的权限边界或服务控制策略 (SCP) 不限制 Worker 节点进行 API 调用。

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

**注意:**如果使用 AWS CloudFormation 启动 Worker 节点,则无需为 Worker 节点配置用户数据。请使用 CloudFormation 控制台启动自行管理的 Amazon Linux 节点

如果使用托管节点组启动 Worker 节点,则无需使用 Amazon EKS 优化的 Amazon Linux 亚马逊机器映像 (AMI) 配置用户数据。仅在使用自定义 AMI 通过托管节点组启动 Worker 节点时配置用户数据。

如果使用带有自定义启动模板的 Amazon EKS 托管节点组,请在启动模板中指定正确的用户数据。如果 Amazon EKS 集群是使用 VPC 端点进行连接的完全私有集群,则必须更新用户数据。在用户数据中指定证书颁发机构 (CA)、API 服务器端点和 DNS 集群 IP 地址。

用户数据配置示例:

#!/bin/bash
set -ex
B64_CLUSTER_CA=CA-CERT
API_SERVER_URL=ENDPOINT
K8S_CLUSTER_DNS_IP=IP-ADDRESS
/etc/eks/bootstrap.sh ${ClusterName} ${BootstrapArguments} —b64-cluster-ca $B64_CLUSTER_CA —apiserver-endpoint $API_SERVER_URL —dns-cluster-ip $K8S_CLUSTER_DNS_I

**注意:**将 CA-CERTENDPOINTIP-ADDRESS 替换为您的实例中的值。此外,如果需要,将 ${ClusterName} 替换为您的 EKS 集群的名称,并将 ${BootstrapArguments} 替换为额外的引导值。

如果您必须提供用户数据才能将参数传递给 Amazon EKS 优化的 Linux/Bottlerocket AMI 的 bootstrap.sh 文件,请在启动模板的 ImageField 中指定 AMI ID。

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

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

用户数据配置示例:

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

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

如果您使用 Amazon Linux 2023 AMI,请按以下格式向用户数据添加所需的最低参数:

MIME-Version: 1.0Content-Type: multipart/mixed; boundary="//"

--//
Content-Type: application/node.eks.aws

---
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
  cluster:
    apiServerEndpoint: https://example.com
    certificateAuthority: Y2VydGlmaWNhdGVBdXRob3JpdHk=
    cidr: 10.100.0.0/16
    name: my-cluster

--//--

验证您是否正确配置了 Amazon VPC 子网的网络,并且您的 Worker 节点与 EKS 集群是否位于同一 Amazon VPC 中

如果您使用互联网网关,请确认您已将其正确连接到路由表。

如果使用 NAT 网关,请确保它在公有子网中配置正确。此外,请验证您是否已正确配置路由表。

如果对完全私有集群使用 VPC 私有端点,请确认您有以下接口端点:

  • com.amazonaws.region.ec2
  • com.amazonaws.region.ecr.api
  • com.amazonaws.region.ecr.dkr
  • com.amazonaws.region.sts

另外,请确保您有网关端点 com.amazonaws.region.s3

您可以限制 Amazon ECR 的 Amazon Simple Storage Service (Amazon S3) 网关 VPC 端点策略。有关详细信息,请参阅 Amazon ECR 的最低 Amazon S3 存储桶权限

您为服务账户配置了 IAM 角色的容器组从 AWS Security Token Service (AWS STS) API 调用中获取凭证。如果没有出站互联网访问权限,则必须在 VPC 中创建和使用 AWS STS VPC 端点。

VPC 端点的安全组必须具有允许来自端口 443 的流量的入站规则。有关详细信息,请参阅使用安全组控制指向 AWS 资源的流量

确保附加到 VPC 端点的策略具有对特定服务进行 API 调用所需的权限。

在 EKS 集群的网络部分中,确定与您的集群关联的子网。确认它们属于同一 VPC。

您必须为您使用的每一项 AWS 服务创建单独的端点。有关常见 AWS 服务的端点列表,请参阅容器组要求中的表。您还可以基于自己的使用案例创建端点服务

另外,您可以配置不同的子网来启动您的 Worker 节点。子网必须存在于同一 Amazon VPC 中,您必须对其配置合适的标签。Amazon EKS 仅自动管理您在集群创建期间配置的子网的标签。有关详细信息,请参阅子网要求和注意事项

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

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

运行以下命令:

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”

如果您使用 EKS API 身份验证方法,请为 NodeInstanceRole 创建访问条目。对于 Type(类型),选择 EC2_linux

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

确认您的控制面板的安全组和 Worker 节点安全组已配置针对入站和出站流量的所需设置。此外,请确认您已将网络访问控制列表(网络 ACL)规则配置为允许端口 80、443 和 1025-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 节点,则这些 Worker 节点可能无法解析端点。

**注意:**当您停用对端点的公共访问权限并仅激活私有访问权限时,该端点将无法解析。有关详细信息,请参阅为 Amazon EKS 集群端点启用 DNS 解析

确认 kubelet 是否可以访问所需的端点

运行以下命令来测试 kubelet 是否可以访问端点:

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

**注意:**请将 region 替换为您的区域。

确认您已正确配置集群角色

您必须将 AmazonEKSClusterPolicy 附加到您的 Amazon EKS 集群 IAM 角色。此外,您的集群的信任关系必须允许为 sts:AssumeRole 提供 eks.amazonaws.com 服务。

信任策略示例:

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

确认您已激活区域 STS 端点

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

确保您已将 AMI 配置为与 EKS 配合使用,并且 AMI 包含所需的组件

Amazon EKS 优化的 Amazon Linux AMI 包含与 EKS 集群配合使用所需的组件。如果 Worker 节点的 AMI 不是 Amazon EKS 优化的 Amazon Linux AMI,请确认以下 Kubernetes 组件处于 Active(活动)状态:

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

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

检查您是否已在 EKS Worker 节点实例中将 kubelet 代理配置为 systemd 服务。

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

journalctl -f -u kubelet

要解决问题,请参阅排查 Amazon EKS 集群和节点问题

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

使用日志文件和操作系统 (OS) 日志对 Amazon EKS 集群中的问题进行故障排除。Amazon EKS 集群 Worker 节点将 cloud-init 初始化日志存储在 /var/log/cloud-init-output.log/var/log/cloud-init.log 中。

要使用 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

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

如果您的 Amazon VPC 没有可用的 IP 地址,可以将辅助 CIDR 关联到您现有的 Amazon VPC。有关详细信息,请参阅查看 Amazon EKS 对 VPC 和子网的联网要求。EKS 优化的 AMI 包含与 EKS 集群配合使用所需的组件。

AWS 官方已更新 2 个月前