如何排查 Amazon EKS 集群的 API 服务器终端节点的问题?

上次更新时间:2021 年 12 月 10 日

我无法运行 kubectl 命令。此外,我在自己的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上,将终端节点访问权限设置从“public”(公有)更改为“private”(私有)。现在,我的集群停留在“Failed”(失败)状态。

简短描述

如果您的 Kubernetes API 服务器终端节点有问题,请完成以下其中一个部分中的步骤:

  • 无法在新集群或现有集群上运行 kubectl 命令
  • 在将终端节点访问权限设置从“public”(公有)更改为“private”(私有)后,无法在集群上运行 kubectl 命令
  • 我的集群停留在 Failed(失败)状态,并且无法将终端节点访问权限设置从“public”(公有)更改为“private”(私有)

注意:要设置对 Kubernetes API 服务器终端节点的访问权限,请参阅如何设置对 Amazon EKS 中的 API 服务器的公有和私有访问权限?

解决方法

无法在新集群或现有集群上运行 kubectl 命令

1.    确认使用正确的 kubeconfig 文件来连接您的集群。有关更多信息,请参阅使用 kubeconfig 文件组织集群访问(来自 Kubernetes 网站)。

2.    在 kubeconfig 文件中检查每个集群是否有多个上下文。

示例输出:

kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
Cluster name    Server
new200.us-east-2.eksctl.io       https://D8DC9092A7985668FF67C3D1C789A9F5.gr7.us-east-2.eks.amazonaws.com

如果现有的 kubeconfig 文件没有正确的集群详细信息,请使用以下命令创建具有正确详细信息的集群:

aws eks update-kubeconfig --name cluster name --region region

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

3.    使用端口 443 上的 telnet 验证从您的设备到 API 服务器终端节点的连接性。

示例输出:

echo exit | telnet D8DC9092A7985668FF67C3D1C789A9F5.gr7.us-east-2.eks.amazonaws.com 443
Trying 18.224.160.210...
Connected to D8DC9092A7985668FF67C3D1C789A9F5.gr7.us-east-2.eks.amazonaws.com.
Escape character is '^]'.
Connection closed by foreign host.

如果 telnet 无法正常工作,请使用以下步骤进行故障排除:

检查 DNS 解析程序

如果 API 服务器无法解析,则表示 DNS 解析程序存在问题。

kubectl 命令失败的同一设备上运行以下命令:

nslookup APISERVER endpoint

注意:请将 APISERVER endpoint 替换为您的 APISERVER 终端节点。

检查您是否限制了对 API 服务器终端节点的公有访问

如果您指定了 CIDR 块来限制对公有 API 服务器终端节点的访问权限,则最佳实践是同时激活私有终端节点访问权限。

4.    检查 API 服务器端点访问行为。请参阅修改集群终端节点访问权限

在将终端节点访问权限设置从“public”(公有)更改为“private”(私有)后,无法在集群上运行 kubectl 命令

1.    确认您使用堡垒主机或连接的网络(例如,对等 VPC、AWS Direct Connect 或 VPN)来访问 Amazon EKS API 终端节点。

注意:在私有访问模式中,您只能从集群的 VPC 内访问 Amazon EKS API 终端节点。

2.    检查安全组或网络访问控制列表是否会阻止 API 调用。

如果您跨对等 VPC 访问您的集群,那么请确认该控制面板安全组允许从对等 VPC 访问端口 443 的控制面板安全组。此外,验证对等 VPC 的端口 53 相互开放。端口 53 用于 DNS 解析。

我的集群停留在“Failed”(失败)状态,并且无法将终端节点访问权限设置从“public”(公有)更改为“private”(私有)

您的集群可能因为 AWS Identity and Access Management (IAM) 的权限问题而处于 Failed(故障)状态。

1.    确认用户的 IAM 角色已获得授权执行 AssociateVPCWithHostedZone 操作。

注意:如果操作未被阻挡,则检查用户的账户中的 AWS Organizations 策略是否阻止了 API 调用并导致集群发生故障。

2.    确认 IAM 用户的权限未在账户以上的任何级别被隐式或显式阻止。

注意:如果 IAM 用户权限未包含在 Allow 策略语句中,则会被隐式阻止。如果它包含在 Deny 策略声明中,则会被显式阻止。即使账户管理员向该用户附加了权限为 */*AdministratorAccess IAM 策略,权限仍会被阻挡。来自 AWS Organizations 策略的权限会覆盖对 IAM 实体的权限。