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

2 分钟阅读
0

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

概述

要排查负载均衡器创建问题,请完成以下步骤:

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

AWS 负载均衡器控制器管理 Amazon Elastic Kubernetes Service(Amazon EKS)集群的弹性负载平衡。控制器预置以下资源:

  • 创建 Kubernetes 入口时的应用程序负载均衡器。
  • 创建负载均衡器类型的 Kubernetes 服务时的网络负载均衡器。
    **注意:**使用 AWS 负载均衡器控制器版本 2.3.0 或更高版本,可以创建具有实例或 IP 目标类型的网络负载均衡器。

解决方法

确保满足所有先决条件

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

1.    确认您已成功预置 AWS 负载均衡器控制器。最好使用 2.4.4 或更高版本。

2.    检查子网的数量。应用程序负载均衡器必须在不同的可用区中至少有两个子网。网络负载均衡器必须至少有一个子网。子网必须至少有八个可用的 IP 地址。有关更多信息,请参阅创建虚拟私有云(VPC)

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

  • 键:“kubernetes.io/cluster/cluster-name”
  • 值:“shared”或“owned”

对于应用程序负载均衡器

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

  • 使用附加到一个 Worker 节点的多个安全组。
  • 使用 AWS 负载均衡器控制器版本 v2.1.1 或更低版本。

对于网络负载均衡器

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

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

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

4.    除非子网 ID 在服务对象或入口对象中明确指定为注释,否则确保子网具有以下标签。如果没有这些标签,子网自动发现( GitHub 网站)将不起作用:

私有子网标签:

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

公有子网标签:

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

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

验证服务对象上的注释或入口对象上的注释。

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

应用程序负载均衡器

  • kubernetes.io/ingress.class: alb: IngressClassParams 是特定于 AWS 负载均衡器控制器的自定义资源定义(CRD)。可以您可以同时使用 CRD 与 IngressClass 参数字段(Kubernetes 网站)。使用此参数将强制执行一组入口的设置。

网络负载均衡器

  • **对于 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-NAMEINGRESS-NAMENAMESPACE 替换为您用例的正确值:

kubectl describe service SERVICE-NAME -n NAMESPACE  

kubectl describe ingress INGRESS-NAME -n NAMESPACE

运行以下命令编辑服务或入口对象。在以下示例中,将 SERVICE-NAMEINGRESS-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

如果存在问题,会看到协调器错误。此外,还会看到一条详细的错误消息,说明入口对象或负载均衡器服务无法创建或更新的原因。发生此故障的原因可能如下:

  • 如果在控制器尝试进行 AWS API 调用时发生错误,则与权限或连接问题有关。查看控制器的 AWS Identity and Access Management(IAM)权限。然后,确保安全组或网络访问控制列表(网络 ACL)不明确拒绝出站连接。
  • 如果错误发生在对象的配置中,则说明入口或服务规范格式不正确或注释不正确。查看 GitHub 上应用程序负载均衡器网络负载均衡器的注释。

如果没有控制器容器组(pod)显示日志,请确保控制器容器组(pod)正在运行:

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

验证是否为入口或服务对象所在的命名空间创建了 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 尝试创建的规则超过安全组的最大规则数,负载均衡器部署可能会失败。

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

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