如何对 Amazon EKS 中由 Kubernetes 服务控制器创建的负载均衡器进行故障排除?

3 分钟阅读
0

我无法在 Amazon Elastic Kubernetes Service (Amazon EKS) 上创建由负载均衡器提供支持的 Kubernetes 服务。

简短描述

Amazon EKS 使用两个控制器中的一个来管理负载均衡器: AWS 负载均衡器控制器或者 Kubernetes 服务控制器。下列故障排除步骤仅适用于由 Kubernetes 服务控制器管理的负载均衡器。有关详细信息,请参阅 Kubenetes AWS Cloud Provider 网站上的服务控制器和 Kubernetes 网站上的类型 LoadBalancer

如需对服务负载均衡器进行故障排除,请验证您是否具有以下配置:

  • 您的 Amazon Virtual Private Cloud (Amazon VPC) 子网的正确标签
  • 您的集群 IAM 角色所需的 AWS Identity and Access Management (IAM) 权限
  • 有效的 Kubernetes 服务定义
  • 保持在您账户限制范围内的负载均衡器
  • 您的子网上拥有足够的免费 IP 地址
  • 正确配置的负载均衡器,以避免连接超时问题
  • 运行正常的负载均衡器目标

如果在验证了上述所有项目后仍有问题,请按照尝试其他故障排除步骤部分中的步骤进行操作。

解决方法

以下步骤适用于经典负载均衡器和网络负载均衡器。有关应用程序负载均衡器,请参阅 Amazon EKS 上的应用程序负载均衡

**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

使用适用于您的 Amazon VPC 子网的正确标签

1.    打开 Amazon VPC 控制台

2.    在导航窗格上,选择子网

3.    选择每个子网的标签选项卡,然后确认标签存在。例如:

Key: kubernetes.io/cluster/yourEKSClusterName  
Value: shared

**注意:**在这种情况下,可以 sharedowned

默认情况下,控制器自动发现子网。如果每个可用区有多个子网,则控制器会按以下顺序排列子网的优先级:

  • 带有正确角色标签的子网:对于公有子网为 kubernetes.io/role/elb,对于私有子网为 kubernetes.io/role/internal-elb
  • 带有集群标签的子网:kubernetes.io/cluster/CLUSTER_NAME
  • 按字典顺序排列的第一个子网

4.    对于您的公有子网,请确认以下标签存在:

Key: kubernetes.io/role/elb  
Value: 1

**注意:**如需查看子网是否为公有子网,请检查与该子网关联的路由表。公有子网具有通往互联网网关的路由 (igw-xxxxxxxxxxx)。私有子网具有通过 NAT 网关或 NAT 实例通往互联网的路由,或者根本没有通往互联网的路由。

重要事项:您必须拥有步骤 4 中的标签才能创建面向互联网的负载均衡器服务。面向互联网的负载均衡器通过互联网将客户端发来的请求路由到目标。

5.    对于您的私有子网,请确认以下标签存在:

Key: kubernetes.io/role/internal-elb  
Value: 1

重要事项:您必须拥有步骤 5 中的标签才能创建内部负载均衡器服务。内部负载均衡器使用私有 IP 地址将请求路由到目标。

为您的集群的 IAM 角色设置所需的 AWS Identity and Access Management (IAM) 权限

1.    打开 Amazon EKS 控制台

2.    在导航窗格上,选择集群

3.    选择您的集群,然后记下您的集群 IAM 角色 ARN

4.   打开 IAM 控制台

5.    在导航窗格上,选择角色

6.    选择与您在步骤 3 中确定的集群 IAM 角色 ARN 相匹配的角色。

7.    确认 AWS 托管式策略 AmazonEKSClusterPolicy 已附加到您的角色。

**注意:**Amazon EKS 控制面板代入前面的 IAM 角色,以为您的服务创建负载均衡器。

使用有效的 Kubernetes 服务定义

在您的 Kubernetes 服务的 YAML 文件中,验证 spec.type 是否设置为 LoadBalancer

请参阅以下由负载均衡器提供支持的 Kubernetes 服务的示例:

apiVersion: v1  
kind: Service  
metadata:  
  annotations:  
    # This annotation is only required if you are creating an internal facing ELB. Remove this annotation to create public facing ELB.  
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"  
  name: nginx-elb  
  labels:  
    app: nginx  
spec:  
  type: LoadBalancer  
  ports:  
  - name: "http"  
    port: 80  
    targetPort: 80  
  selector:  
    app: nginx

**注意:**如需使用不同的注释自定义您的服务,请参阅 Kubernetes 网站上的内部负载均衡器AWS 上的 TLS 支持

默认情况下,Kubernetes 内置服务控制器会创建一个经典负载均衡器。对于网络负载均衡器预配,该服务必须具有注释 service.beta.kubernetes.io/aws-load-balancer-type: "nlb"。有关更多详细信息,请参阅 Kubernetes 网站上的 AWS 上的网络负载均衡器支持

验证负载均衡器是否在您的账户限制范围内

默认情况下,一个 AWS 账户在每个 AWS 区域最多拥有 20 个负载均衡器。

如需查看您拥有多少负载均衡器,请打开 Amazon Elastic Compute Cloud (Amazon EC2) 控制台。然后,从导航窗格中选择负载均衡器

如果达到负载均衡器数量上限,则您可以申请增加服务限额

验证您的子网上是否有足够的空闲 IP 地址

如需创建负载均衡器,该负载均衡器的每个子网必须至少有八个可用 IP 地址。这对于经典负载均衡器和网络负载均衡器都是必需的。

连接超时问题

如果您的负载均衡器遇到间歇性或持续超时问题,则负载均衡器配置可能存在问题。当后端服务无法处理传入流量,或者向负载均衡器发送的请求过多时,就会发生这种情况。有关详细信息,请参阅如何排查 Elastic Load Balancing“连接超时”错误?

验证负载均衡器运行状况检查

如果未正确配置端点,或者后端服务未响应运行状况检查请求,则会出现负载均衡器运行状况检查问题。

要验证负载均衡器是否指向正确的端点,请运行 AWS CLI 命令 describe-target-health

aws elbv2 describe-target-health --target-group-arn arn:aws:elasticloadbalancing:us-west-2:1234567890:targetgroup/my-targets/6d0ecf831eec9f09

要检查目标组的运行状况检查配置,请运行 AWS CLI 命令 describe-target-groups

aws elbv2 describe-target-groups --target-group-arns arn:aws:elasticloadbalancing:us-west-2:1234567890:targetgroup/my-targets/6d0ecf831eec9f09

有关详细信息,请参阅目标组的运行状况检查

尝试其他故障排除步骤

要检查 Kubernetes 服务中是否有可以帮助您解决问题的错误消息,请运行以下 describe-service 命令:

$ kubectl describe service my-elb-service

如果服务创建成功,则您会收到类似于以下示例的输出:

...  
...  
Events:  
  Type    Reason                Age   From                Message  
  ----    ------                ----  ----                -------  
  Normal  EnsuringLoadBalancer  47s   service-controller  Ensuring load balancer  
  Normal  EnsuredLoadBalancer   44s   service-controller  Ensured load balancer

如果服务未创建成功,则您会收到一条错误消息。

如需获取有关错误消息的更多信息,请查看以下资源:

相关信息

为什么我的 VPC 中负载均衡器使用的子网的 IP 地址不足?

Amazon EKS 故障排除

对应用程序负载均衡器进行故障排除

对经典负载均衡器进行故障排除

AWS 官方
AWS 官方已更新 1 年前