如何排查 Amazon EKS 集群升级失败的问题?

上次更新日期:2022 年 12 月 5 日

我的 Amazon Elastic Kubernetes Service(Amazon EKS)集群更新失败。如何解决此问题?

简短描述

如需解决 Amazon EKS 集群更新失败的问题,请尝试以下操作:

  • 对于 IpNotAvailable 错误,请验证与集群关联的子网是否有足够可用的 IP 地址。
  • 对于 SubnetNotFound 错误,请验证子网是否存在且标记正确。
  • 对于 SecurityGroupNotFound 错误,请验证与集群关联的安全组是否存在。
  • 对于 EniLimitReached 错误,请增加 AWS 账户的弹性网络接口配额。
  • 对于 AccessDenied 错误,请验证您是否有正确权限。
  • 对于 OperationNotPermitted 错误,请验证 Amazon EKS 服务角色是否有正确权限。
  • 对于 VpcIdNotFound 错误,请验证与集群关联的 VPC 是否存在。
  • 验证用于创建集群的资源是否已删除。
  • 对于使用 eksctl 创建的集群,请验证 AWS CloudFormation 堆栈是否无法回滚。
  • 对于 ResourceInUseException 错误,请稍等片刻再重试更新。
  • 对于暂时性后端工作流问题,请再次更新集群。

解决方法

请验证子网是否有可用 IP 地址(IpNotAvailable)

如需更新 Amazon EKS 集群,则每个子网中必须有五个可用 IP 地址。如果您没有足够的可用 IP 地址,则可以删除集群子网中未使用的网络接口。删除网络接口会释放 IP 地址。有关更多信息,请参阅删除网络接口

要在 Amazon EKS 集群子网中检查可用的 IP 地址,请执行以下操作:

1.    在您创建集群的区域中打开 Amazon EKS 控制台

2.    在侧栏中选择 Clusters(集群)。然后选择您的 Amazon EKS cluster(Amazon EKS 集群)。

3.    选择 Configuration(配置)选项卡。

4.    选择 Networking(联网)选项卡。

5.    在 Subnets(子网)下,选择一个子网以打开 Subnets(子网)页面。

6.    选择 subnet(子网),然后选择 Details(详细信息)选项卡。

7.    找到 Available IPv4 addresses(可用的 IPv4 地址),查看子网有多少可用 IP 地址。

从 AWS Command Line Interface,运行以下命令:

1.    获取与集群关联的子网:

$ aws eks describe-cluster --name cluster-name --region your-region

注意:请将 cluster-name 替换为集群名称,并将 your-region 替换为您的 AWS 区域。

输出:

...
   "subnetIds": [
                "subnet-6782e71e",
                "subnet-e7e761ac"
            ],
   ...

2.    描述前面输出中的子网:

aws ec2 describe-subnets --subnet-ids subet-id --region your-region

注意:subnet-id 替换为您子网的 ID,your-region 替换为您的区域。

输出:

...
"AvailableIpAddressCount": 4089,
...

如果您没有足够的可用 IP 地址,则可以将 aws-node 进程守护程序中的环境变量设置为 WARM_IP_TARGET:此参数定义了容器网络接口(CNI)必须为容器组(pod)保留的备用 IP 地址数。

$ kubectl set env ds aws-node -n kube-system WARM_IP_TARGET=number

注意:number 替换为要从子网中保留的 IP 地址数量。

您还可以使用变量 MINIMUM_IP_TARGET 来控制每个节点的最小 IP 地址数。

最佳实践是使用这些配置变量 来控制维护的网络接口和 IP 地址数量。

验证子网是否存在且标记正确(SubnetNotFound)

如需验证子网是否存在,请运行以下命令:

aws ec2 describe-subnets --subnet-ids subet-id --region region

注意:请将 subnet-id 替换为您的子网 ID,将 region 替换为子网所在区域。

如果子网不存在,则会收到以下错误:

An error occurred (InvalidSubnetID.NotFound) when calling the DescribeSubnets operation: The subnet ID 'subnet-id' does not exist

要验证 子网是否已正确标记,请执行以下操作:

1.    使用检查您是否有足够的可用 IP 地址(IpNotAvailable)部分中的步骤确定与集群关联的子网。

2.    打开 VPC 控制台

3.    在侧栏中选择 Subnets(子网)。

4.    选择应与集群关联的子网,然后在 Details(详细信息)窗格中选择 Tags(标签)选项卡。

5.    验证每个子网的标签是否正确:

Key - kubernetes.io/cluster/cluster-name

注意:上述标签仅添加至 Amazon EKS 集群版本 1.18 或更早版本。对于使用 Kubernetes 版本 1.19 及更高版本创建的集群,标签不是强制性的。将 cluster-name 替换为您的集群名称。

标签值可以共享或自有。

如果您有支持计划,请联系支持团队更新您的 Amazon EKS 子网。

验证与集群关联的安全组是否存在(SecurityGroupNotFound)

如需确定与集群关联的安全组,请执行以下操作:

1.    在您创建集群的区域中打开 Amazon EKS 控制台

2.    选择 cluster(集群)。

3.    选择 Configuration(配置)选项卡。

4.    选择 Networking(联网)选项卡。

5.    选择 Cluster security group(集群安全组)和 Additional security groups(其他安全组)下列出的集群安全组。

如果安全组存在,控制台将打开并显示安全组详细信息。

从 AWS CLI:

1.    获取与集群关联的安全组。

$ aws eks describe-cluster --name cluster-name --region your-region

注意:请将 cluster-name 替换为集群名称,并将 your-region 替换为您的区域。

输出:

...
"securityGroupIds": [
    "sg-xxxxxxxx"
]
...

2.    描述前面输出中的安全组:

$ aws ec2 describe-security-groups --group-ids security-group-id --region your-region

注意:security-group-id 替换为您的安全组 ID,your-region 替换为您的区域。

请增加 AWS 账户的弹性网络接口配额(EniLimitReached)

如果您已达到网络接口配额,则可以移除未使用的网络接口或请求提高限制

如果您的网络接口已连接到集群,请删除该集群以移除该网络接口。如果您的网络接口已连接到未使用的 Worker 节点,请删除自行管理节点组的 Auto Scaling 组。对于托管式节点组,请从 Amazon EKS 控制台中删除节点组。如需将工作负载从一个节点组移至另一个节点组,请参阅迁移到新节点组

验证您是否有正确权限(AccessDenied)

1.    打开 IAM 控制台

2.    在导航窗格中,选择 Roles(角色)或 Users(用户)。

3.    选择 role(角色)或 user(用户)。

4.    验证 IAM 角色或用户是否具有正确权限

验证服务角色是否有正确权限(OperationNotPermitted)

1.    打开 IAM 控制台

2.    在导航窗格中,选择 Roles(角色)。

3.    筛选 AWSServiceRoleForAmazonEKS 并选择角色。

4.    验证角色是否附加了 AmazonEKSServiceRolePolicy 策略。

如果未附加策略,请参阅添加 IAM 身份权限

验证关联集群的 VPC 是否存在(VpcNotFound)

1.    在您创建集群的区域中打开 Amazon EKS 控制台

2.    选择集群。

3.    选择 Configuration(配置)选项卡。

4.    选择 Networking(联网)选项卡。

5.    选择 VPC ID 链接,以查看该 VPC 是否存在。

如果 VPC 不存在,则必须创建一个新集群。

验证与集群关联的资源是否已被删除

如果集群是通过 Amazon EKS 控制台创建的,并且删除了用于创建集群的子网,则该集群将无法更新。您必须重新创建集群,然后将工作负载从旧集群移动到新集群。如果您有支持计划,请联系支持团队更新您的 Amazon EKS 子网。

验证 AWS CloudFormation 堆栈是否无法回滚(eksctl)

请稍等片刻,然后再次启动控制面板更新(ResourceInUseException)

如果您在启动更新时正在执行自动的 Amazon EKS 控制面板操作(例如 平台版本更新),则会出现此错误。Amazon EKS 会自动检测和替换运行状况不佳的控制面板实例,并自动升级版本和安装补丁。请等候自动操作完成,然后再次启动控制面板更新。

注意:需要等候的时间取决于自动更新的开始时间。如果您不确定自动操作何时会完成,请等待一个小时后再重试控制面板更新。

再次更新集群

暂时性问题可能导致后端工作流不稳定。如果前面的问题排查步骤与您的问题无关,请再次尝试更新集群。


这篇文章对您有帮助吗?


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