如何排查使用 AWS 负载均衡器控制器创建负载均衡器时出现的问题?
我无法使用 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-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
如果存在问题,会看到协调器错误。此外,还会看到一条详细的错误消息,说明入口对象或负载均衡器服务无法创建或更新的原因。发生此故障的原因可能如下:
- 如果在控制器尝试进行 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-NAME、REGION、FARGATE-PROFILE-NAME 和 NAMESPACE 替换为适用于您用例的正确值:
eksctl create fargateprofile --cluster CLUSTER-NAME --region REGION --name FARGATE-PROFILE-NAME --namespace NAMESPACE
检查是否存在未处理的依赖关系
Amazon EKS 在节点的安全组中添加了以下规则:
- 客户端流量的入站规则。
- 创建每个网络负载均衡器时 VPC 中每个负载均衡器子网的入站规则(用于运行状况检查)。
如果 Amazon EKS 尝试创建的规则超过安全组的最大规则数,负载均衡器部署可能会失败。
要确保满足所有依赖关系,请查看相关文档。有关应用程序负载均衡器,请参阅 Amazon EKS 上的应用程序负载均衡。有关网络负载均衡器,请参阅 Amazon EKS 上的网络负载均衡。例如,如果使用应用程序负载均衡器,服务对象必须指定 NodePort 或 LoadBalancer 才能使用实例流量模式。
相关内容
- AWS 官方已更新 3 个月前
- AWS 官方已更新 8 个月前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前