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.    サブネットのタグの形式が正しいことを確認します。例えば、タグの先頭または末尾にスペースを含めることはできません。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?