在使用 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-NAME 和 NAMESPACE 替换为适合您的使用案例的正确值。
kubectl describe service <SERVICE-NAME> -n <NAMESPACE>
kubectl describe ingress <INGRESS-NAME> -n <NAMESPACE>
运行以下命令之一以编辑服务或入口对象。在以下示例中,将 SERVICE-NAME/INGRESS-NAME 和 NAMESPACE 替换为适合您的使用案例的正确值:
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-NAME、REGION、FARGATE-PROFILE-NAME 和 NAMESPACE 替换为适合您的使用案例的正确值。
eksctl create fargateprofile --cluster <CLUSTER-NAME> --region <REGION> --name <FARGATE-PROFILE-NAME> --namespace <NAMESPACE>
验证是否存在未解决的依赖关系
查看文档以确保满足所有依赖关系。对于 ALB,请参阅 EKS 上的应用程序负载均衡。对于 NLB,请参阅 Amazon EKS 上的网络负载均衡。
例如,如果您使用的是 ALB,则服务对象必须指定 NodePort 或 LoadBalancer 以使用实例流量模式。