
EKS Managed Node Group: 解决 Ec2SubnetInvalidConfiguration 错误
Amazon Elastic Kubernetes Service(EKS)是一个托管的 Kubernetes 服务,使许多 Kubernetes 的管理者能够在数十分钟内通过命令快速创建及轻松在 AWS 上运行 Kubernetes Cluster,并且简化了许多操作;2019 年 EKS 发布了新的 API 支持 Managed Node Groups (托管式工作节点) 1,并且能够自动创建和管理 EC2 instances,并将这些 instances 加入到 Kubernetes 集群中,使得用户能够更轻松新增、扩展 Kubernetes Cluster 所需要的运算节点数量,甚至能够通过 API 或一键集成的方式升级节点的版本。
然而,在新增、升级 Managed Node Groups 的过程,有可能会遇到 Ec2SubnetInvalidConfiguration
错误,因此,本文将进一步分析这个错误的原因、常见情境以及解决方法。
如何确认该问题
要检查 EKS Managed Node Groups 是否存在 Ec2SubnetInvalidConfiguration
错误,可以通过 EKS Console 或是 AWS CLI 命令确认是否存在任何健康检查错误 (Health Issue)。例如,通过点击 Cluster 底下的 Compute
页签 > 点击 Node groups
进入到节点组的详细页面后,可以检查 Health Issues
页签是否存在相关的错误信息:
根据文件提到 EKS Managed Node Group 的升级流程 2,如果升级或是新建节点超过 15-20 分钟后卡住,很可能是某些原因使得工作节点在运作时存在一些问题,过一段时间后,通常有机会通过这些信息进一步排查可能的原因。以下是使用 AWS CLI 命令的范例:
$ aws eks describe-nodegroup --nodegroup-name broken-nodegroup --cluster eks --region eu-west-1
{
"nodegroup": {
"nodegroupName": "broken-nodegroup",
"clusterName": "eks",
"version": "1.25",
"releaseVersion": "1.25.9-20230526",
"status": "CREATE_FAILED",
"capacityType": "ON_DEMAND",
"subnets": [
"subnet-AAAAAAAAAAAAAAAAA",
"subnet-BBBBBBBBBBBBBBBBB"
],
"amiType": "AL2_x86_64",
"health": {
"issues": [
{
"code": "Ec2SubnetInvalidConfiguration",
"message": "One or more Amazon EC2 Subnets of [subnet-AAAAAAAAAAAAAAAAA, subnet-BBBBBBBBBBBBBBBBB] for node group broken-nodegroup does not automatically assign public IP addresses to instances launched into it. If you want your instances to be assigned a public IP address, then you need to enable auto-assign public IP address for the subnet. See IP addressing in VPC guide: https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip",
"resourceIds": [
"subnet-AAAAAAAAAAAAAAAAA",
"subnet-BBBBBBBBBBBBBBBBB"
]
}
]
},
"updateConfig": {
"maxUnavailable": 1
},
...
}
}
上述范例为在创建节点组时发生失败并且处于 CREATE_FAILED
状态。
常见情境和发生原因
按照错误异常的定义 3,可以简单得知这个错误通常是由于 EKS Managed Node Group 所指定的 subnet 没有启用 auto-assign public IP address (自动分配 IP 地址) 导致。
默认情况下,当 Managed Node Group 在创建 EC2 instances 时,会需要依赖 Subnet 本身启用这项功能,如果 subnet 没有启用 auto-assign public IP address,EC2 instances 会无法获取到公开的 IP 位址 (Public IPv4),因此将无法与 Internet 进行通讯。EKS Managed Node Groups 的这项检查同时衍生了两个不同的使用情境:Public Subnet (公有子网) 跟 Private Subnet (私有子网)。
Public Subnet 与 Private Subnet 是指在 Amazon Virtual Private Cloud (VPC) 中设定不同的 Subnet。其中,Public Subnet 意味着在这个 Subnet 中的资源可以直接与 Internet 进行通讯、连到公开的互联网,而 Private Subnet 则无法直接与 Internet 进行通讯:
(图片来源:Amazon Virtual Private Cloud 使用手册 4)
简单来说,如果 Subnet 存在指向 Internet Gateway 资源的路由 (0.0.0.0/0
),通常可以视为预期这个 Subnet 将能够直接通往 Internet 的大门,反之,这个 Subnet 预计规划存在有限且私有的网络环境中。
在 Public Subnet (公有子网) 遇到这个错误
在之前,由于 EKS 在创建 Managed Node Groups 时默认会帮所有节点组底下的 Node Groups 启用跟配发 Public IPv4 地址 (不论是否放在 Public Subnet 或是 Private Subnet),但目前这项功能已经于 2020 年得到更新 5。因此,如果你预期你部署的 EKS Managed Node Groups 需要配发公开的 IPv4 地址,并且允许直接与互联网连线。
在这种情况下,在创建或是升级 Managed Node Groups 使用 Public Subnet 时,需要确保 Subnet 本身的设定允许自动配发 Public IPv4 地址 (MapPublicIpOnLaunch
):
$ aws ec2 describe-subnets --subnet-ids subnet-XXXXXXXXX
"Subnets": [
{
"CidrBlock": "192.168.64.0/19",
"MapPublicIpOnLaunch": true,
"State": "available",
"SubnetId": "subnet-XXXXXXXXXXX",
"VpcId": "vpc-XXXXXXXXXXX",
...
}
]
在 Private Subnet (私有子网) 遇到这个错误
但你可能会说:「我本来预期这个 Subnet 就是 Private Subnet,甚至我可能一开始创建时都正常」您可能会好奇,为什么 EKS Managed Groups 可能在运行阶段或是升级过程会提示我的 Node Groups 指定的 Subnet 没有自动关联 Public IPv4 地址。
对于 Amazon EKS,VPC 关联 Subnet 的属性仍适用前面所提到的原则 6,因此,在很大机率下,这通常涉及相关 Subnet 路由表设定的错误:
- A public subnet is a subnet with a route table that includes a route to an internet gateway, whereas a private subnet is a subnet with a route table that doesn’t include a route to an internet gateway.
例如:以下是一个在环境中 Node Groups 运行一段时间后因为 Subnet 设置问题导致节点组处于 DEGRADED
状态,并存在错误信息。
解决方法和相关步骤
Public Subnet (公有子网)
为了解决这个问题,若你在部署 Managed Node Groups 选择的是 Public Subnet,需要确保 Subnet 启用了 Auto-assign Public IP address 功能,参考以下步骤:
- 登录 AWS Console,并进入 VPC 管理页面。
- 选择您要使用的 Subnet > Edit Subnet Settings,然后选择「Enable auto-assign public IPv4 address」。
- 勾选后点击保存
完成这些步骤后,如果节点状态为失败,可以将失败的 Managed Node Groups 删除后再次重新创建一个新的 Managed Node Group,并且选择上述的 Subnet。在由 EKS 启动这些 EC2 instances 时,就能根据 Subnet 的设定正确获取到 Public IP 位址。
如果您遇到的问题不是由于 subnet 没有启用 auto-assign public IP address 所导致的,请参考错误信息 3。
Private Subnet (私有子网)
在前面的内容中描述了一个在预期的私有子网遇到这个错误,这通常很可能是因为 EKS 尝试启动或是检查 Managed Node Groups 所使用的 Subnet 时,因为路由指向 Internet Gateway 而认为这个 Subnet 属于 Public Subnet,而不是预期的 Private Subnet 属性,最终获得这样的异常信息:
要解决这个问题,可以通过正确的设定 Private Subnet 对应的 Route Table (路由表) 并且保留 VPC 内部的请求,同时设定正确的非 VPC 请求路由 (例如:针对 0.0.0.0/0
路由移除 Internet Gateway),指向其他目标像是 NAT Gateway 同样提供仅内部向外部访问互联网的能力,以确保工作节点在启动时仍可以从其他来源下载 Image (例如:Docker Hub)、跟 EKS API Server 互动等。
总结
在这篇内容中,我们提到了当创建或升级 EKS Managed Node Group 时遇到 Ec2SubnetInvalidConfiguration
错误的常见情境和发生原因。在 Public Subnet 情况下,需要确保 Subnet 启用了 Auto-assign Public IP address 功能;在 Private Subnet 情况下,需要通过正确的设定 Private Subnet 对应的 Route Table 并且保留 VPC 内部的请求,同时设定正确的非 VPC 请求路由,指向其他目标,像是 NAT Gateway。
通过遵循上述的解决方法和相关步骤,希望能帮助在阅读这篇内容的你更有方向的排查并且解决这个错误,确保 Managed Node Group 正常运行。
参考资源