为什么我的 AWS 负载均衡器控制器无法在 Amazon EKS 中找到我的子网?

上次更新时间:2021 年 10 月 6 日

我的 AWS 负载均衡器控制器在 Amazon Elastic Kubernetes Service (Amazon EKS) 中找不到我的子网。

简短描述

如果您的 AWS 负载均衡器控制器在 Amazon EKS 中找不到您的子网,您将会收到错误消息。

如果您收到以下错误,则表示您的服务账户的 AWS 负载均衡器控制器的 AWS Identity and Access Management (IAM) 角色没有所需的权限:

{"level":"error","ts":1621443417.9175518,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":" ingress-2048","namespace":" game-2048","error":"couldn't auto-discover subnets: UnauthorizedOperation: You are not authorized to perform this operation.\n\tstatus code: 403, request id: 72ee57ae-f804-4f81-b069-8b04114b67b0"}

要解决上述错误,请完成解决权限被拒绝的错误部分中的步骤:

– 或 –

如果您收到以下错误,则说明您的 AWS 负载均衡器控制器无法发现至少一个子网:

{"level":"error","ts":1608229710.3212903,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"ingress-2048","namespace":"game-2048","error":"couldn't auto-discover subnets: unable to discover at least one subnet"}

要解决上述错误,请完成解决单个子网发现错误部分中的步骤:

– 或 –

如果您收到以下任一错误,则您的 AWS 负载均衡器控制器无法发现两个或更多符合条件的子网。

"msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to failed to resolve 2 qualified subnet with at least 8 free IP Addresses for ALB
{"level":"error","ts":1606329481.2930484,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"reciter-ing","namespace":"reciter","error":"InvalidSubnet: Not enough IP space available in subnet-xxxxxxxxxxxxxx. ELB requires at least 8 free IP addresses in each subnet.\n\tstatus code: 400, request id: 2a37780c-f411-xxxxx-xxxxx-xxxxxxxxx"}

要解决上述错误,请完成解决多个子网发现错误部分中的步骤:

解决方法

解决权限被拒绝的错误

1.    验证您的服务账户是否与 AWS 负载均衡器控制器关联:

$ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount

输出:

serviceAccount: aws-load-balancer-controller
serviceAccountName: aws-load-balancer-controller

注意:如果您的部署部署在不同的命名空间中,则用适当的命名空间替换 -n kube-system

2.    查看与 AWS 负载均衡器控制器关联的服务账户附加了哪个 IAM 角色:

$ kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn

输出:

annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx

3.    向您在步骤 2 中确定的 IAM 角色授予 ec2:DescribeAvailabilityZones 的权限。

解决单个子网发现错误

1.    在子网上添加适当的标签,以允许AWS 负载均衡器入口控制器使用自动发现创建负载均衡器。

私有子网标签示例:

kubernetes.io/role/internal-elb                Set to 1 or empty tag value for internal load balancers

公有子网标签示例:

kubernetes.io/role/elb                         Set to 1 or empty tag value for internet-facing load balancers

注意:您可以使用 alb.ingress.kubernetes.io/subnets 注释将子网手动分配给负载均衡器。有关更多信息,请参阅 AWS 负载均衡器控制器网站上的入口注释

使用内部负载均衡器(私有子网)的集群的子网的正确标签示例:

kubernetes.io/role/internal-elb          1

使用公有负载均衡器(公有子网)的集群的子网的正确标签示例:

kubernetes.io/role/elb

2.    使用适当的格式为子网贴标签。

键:kubernetes.io/cluster/your-cluster-name

值:共享拥有

重要提示:如果您使用的是 AWS 负载均衡器控制器版本 v2.1.1 或更早版本,则必须使用上述格式标记子网。对于 2.1.2 或更高版本,标记则为可选。如果满足以下任一条件,最佳实践是为子网贴标签:

  • 您有多个在同一 VPC 中运行的集群。
  • 您有多个在 VPC 中共享子网的 AWS 服务。
  • 您希望更好地控制为每个集群预置负载均衡器的位置。

解决多个子网发现错误

1.    确认您在两个不同的可用区中至少有两个子网,这是创建 Application Load Balancer 的必要条件。

注意:您可以使用单个子网创建网络负载均衡器。

2.    对于每个子网,请指定一个具有至少 /27 位掩码(例如:10.0.0.0/27)和至少八个免费 IP 地址的 CIDR 块。

3.    确认子网上的标签格式正确。例如,标签不得有任何前导空格或尾随空格。


这篇文章对您有帮助吗?


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