为什么我的 AWS 负载均衡器控制器无法在 Amazon EKS 中找到我的子网?
我的 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. 确认您在两个不同的可用区中至少有两个子网。这是创建应用程序负载均衡器的要求。
注意:您可以使用单个子网创建网络负载均衡器。
2. 对于每个子网,请指定一个具有至少 /27 位掩码(例如:10.0.0.0/27)和至少八个免费 IP 地址的 CIDR 块。
3. 确认子网上的标签格式正确。例如,标签不得有任何前导空格或尾随空格。

相关内容
- 已提问 4 个月前lg...
- 已提问 5 天前lg...
- 已提问 4 个月前lg...
- 已提问 5 个月前lg...
- 已提问 3 个月前lg...
- AWS 官方已更新 3 个月前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 4 个月前
- AWS 官方已更新 6 个月前