Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何自动发现应用程序负载均衡器在 Amazon EKS 中使用的子网?
我想自动发现应用程序负载均衡器在 Amazon Elastic Kubernetes Service(Amazon EKS)中使用的子网。
简短描述
为了识别您的应用程序负载均衡器使用的子网,aws-load-balancer-controller AWS 负载均衡器控制器会查询集群的子网。该查询使用以下标签作为筛选条件:
kubernetes.io/cluster/cluster-name shared kubernetes.io/role/elb 1 OR kubernetes.io/role/internal-elb 1
**注意:**将 cluster-name 替换为 Amazon EKS 集群名称。
要允许 AWS 负载均衡器控制器自动发现应用程序负载均衡器使用的子网,请标记您的子网。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
向子网添加标签
完成以下步骤:
- 在您的 Amazon EKS 集群上部署 AWS 负载均衡器控制器。
- 要验证您是否正确安装了 AWS 负载均衡器控制器,请运行以下命令:
**注意:**如果您将 AWS 负载均衡器控制器部署在不同的命名空间中,请将 -n kube-system 替换为正确的命名空间。kubectl get deployment -n kube-system aws-load-balancer-controller - 使用以下注释在集群上创建 Kubernetes 入口资源:
**注意:**AWS 负载均衡器控制器有助于创建负载均衡器。入口资源将应用程序负载均衡器配置为将 HTTP 和 HTTPS 流量路由到集群中的不同容器组。annotations: kubernetes.io/ingress.class: alb - 在入口对象的 annotations(注释)下,输入 internal 以创建内部负载均衡器,或输入 internet-facing 以创建公共负载均衡器:
-或-alb.ingress.kubernetes.io/scheme: internal
**注意:**您可以使用标签实现子网自动发现,而非手动添加 alb.ingress.kubernetes.io/subnets 注释。alb.ingress.kubernetes.io/scheme: internet-facing
对于集群版本 1.18 及更早版本,Amazon EKS 会向其在集群创建期间传递的所有子网添加以下标签:
**注意:**请将 CLUSTER_NAME 替换为您的集群名称。kubernetes.io/cluster/CLUSTER_NAME
仅当您使用 AWS 负载均衡器控制器 2.1.1 或更早版本时,才需要 kubernetes.io/cluster/CLUSTER_NAME 标签。Amazon EKS 不会自动添加或删除此标签。尽管 1.19 版本之前的集群需要此标签,但即使在集群升级后,此标签仍会保留在子网中。 - 要验证您的子网是否拥有正确的标签,请运行以下 describe-subnets AWS CLI 命令:
**注意:**请将 your-subnet-abcdefghxyz 替换为您的子网 ID。aws ec2 describe-subnets --subnet-ids your-subnet-abcdefghxyz - 要部署示例应用程序,请运行以下命令:
注意:由于存在入口对象,上述命令会创建一个应用程序负载均衡器。kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml - 要验证 Amazon EKS 是否创建了入口资源和关联的应用程序负载均衡器,请运行以下命令:
kubectl get ingress/2048-ingress -n game-2048
对标签错误进行故障排除
根据您在使用标签以自动发现子网时收到的错误执行以下操作。
权限被拒绝问题
您的 AWS 账户中用于 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**注意:**如果您将 AWS 负载均衡器控制器部署在不同的命名空间中,请将 -n kube-system 替换为正确的命名空间。
输出示例:serviceAccount: aws-load-balancer-controller serviceAccountName: aws-load-balancer-controller -
要识别附加到与 AWS 负载均衡器控制器关联的服务账户的 IAM 角色,请运行以下命令:
kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn输出示例:
annotations: eks.amazonaws.com/role-arn: arn:aws:iam::abcdefxyz:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-abcdefxyz
**注意:**如果您未使用服务账户的 IAM 角色 (IRSA),请确保 Amazon EKS Worker 节点的 IAM 角色具有所需的权限。要查看所需的权限,请参阅 GitHub 网站上的 iam_policy.json。
单个子网发现问题
当您的 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 1
对于公共子网,请添加以下标签:
kubernetes.io/role/elb 1
**注意:**您可以使用 alb.ingress.kubernetes.io/subnets 注释手动为负载均衡器分配子网。要查看所需的权限,请参阅 GitHub 网站上的 iam_policy.json。
使用以下格式标记子网,前后没有任何空格:
- 对于“键”,输入 kubernetes.io/cluster/your-cluster-name。
- 对于“值”,输入 shared 或 owned。
如果您使用 AWS 负载均衡器控制器 2.1.1 或更早版本,则必须使用上述格式标记子网。对于 2.1.2 或更高版本,标记是可选的。
在以下场景中标记子网是最佳实践:
- 您在同一个虚拟私有云(VPC)中有多个集群运行。
- 您有多个 AWS 服务在 VPC 中共享子网。
- 您希望对每个群集的负载平衡器分配位置进行更多控制。
多个子网发现错误
当您的 AWS 负载均衡器控制器未发现两个或更多符合条件的子网时,您会收到以下错误消息:
"{"level":"error","ts":"2024-08-12T19:01:27Z","msg":"Reconciler error","controller":"ingress","object":{"name":"ingress-2048","namespace":"game-2048"},"namespace":"game-2048","name":"ingress-2048","reconcileID":"1234567","error":"couldn't auto-discover subnets: unable to resolve at least one subnet (2 match VPC and tags: [kubernetes.io/role/internal-elb], 2 have fewer than 8 free IPs)"}"
要解决此问题,请完成以下步骤:
- 确认您至少在两个不同的可用区中有两个子网。
**注意:**这是创建应用程序负载均衡器的一项要求。您可以创建具有单个子网的网络负载均衡器。 - 对于每个子网,请指定一个位掩码至少为 /27(例如 10.0.0.0/27),且至少有八个可用 IP 地址的 CIDR 块。
- 确认您已正确设置子网标签的格式。例如,标签前后不能有任何空格。
相关内容
AWS 官方已更新 9 个月前
