如何对 Amazon EKS 集群和节点组的 eksctl 问题进行故障排除?

上次更新日期:2022 年 1 月 6 日

当我使用 eksctl 创建或更新 Amazon Elastic Kubernetes Service (Amazon EKS) 时,我遇到了问题。

简短描述

以下是您在使用 eksctl 创建或管理 Amazon EKS 集群或节点组时可能遇到的常见问题:

  • 您不知道如何使用 eksctl 创建集群。请参阅 Amazon EKS 入门 - eksctl创建 Amazon EKS 集群eksctl 部分
  • 您不知道如何为托管节点组指定 kubelet 引导选项。按照“指定 kubelet 引导选项解决方案”部分中的步骤进行操作。
  • 您不知道如何更改现有节点组的实例类型。您必须新建节点组。请参阅迁移到新节点组节点组不变性(来自 eskctl 网站)。
  • 您已达到 AWS 资源的最大数量。检查您的资源,了解是否可以删除未在使用的资源。如果您仍需要更多容量,请参阅请求增加配额
  • 您可以在容量有限的可用区中启动控制面板实例。请参阅如何解决 Amazon EKS 中的集群创建错误?
  • 您的节点无法进入就绪状态。按照“解决操作超时问题解决方案”部分中的步骤进行操作。
  • 集群的导出值不存在。按照“在私有子网中创建节点组解决方案”部分中的步骤进行操作。
  • 您使用了不受支持的实例类型来创建集群或节点组。按照“检查您的实例类型是否受支持解决方案”部分中的步骤进行操作。

解决方案

指定 kubelet 引导选项

默认情况下,eksctl 会创建一个引导脚本,并将其添加到 Worker 节点在引导过程中运行的启动模板中。要指定自己的 kubelet 引导选项,请使用 overrideBootstrapCommand 规范覆盖 eksctl 引导脚本。对托管节点组和自主管理节点组使用 overrideBootstrapCommand

配置文件规范:

managedNodeGroups:
  name: custom-ng
  ami: ami-0e124de4755b2734d
  securityGroups:
    attachIDs: ["sg-1234"]
  maxPodsPerNode: 80
  ssh:
    allow: true
  volumeSize: 100
  volumeName: /dev/xvda
  volumeEncrypted: true
  disableIMDSv1: true
  overrideBootstrapCommand: |#!/bin/bash/etc/eks/bootstrap.sh managed-cluster --kubelet-extra-args '--node-labels=eks.amazonaws.com/nodegroup=custom-ng,eks.amazonaws.com/nodegroup-image=ami-0e124de4755b2734d'

注意:只有在使用自定义 AMI 时,才能使用 overrideBootstrapCommand。如果您未指定 AMI ID,则集群创建将失败。

未指定自定义 AMI ID

如果您在创建托管节点组时未指定自定义 AMI ID,则 EKS 会默认使用 Amazon EKS 优化的 AMI 和引导脚本。要使用 Amazon EKS 优化的 AMI,同时使用自定义用户数据来指定引导参数,您可以在托管节点组配置中指定 AMI ID。

要获取最新 Amazon EKS 优化 AMI 的最新 AMI ID,请运行以下命令:

aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.21/amazon-linux-2/recommended/image_id --region Region --query "Parameter.Value" --output text

注意:请将 Region 替换为您的 AWS 区域。

解决操作超时问题

您正在创建节点,但收到以下错误:

waiting for at least 1 node(s) to become ready in "nodegroup"

当您使用 eksctl 创建 EKS 节点组时,eksctl CLI 会连接到 API 服务器以持续检查 Kubernetes 节点的状态。CLI 等待节点进入就绪状态,如果节点移动失败,则最终会超时。

以下是节点无法进入就绪状态的原因:

  • 在引导过程中,kubelet 无法与 EKS API 服务器端点通信或进行身份验证。
  • aws-nodekube-proxy Pod 未处于运行状态。
  • Amazon Elastic Compute Cloud (Amazon EC2) Worker 节点用户数据未成功运行。

kubelet 无法与 EKS API 服务器端点通信

如果 kubelet 在引导过程中无法与 EKS API 服务器端点通信,请获取 EKS API 服务器端点。

在 Worker 节点上运行以下命令:

curl -k https://123456DC0A12EC12DE0C12BC312FCC1A.yl4.us-east-1.eks.amazonaws.com
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {
    
  },
  "status": "Failure",
  "message": "forbidden: User \"system:anonymous\" cannot get path \"/\"",
  "reason": "Forbidden",
  "details": {
    
  },
  "code": 403
}

前面的命令应该返回 HTTP 403 状态码。如果命令超时,则在 EKS API 服务器和 Worker 节点之间可能存在网络连接问题。

要解决此连接问题,请完成以下与您的使用案例相关的步骤之一:

  • 如果 Worker 节点位于私有子网中,请检查 EKS API 服务器端点是否处于私有公有和私有访问模式。
  • 如果 EKS API 服务器端点设置为私有,则必须为私有托管区域应用特定规则,才能将流量路由到 API 服务器。Amazon Virtual Private Cloud (Amazon VPC) 的属性 enableDnsHostnamesenableDnsSupport 必须设置为 True。此外,为 Amazon VPC 设置的 DHCP 选项必须在其域列表中包含 AmazonProvideDNS
  • 如果您在公有子网中创建了节点组,请确保将子网的 IPv4 公有寻址属性设置为 True。如果未将此属性设置为 True,则不会为 Worker 节点分配公有 IP 地址,也无法访问互联网。
  • 检查 Amazon EKS 集群安全组是否允许来自 Worker 节点安全组的端口 443 的入口请求。

kubelet 无法使用 EKS API 服务器端点进行身份验证

如果 kubelet 在引导过程中无法通过 EKS API 服务器端点进行身份验证,请完成以下步骤。

1.    运行以下命令以验证 Worker 节点是否有权访问 STS 端点:

telnet sts.region.amazonaws.com 443

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

2.    确保 Worker 节点的 IAM 角色已添加到 aws-auth ConfigMap 中。

例如:

apiVersion:v1 kind:ConfigMap metadata:name:aws-auth namespace:kube-system data:mapRoles:|
    - rolearn: ARN of instance role (not instance profile)
      username: system:node:{EC2PrivateDNSName}}
      groups:
        - system:bootstrappers
        - system:nodes

注意:对于 Microsoft Windows 节点组,必须为节点组 IAM 角色的 mapRoles 部分添加额外的 eks:kube-proxy-windows RBAC 组。

aws-node 和 kube-proxy Pod 未处于“运行”状态

要检查 aws-nodekube-proxy Pod 是否处于运行状态,请运行以下命令:

kubectl get pods -n kube-system

如果 aws-node Pod 处于失败状态,请检查 Worker 节点与 Amazon EC2 端点之间的连接:

ec2.region.amazonaws.com

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

检查 AWS 托管策略 AmazonEKSWorkerNodePolicyAmazonEC2ContainerRegistryReadOnly 是否已连接到节点组的 IAM 角色。

如果节点位于私有子网中,则必须配置 Amazon ECR VPC 终端节点以允许从 Amazon Elastic Container Registry (Amazon ECR) 提取镜像。

如果您将 IRSA 用于 Amazon VPC CNI,请将 AmazonEKS_CNI_Policy AWS 托管策略连接到 aws-node Pod 使用的 IAM 角色。您还必须在没有 IRSA 的情况下将策略连接到节点组的 IAM 角色。

EC2 Worker 节点用户数据未成功运行

要检查用户数据运行时是否出现任何错误,请查看 /var/log/cloud-init.log/var/log/cloud-init-output.log 上的 cloud-init 日志。

要收集更多信息,请在 Worker 节点上运行 EKS 日志收集器脚本

在私有子网中创建节点组

您正在创建节点组,但收到以下错误:

No export named eksctl--cluster::SubnetsPublic found. Rollback requested by user

如果您使用 PrivateOnly 联网创建了 Amazon EKS 集群,那么 AWS CloudFormation 无法创建公有子网。这意味着公有子网的导出值将不存在。如果集群的导出值不存在,则节点组创建将失败。

要解决此问题,可以在使用 eksctl 内联命令时包含 --node-private-networking 标志。您也可以在节点组配置中使用 privateNetworking: true 规范来请求在私有子网中创建节点组。

更新您的 eksctl 版本或指定正确的 AWS 区域

您收到以下错误:

no eksctl-managed CloudFormation stacks found for "cluster-name"

如果您使用的是早于 0.40.0 的 eksctl 版本,则只能查看或管理使用 eksctl 创建的 Amazon EKS 资源。要管理并非使用 eksctl 创建的资源,请将 eksctl 更新为 0.40.0 或更高版本。要了解可以为并非使用 eksctl 创建的集群运行的命令,请参阅非 eksctl 创建的集群(来自 eksctl 网站)。

此外,如果您指定了错误的 AWS 区域,则找不到 eksctl 托管的 CloudFormation 堆栈。要解决此问题,请确保指定 Amazon EKS 资源所在的正确区域。

检查您的实例类型是否受支持

如果您使用不受支持的实例类型创建集群或节点,则会收到以下错误:

You must use a valid fully-formed launch template. The requested configuration is currently not supported. Please check the documentation for supported configurations'

要检查您的实例类型或其他配置在特定 AWS 区域中是否受支持,请运行以下命令:

aws ec2 describe-instance-type-offerings --region Region --query 'InstanceTypeOfferings[*].{InstanceType:InstanceType}'

注意:请将 Region 替换为您的 AWS 区域。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?