我无法运行 kubectl 命令。此外,我将我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上的端点访问设置从公有更改为私有。现在,我的集群停留在“失败”状态。
简短描述
根据您的问题,请完成以下其中一个部分的步骤。
**注意:**要设置对 Kubernetes API 服务器端点的访问权限,请参阅修改集群端点的访问权限。
解决方法
您无法在新集群或现有集群上运行 kubectl 命令
确认 kubeconfig 文件已连接到您的集群
完成以下步骤:
- 确认您用于连接集群的 kubeconfig 文件是正确的。有关更多信息,请参阅 Kubernetes 网站的 Organizing cluster access using kubeconfig files 文章。
- 检查 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 区域。
- 使用端口 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 替换为集群的 API 服务器端点。
检查您是否限制了对 API 服务器端点的公有访问
如果指定了 CIDR 块来限制对公有 API 服务器端点的访问,则最佳做法是同时激活私有端点访问权限。
检查 API 服务器端点访问行为。请参阅修改集群端点访问。
将端点访问权限从公有更改为私有后,您无法在集群上运行 kubectl 命令
要解决此问题,请完成以下步骤:
- 确认使用堡垒主机或连接的网络(例如对等虚拟私有云(VPC)、AWS Direct Connect 或 VPN)来访问 Amazon EKS API 端点。
**注意:**在私有访问模式下,您只能从集群的 VPC 或连接的网络访问 Amazon EKS API 端点。
- 检查安全组或网络访问控制列表是否阻止了对 Kubernetes API 服务器的请求。
如果您通过对等 VPC 访问集群,请确认控制平面安全组允许正确的访问。控制面板安全组必须允许从对等 VPC 访问端口 443 上的 Amazon EKS 控制平面安全组。
您的集群停留在“失败”状态,您无法将端点访问设置从公有更改为私有
由于 AWS Identity and Access Management (IAM) 存在权限问题,您的集群可能处于失败 状态。
要解决此问题,请完成以下步骤:
- 确认已授权用户 IAM 角色执行 AssociateVPCWithHostedZone 操作。
**注意:**如果操作未被阻止,则检查该用户的账户是否具有 AWS Organizations 策略,该策略会阻止 API 调用并导致集群失败。
- 确认未在任何账户以上级别隐式或显示地阻止 IAM 用户的权限。
**注意:**如果 IAM 用户权限未包含在 Allow 策略语句中,则会被隐式阻止。如果它包含在 Deny 策略语句中,则会被显式阻止。即使账户管理员将包含 */* 权限的 AdministratorAccess IAM 策略附加到用户,权限也会被阻止。AWS Organizations 策略的权限会覆盖 IAM 实体的权限。