AWS Load Balancer Controller を使用して Network Load Balancer または Application Load Balancer を作成できません。また、Service オブジェクトまたは Ingress オブジェクトを作成してもロードバランサーが作成されません。
簡単な説明
ロードバランサーの作成に関する問題をトラブルシューティングするには、次の手順を実行します:
- すべての前提条件が満たされていることを確認します。
- Ingress (Application Load Balancer) オブジェクトまたは Service (Network Load Balancer) オブジェクトのアノテーションを確認します。
- 追加情報については、AWS Load Balancer Controller ポッドのログを確認します。
- クラスターが AWS Fargate で実行されている場合は、Ingress オブジェクトまたは Service オブジェクトがある名前空間の Fargate プロファイルが作成されていることを確認します。
- 未対応の依存関係がないか確認します。
AWS Load Balancer Controller は Amazon Elastic Kubernetes Service (Amazon EKS) クラスターの Elastic Load Balancing を管理します。コントローラーは以下のリソースをプロビジョニングします:
- Kubernetes イングレスを作成する場合は Application Load Balancer。
- LoadBalancer タイプの Kubernetes サービスを作成する場合は Network Load Balancer。
注: AWS Load Balancer Controller バージョン 2.3.0 以降では、インスタンスまたは IP ターゲットタイプのいずれかで Network Load Balancer を作成できます。
解決方法
前提条件を満たしていることを確認する
Application Load Balancer の前提条件のリストについては、「Application load balancing on Amazon EKS」を参照してください。Network Load Balancer の前提条件のリストについては、「Network load balancing on Amazon EKS」を参照してください。
1. AWS Load Balancer Controller が正常にプロビジョニングされたことを確認します。バージョン 2.4.4 以降を使用するのがベストプラクティスです。
2. サブネットの数を確認します。Application Load Balancer には、異なるアベイラビリティーゾーンに少なくとも 2 つのサブネットが必要です。Network Load Balancer には少なくとも 1 つのサブネットが必要です。サブネットには少なくとも 8 つの使用可能な IP アドレスが必要です。詳細については、「Create a VPC」を参照してください。
3. シナリオによっては、次のタグを使用する必要があります:
- キー: 「kubernetes.io/cluster/cluster-name」
- 値: 「shared」または「owned」
Application Load Balancer の場合
次のシナリオでは、1 つのセキュリティグループにタグを付ける必要があります:
- ワーカーノードにアタッチされた複数のセキュリティグループを使用する。
- AWS Load Balancer Controller バージョン v2.1.1 以前を使用する。
Network Load Balancer の場合
AWS Load Balancer Controller バージョン v2.1.1 以前を使用する場合は、サブネットにタグを付ける必要があります。
Amazon EC2 コンソールを使用してタグを追加する方法については、「Work with tags using the console」を参照してください。AWS コマンドラインインターフェイス (AWS CLI) を使用してタグを追加する方法については、「Work with tags using the command line」を参照してください。
注: AWS CLI コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
4. Service オブジェクトまたは Ingress オブジェクトのアノテーションとしてサブネット ID が明示的に指定されている場合を除き、サブネットに次のタグが付いていることを確認してください。これらのタグがないと、(GitHub のウェブサイト上の) サブネット自動検出は機能しません:
プライベートサブネットのタグ:
- キー: 「kubernetes.io/role/internal-elb」
- 値: 「1」
パブリックサブネットのタグ:
- キー: 「kubernetes.io/role/elb」
- 値: 「1」
Ingress オブジェクトまたは Service オブジェクトのアノテーションを確認する
Service オブジェクトのアノテーションまたは Ingress オブジェクトのアノテーションを確認します。
注: 他のアノテーションはデフォルト値を使用します。アプリケーション負荷分散用の AWS Load Balancer Controller でサポートされるすべてのアノテーションのリストについては、GitHub の「Ingress annotations」を参照してください。ネットワーク負荷分散用の AWS Load Balancer Controller でサポートされているすべてのアノテーションのリストについては、GitHub の「Service annotations」を参照してください。
Application Load Balancer
- kubernetes.io/ingress.class: alb: IngressClassParams は、AWS Load Balancer Controller に固有のカスタムリソース定義 (CRD) です。この CRD は IngressClass パラメータフィールド (Kubernetes のウェブサイトにあります) と一緒に使用できます。このパラメータを使用して、一連の Ingress に設定を適用します。
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
問題がある場合は、「Reconciler error」と表示されます。また、Ingress オブジェクトまたはロードバランサーサービスの作成または更新に失敗した理由を示す詳細なエラーメッセージも表示されます。このエラーは、多くの場合、以下の理由で発生します:
- コントローラーが AWS API 呼び出しを実行しようとしたときにエラーが発生する場合は、権限または接続の問題に関連しています。コントローラーの AWS Identity and Access Management (IAM) の権限を確認してください。次に、セキュリティグループまたはネットワークアクセスコントロールリスト (ネットワーク ACL) がアウトバウンド接続を明示的に拒否していないことを確認します。
- オブジェクトの設定でエラーが発生する場合は、Ingress または Service の仕様の形式が不適切であるか、アノテーションが不正確です。GitHub の Application Load Balancer または Network Load Balancer のアノテーションを確認してください。
どのコントローラーポッドにもログが表示されない場合は、コントローラーポッドが動作していることを確認します:
kubectl get deployment -n kube-system aws-load-balancer-controller
Ingress オブジェクトまたは Service オブジェクトが存在する名前空間用に Fargate プロファイルが作成されていることを確認します
ターゲットポッドを Fargate で実行する場合は、IP ターゲットタイプを含める必要があります。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
未対応の依存関係がないか確認する
Amazon EKS は、以下のルールをノードのセキュリティグループに追加します:
- クライアントトラフィックのインバウンドルール。
- 作成した各 Network Load Balancer の VPC 内の各ロードバランサーサブネットのインバウンドルール (ヘルスチェック用)。
Amazon EKS が 1 つのセキュリティグループの最大ルール数を超えるルールを作成しようとすると、ロードバランサーのデプロイが失敗する可能性があります。
すべての依存関係を満たしていることを確認するには、関連ドキュメントを確認してください。Application Load Balancer については、「Application load balancing on Amazon EKS」を参照してください。Network Load Balancer については、「Network load balancing on Amazon EKS」を参照してください。例えば、Application Load Balancer を使用する場合、** Service オブジェクト**でインスタンストラフィックモードを使用するには、NodePort または LoadBalancer を指定する必要があります。