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

上次更新日期:2021 年 10 月 29 日

我无法使用 AWS 负载均衡器控制器(以前称为 ALB 入口控制器)创建网络负载均衡器 (NLB) 或 Application Load Balancer (ALB)。或者,在我创建服务或入口对象之后,未创建负载均衡器。如何排查此问题?

简短描述

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

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

解决方法

确保满足所有先决条件

如需 ALB 先决条件的列表,请参阅 Amazon Elastic Kubernetes Service (Amazon EKS) 上的应用程序负载均衡。如需 NLB 先决条件的列表,请参阅 Amazon EKS 上的网络负载均衡

1.    验证 AWS 负载均衡器控制器已成功预置。

2.    检查子网的数量。ALB 需要至少两个子网,而 NLB 需要至少一个子网。有关更多信息,请参阅查看您的子网

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

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

如果您使用的是 Application Load Balancer

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

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

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

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

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

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

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

私有子网标签:

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

公有子网标签:

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

检查入口 (ALB) 或服务 (NLB) 对象的注释

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

注意:其他注释使用默认值。

Application Load Balancer

  • kubernetes.io/ingress.class: alb(确保入口对象使用 AWS 负载均衡器控制器)

网络负载均衡器

  • 使用 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 配置文件

运行以下命令以验证已经为入口或服务对象所在的命名空间创建了 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>

验证是否存在未解决的依赖关系

查看文档以确保满足所有依赖关系。对于 ALB,请参阅 EKS 上的应用程序负载均衡。对于 NLB,请参阅 Amazon EKS 上的网络负载均衡

例如,如果您使用的是 ALB,则服务对象必须指定 NodePortLoadBalancer 以使用实例流量模式。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?