AWS Load Balancer Controller が Amazon EKS でサブネットを見つけられないのはなぜですか?
最終更新日: 2021 年 10 月 6 日
AWS Load Balancer Controller が Amazon Elastic Kubernetes Service (Amazon EKS) でサブネットを見つけることができません。
簡単な説明
AWS Load Balancer Controller が Amazon EKS でサブネットを見つけられない場合、エラーが表示されます。
次のエラーが表示された場合、AWS Load Balancer Controller のサービスアカウントの 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 Load Balancer Controller は少なくとも 1 つのサブネットを検出できません。
{"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 Load Balancer Controller は 2 つ以上の適格なサブネットを検出できません。
"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 Load Balancer Controller に関連付けられていることを確認します。
$ 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 Load Balancer Controller に関連付けられたサービスアカウントにアタッチされている 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 Load Balancer Ingress Controller が自動検出を使用してロードバランサーを作成できるようにします。
プライベートサブネットタグの例:
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 Load Balancer Controller ウェブサイトの Ingress アノテーションを参照してください。
内部ロードバランサーを使用するクラスターで正しいタグが設定されたサブネットの例 (プライベートサブネット):
kubernetes.io/role/internal-elb 1
パブリックロードバランサーを使用するクラスターで正しいタグが設定されたサブネットの例 (パブリックサブネット):
kubernetes.io/role/elb
2. サブネットに適切な形式でタグを設定します。
キー: kubernetes.io/cluster/<クラスター名>
値: shared または owned
重要: AWS Load Balancer Controller バージョン v2.1.1 以前を使用している場合は、上記の形式でサブネットにタグを設定する必要があります。バージョン 2.1.2 以降では、タグ付けはオプションです。次のいずれかに該当する場合は、サブネットにタグを設定するのがベストプラクティスです。
- 同じ VPC で実行している複数のクラスターがある。
- VPC 内のサブネットを共有する複数の AWS のサービスがある。
- クラスターごとにロードバランサーをプロビジョニングする場所を詳細に制御する必要がある。
複数のサブネット検出エラーを解決する
1. 2 つの異なるアベイラビリティーゾーンに少なくとも 2 つのサブネットがあることを確認します。これは、Application Load Balancer を作成するための要件です。
注意: 1 つのサブネットでネットワークロードバランサーを作成できます。
2. サブネットごとに少なくとも /27 ビットマスク (10.0.0.0/27 など) と少なくとも 8 つの使用可能な IP アドレスを含む 1 つの CIDR ブロックを指定します。
3. サブネットのタグの形式が正しいことを確認します。例えば、タグの先頭または末尾にスペースを含めることはできません。