在使用 AWS 负载均衡器控制器创建负载均衡器时如何排查问题?

2 分钟阅读
0

我无法使用 AWS 负载均衡器控制器创建网络负载均衡器或应用程序负载均衡器。或者,在我创建服务或入口对象之后,未创建负载均衡器。

简短描述

要排查负载均衡器创建问题,请执行以下操作:

  • 确保满足所有先决条件。
  • 检查入口(应用程序负载均衡器)或服务(网络负载均衡器)对象的注释。
  • 查看 AWS 负载均衡器控制器 pod 的日志以了解其他信息。
  • 如果集群在 AWS Fargate 上运行,则验证为入口或服务对象所在的命名空间创建 Fargate 配置文件。
  • 检查是否存在未解决的依赖关系。

AWS 负载均衡器控制器管理 EKS 集群的弹性负载均衡。控制器提供以下资源:

  • 创建 Kubernetes 入口时的应用程序负载均衡器。
  • 创建类型为 LoadBalancer 的 Kubernetes 服务时的网络负载均衡器。以前,Kubernetes 网络负载均衡器用于实例目标,AWS 负载均衡器控制器用于 IP 目标。在 AWS 负载均衡器控制器版本 2.3.0 或更高版本中,可以使用任一目标类型创建网络负载均衡器。有关更多信息,请参阅目标类型

解决方案

确保满足所有先决条件

有关应用程序负载均衡器先决条件的列表,请参阅 Amazon EKS 上的应用程序负载均衡。如需网络负载均衡器先决条件的列表,请参阅 Amazon EKS 上的网络负载均衡

1.    验证 AWS 负载均衡器控制器已成功预置。最佳实践是使用版本 2.4.4 或更高版本。

2.    检查子网的数量。应用程序负载均衡器需要在不同的可用区内至少有两个子网。网络负载均衡器需要至少一个子网。子网必须至少有八个可用的 IP 地址。有关更多信息,请参阅查看您的 VPC

3.    在某些情况下,您必须使用以下标签:

  • 键:“kubernetes.io/集群/集群名称”
  • 值:“共享”或“拥有”

如果您使用的是 Application Load Balancer

在以下情况下,您必须准确标记一个安全组:

  • 您正在使用挂载到 Worker 节点的多个安全组。
  • 您使用的是 AWS 负载均衡器控制器版本 v2.1.1 或更早版本。

如果您使用的是网络负载均衡器

如果您使用的是 AWS 负载均衡器控制器版本 v2.1.1 或更早版本,则必须标记子网。

有关从 Amazon EC2 控制台添加标签的信息,请参阅使用控制台处理标签。有关使用 AWS 命令行界面(AWS CLI)添加标签的信息,请参阅使用命令行处理标签

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

  1. FSP 除非在服务对象或入口对象中将子网 ID 明确指定为注释,否则请确保子网具有以下标签。没有这些标签,子网自动发现无法正常工作。

私有子网标签:

  • 键:“kubernetes.io/role/internal-elb”
  • 值:“1”

公有子网标签:

  • 键:“kubernetes.io/role/elb”
  • 值:“1”

检查入口或服务对象的注释

验证服务对象上的注释入口对象上的注释。配置负载均衡器所需的注释如下:

**注意:**其他注释使用默认值。有关用于应用程序负载平衡的 AWS 负载均衡器控制器支持的所有可用注释列表,请参阅 GitHub 上的入口注释。有关用于网络负载平衡的 AWS 负载均衡器控制器支持的所有可用注释列表,请参阅 GitHub 上的服务注释

应用程序负载均衡器

网络负载均衡器

  • **使用 IP 目标:**service.beta.kubernetes.io/aws-load-balancer-type: "external" service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
  • **使用实例目标:**service.beta.kubernetes.io/aws-load-balancer-type: "external" service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "instance"

运行以下命令之一以查看服务或入口对象。在以下示例中,将 SERVICE-NAME/INGRESS-NAMENAMESPACE 替换为适合您的使用案例的正确值。

kubectl describe service <SERVICE-NAME> -n <NAMESPACE> 

kubectl describe ingress <INGRESS-NAME> -n <NAMESPACE>

运行以下命令之一以编辑服务或入口对象。在以下示例中,将 SERVICE-NAME/INGRESS-NAMENAMESPACE 替换为适合您的使用案例的正确值。

kubectl edit service <SERVICE-NAME> -n <NAMESPACE>

kubectl edit ingress <INGRESS-NAME> -n <NAMESPACE>

查看 AWS 负载均衡器控制器 pod 的日志以了解其他信息

运行以下命令以审核 AWS 负载均衡器控制器日志:

kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller

如果所有控制器 pod 都没有显示日志,则确保控制器 pod 正在运行:

kubectl get deployment -n kube-system aws-load-balancer-controller

如果集群在 Fargate 上运行,则验证是否为入口或服务对象所在的命名空间创建了 Fargate 配置文件

当目标 pod 在 Fargate 上运行时,IP 目标类型是必填项。运行以下命令以验证已经为入口或服务对象所在的命名空间创建了 Fargate 配置文件。在以下示例中,将 CLUSTER-NAME 替换为集群的名称。

eksctl get fargateprofile --cluster <CLUSTER-NAME> -o yaml

要创建 Fargate 配置文件,请运行以下命令。在以下示例中,将 CLUSTER-NAMEREGIONFARGATE-PROFILE-NAMENAMESPACE 替换为适合您的使用案例的正确值。

eksctl create fargateprofile --cluster <CLUSTER-NAME> --region <REGION> --name <FARGATE-PROFILE-NAME> --namespace <NAMESPACE>

检查是否存在未解决的依赖关系

Amazon EKS 向节点的安全组添加以下规则:

  • 客户端流量的传入规则
  • 针对您创建的每个网络负载均衡器(用于运行状况检查),VPC 中每个负载均衡器子网的传入规则。

如果 Amazon EKS 尝试创建的规则超过安全组允许的最大规则数的配额,则部署 LoadBalancer 类型的服务可能会失败。

查看文档以确保满足所有依赖关系。对于应用程序负载均衡器,请参阅 Amazon EKS 上的应用程序负载均衡。有关网络负载均衡器,请参阅 Amazon EKS 上的网络负载均衡。例如,如果您使用应用程序负载均衡器,则服务对象必须指定 NodePortLoadBalancer 以使用实例流量模式。


AWS 官方
AWS 官方已更新 2 个月前