為什麼我的 AWS 負載平衡器控制器在 Amazon EKS 中找不到我的子網路?
上次更新日期:2023 年 1 月 12 日
我的 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. 確認子網路上的標籤格式正確。例如,標籤的開頭或結尾不能有任何空格。