Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
如何自动发现应用程序负载均衡器在 Amazon EKS 中使用的子网?
我想自动发现应用程序负载均衡器在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用的子网。
简短描述
为了识别您的应用程序负载均衡器使用的子网,Kubernetes 云控制器管理器(cloud-controller-manager)和 AWS 负载均衡器控制器(aws-load-balancer-controller)会查询集群的子网。该查询使用以下标签作为过滤器:
kubernetes.io/cluster/cluster-name shared
**注意:**将 cluster-name 替换为 Amazon EKS 集群名称。
要允许 AWS 负载均衡器控制器自动发现应用程序负载均衡器使用的子网,请标记您的子网。
解决方法
向子网添加标签
要标记您的子网,请完成以下步骤:
-
为您的 Amazon EKS 集群部署 AWS 负载均衡器控制器插件。
-
验证 AWS 负载均衡器控制器是否已安装:
kubectl get deployment -n kube-system aws-load-balancer-controller
**注意:**如果您在不同的命名空间中部署,请将 -n kube-system 替换为相应的命名空间。
-
使用以下注释在集群上创建 Kubernetes 入口资源:
annotations: kubernetes.io/ingress.class: alb
**注意:**AWS 负载均衡器控制器创建负载均衡器。入口资源将应用程序负载均衡器配置为将 HTTP(S) 流量路由到集群中的不同容器组(pod)。
-
添加 internal 注释或 internet-facing 注释,以指定您希望入口在何处创建负载均衡器:
alb.ingress.kubernetes.io/scheme: internal -or- alb.ingress.kubernetes.io/scheme: internet-facing
**注意:**选择 internal 创建内部负载均衡器,或选择 internet-facing 以创建公共负载均衡器。
-
使用标签允许 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 注释。
具有内部负载均衡器的集群的具有正确标签的子网示例:kubernetes.io/role/internal-elb 1
具有公共负载均衡器的集群的具有正确标签的子网示例:
kubernetes.io/role/elb 1
**注意:**对于集群版本 1.18 及更早版本,Amazon EKS 向集群创建期间传递的所有子网添加以下标签。该标签未添加到 1.19 版集群。如果您使用这个标签并更新到集群版本 1.19,则无需再次添加标签。这个标签会保留在您的子网上。
您可以使用以下标签来控制应用程序负载均衡器的分配位置。对于多个集群,除了必需的标签外,还使用此标签来自动在 EKS 集群中分配应用程序负载均衡器:
kubernetes.io/cluster/$CLUSTER_NAME shared
-
验证您的子网的标签是否正确:
aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
-
部署示例应用程序以验证 AWS 负载均衡器控制器是否因为入口对象而创建了应用程序负载均衡器:
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
-
验证入口资源是否已创建并具有关联的应用程序负载均衡器:
kubectl get ingress/2048-ingress -n game-2048
根据您在入口对象和子网中定义的注释(alb.ingress.kubernetes.io/scheme:),将创建内部或面向互联网的负载均衡器。
对常见的标签错误进行故障排除
当您使用标签自动发现子网时,通常会发生以下错误。
权限被拒绝错误
当您的账户的 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 负载均衡器控制器相关联:
$ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount
您会收到类似于以下内容的输出:
serviceAccount: aws-load-balancer-controllerserviceAccountName: aws-load-balancer-controller
**注意:**如果您在不同的命名空间中部署,请将 -n kube-system 替换为相应的命名空间。
-
检查哪个 IAM 角色已关联到与 AWS 负载均衡器控制器关联的服务账户:
$ 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
-
向您的 IAM 角色授予所有相关权限,例如 ec2:DescribeAvailabilityZones。有关 AWS 负载均衡器控制器如何代入 IAM 角色来执行 API 调用的更多信息,请参阅针对服务账户的 IAM 角色。有关相关权限的列表,请参阅 GitHub 的 AWS 负载均衡器控制器网页上的 IAM JSON policy。
单个子网发现错误
当您的 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 resolve at least one subnet"}"
-或-
"kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets.Subnets must contain the kubernetes.io/cluster/\u003ccluster name\u003e tag with a value of shared or owned and the kubernetes.io/role/elb tag signifying it should be used for ALBs Additionally, there must be at least 2 subnets with unique availability zones as required by ALBs.Either tag subnets to meet this requirement or use the subnets annotation on the ingress resource to explicitly call out what subnets to use for ALB creation.The subnets that did resolve were []" "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}"
要解决此问题,请在您的子网上添加相应的标签,以允许 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 注释手动为负载均衡器分配子网。
使用以下格式标记子网,前后没有任何空格:
键:kubernetes.io/cluster/your-cluster-name
值:shared 或 owned
如果您使用 AWS 负载均衡器控制器 v2.1.1 或更早版本,则必须使用上述格式标记子网。对于 2.1.2 或更高版本,标记是可选的。
在以下场景中标记子网是最佳实践:
- 您在同一个虚拟私有云(VPC)中有多个集群运行。
- 您有多个 AWS 服务在 VPC 中共享子网。
- 您希望对每个群集的负载平衡器分配位置进行更多控制。
多个子网发现错误
当您的 AWS 负载均衡器控制器未发现两个或更多合格子网时,您会收到以下错误消息:
“{“级别”: “错误”,“ts”: “2024-08-12T 19:01:27 Z”,“msg”: “协调器错误”,“控制器”: “入口”,“对象”:{“名称”: “入口 2048”,“命名空间”: “游戏2048”,“名称”: “入口” 2048”、“reconcileID”: “1234567”、“错误”: “无法自动发现子网:无法解析至少一个子网(2 个匹配的 VPC 和标签:\ [kubernetes.io/role/internal-elb],2 的免费 IP 少于 8 个)”}”
要解决此问题,请完成以下步骤:
- 确认您至少在两个不同的可用区中有两个子网。这是创建应用程序负载均衡器的要求。
**注意:**您可以创建具有单个子网的网络负载均衡器。 - 对于每个子网,至少指定一个带 /27 位掩码的 CIDR 块(例如: 10.0.0.0/27)和至少八个空闲的 IP 地址。
- 确认子网上的标签格式正确。例如,标签前后不能有任何空格。
相关内容
- AWS 官方已更新 8 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 4 个月前