AWS Load Balancer Controller を使用してロードバランサーを作成する際の問題をトラブルシューティングするにはどうすればよいですか?
最終更新日: 2021 年 10 月 29 日
AWS Load Balancer Controller (以前は ALB Ingress Controller と呼ばれていました) を使用してネットワークロードバランサー (NLB) または Application Load Balancer (ALB) を作成できません。あるいは、Service オブジェクトまたは Ingress オブジェクトを作成した後、ロードバランサーが作成されません。これをトラブルシューティングするにはどうすればよいですか?
簡単な説明
ロードバランサーの作成に関する問題をトラブルシューティングするには、次の手順を実行します。
- すべての前提条件が満たされていることを確認します。
- Ingress (ALB) または Service (NLB) オブジェクトのアノテーションを確認します。
- AWS Load Balancer Controller ポッドのログでその他の情報を確認します。
- クラスターが AWS Fargate で実行されている場合は、Ingress または Service オブジェクトが存在する名前空間用に Fargate プロファイルが作成されていることを確認します。
- アドレス指定されていない依存関係がないかを確認します。
解決方法
すべての前提条件が満たされていることを確認する
ALB の前提条件の一覧については、Amazon Elastic Kubernetes Service (Amazon EKS) でのアプリケーションロードバランシングを参照してください。NLB の前提条件の一覧については、Amazon EKS でのネットワークロードバランシングを参照してください。
1. AWS Load Balancer Controller が正常にプロビジョンされていることを確認します。
2. サブネットの数を確認します。ALB には少なくとも 2 つのサブネットが必要で、NLB には少なくとも 1 つのサブネットが必要です。詳細については、サブネットを表示するを参照してください。
3. 特定のシナリオでは、次のタグを使用する必要があります。
- キー: 「kubernetes.io/cluster/cluster-name」
- 値: 「shared」または「owned」
Application Load Balancer を使用している場合
次のシナリオでは、セキュリティグループを 1 つだけタグ付けする必要があります。
- ワーカーノードにアタッチされた複数のセキュリティグループを使用している場合
- AWS Load Balancer Controller のバージョン v2.1.1 以前を使用している場合
ネットワークロードバランサーを使用している場合
AWS Load Balancer Controller のバージョン v2.1.1 以前を使用している場合、サブネットはタグ付けされる必要があります。
Amazon EC2 コンソールからタグを追加する方法については、コンソールでのタグの使用を参照してください。AWS Command Line Interface を使用したタグの追加については、コマンドラインによるタグの使用を参照してください。
注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
4. Service オブジェクトまたは Ingress オブジェクトでサブネット ID がアノテーションとして明示的に指定されていない限り、サブネットに以下のタグが付けられていることを確認してください。これらのタグがないと、Subnet Auto Discovery は機能しません。
プライベートサブネットのタグ:
- キー: 「kubernetes.io/role/internal-elb」
- 値: 「1」
パブリックサブネットのタグ:
- キー: 「kubernetes.io/role/elb」
- 値: 「1」
Ingress (ALB) または Service (NLB) オブジェクトのアノテーションを確認する
Service オブジェクトのアノテーションまたは Ingress オブジェクトのアノテーションを確認します。ロードバランサーの設定に必要なアノテーションは次のとおりです。
注: その他のアノテーションはデフォルト値を使用します。
Application Load Balancer
- kubernetes.io/ingress.class: alb (Ingress オブジェクトが AWS Load Balancer Controller を確実に使用するようにします)
Network Load Balancer
- IP のターゲットがある場合: service.beta.kubernetes.io/aws-load-balancer-type: “external” service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: “ip”
- インスタンスのターゲットがある場合: service.beta.kubernetes.io/aws-load-balancer-type: “external” service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: “instance”
次のいずれかのコマンドを実行して、Service または Ingress オブジェクトを表示します。次の例では、SERVICE-NAME/INGRESS-NAME と NAMESPACE をユースケースに適した値に置き換えてください。
kubectl describe service <SERVICE-NAME> -n <NAMESPACE>
kubectl describe ingress <INGRESS-NAME> -n <NAMESPACE>
次のいずれかのコマンドを実行して、Service または Ingress オブジェクトを編集します。次の例では、SERVICE-NAME/INGRESS-NAME と NAMESPACE をユースケースに適した値に置き換えてください。
kubectl edit service <SERVICE-NAME> -n <NAMESPACE>
kubectl edit ingress <INGRESS-NAME> -n <NAMESPACE>
AWS Load Balancer Controller ポッドのログでその他の情報を確認する
次のコマンドを実行して、AWS Load Balancer Controller のログを確認します。
kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
どのコントローラーポッドにもログが表示されない場合は、コントローラーポッドが実行中であることを確認します。
kubectl get deployment -n kube-system aws-load-balancer-controller
クラスターが Fargate で実行されている場合は、Ingress または Service オブジェクトが存在する名前空間用に Fargate プロファイルが作成されていることを確認する
次のコマンドを実行して、Ingress または Service オブジェクトが存在する名前空間のために Fargate プロファイルが作成されていることを確認します。次の例では、CLUSTER-NAME をクラスターの名前に置き換えてください。
eksctl get fargateprofile --cluster <CLUSTER-NAME> -o yaml
Fargate プロファイルを作成するには、次のコマンドを実行します。次の例では、CLUSTER-NAME、REGION、FARGATE-PROFILE-NAME、および NAMESPACE をユースケースに適した値に置き換えてください。
eksctl create fargateprofile --cluster <CLUSTER-NAME> --region <REGION> --name <FARGATE-PROFILE-NAME> --namespace <NAMESPACE>
アドレス指定されていない依存関係がないかを確認する
ドキュメントを参照して、すべての依存関係が満たされていることを確認します。ALB については、EKS でのアプリケーションロードバランシングを参照してください。NLB については、Amazon EKS でのネットワークロードバランシングを参照してください。
例えば、ALB を使用している場合、インスタンストラフィックモードを使用するには、Service オブジェクトは NodePort または LoadBalancer を指定する必要があります。