為什麼我的 AWS 負載平衡器控制器在 Amazon EKS 中找不到我的子網路?

上次更新日期:2021-10-06

我的 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.    查看哪些 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

3.    將 ec2:DescribeAvailabilityZones 許可授予您在步驟 2 中指定的 IAM 角色。

解決單一子網路搜尋錯誤

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

值:shared (共用) 或 owned (擁有)

重要事項:如果您使用的是 AWS 負載平衡器控制器 v2.1.1 版或更早版本,則必須使用上述格式來標記子網路。2.1.2 版或更新版本不一定會有標記功能。如果下列任一條件成立,那麼最好能標記子網路:

  • 您有多個叢集在同一個 VPC 中執行。
  • 您有多個 AWS 服務共用 VPC 中的子網路。
  • 您需要更妥善地控制各叢集佈建負載平衡器的位置。

解決多個子網路搜尋錯誤

1.    確認您在兩個不同的可用區域中至少有兩個子網路,這是建立 Application Load Balancer 的必要條件。

注意:您可建立具有單一子網路的 Network Load Balancer。

2.    針對每個子網路,指定至少具有 /27 位元遮罩的 CIDR 區塊 (例如:10.0.0.0/27) 和至少八個可用 IP 位址。

3.    確認子網路上的標籤格式正確。例如,標籤的開頭或結尾不能有任何空格。


此文章是否有幫助?


您是否需要帳單或技術支援?