为什么我的 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. 确认子网上的标签格式正确。例如,标签不得有任何前导空格或尾随空格。