Amazon EKS の Kubernetes サービスコントローラによって作成されたロードバランサーをトラブルシューティングする方法を教えてください。

所要時間3分
0

Amazon Elastic Kubernetes Service (Amazon EKS) のロードバランサーに支えられた Kubernetes サービスを作成できません。

簡単な説明

Amazon EKS は、次の 2 つのコントローラのうちの 1 つを使用してロードバランサーを管理します。 AWS ロードバランサーコントローラーまたは Kubernetes サービスコントローラー。以下のトラブルシューティング手順は、Kubernetes サービスコントローラーによって管理されるロードバランサーにのみ適用されます。詳細については、Kubenetes AWS クラウドプロバイダーのウェブサイトの「サービスコントローラー」と Kubernetes ウェブサイトの LoadBalancer と入力してください。

サービスロードバランサーのトラブルシューティングを行うには、次の構成になっていることを確認します。

  • Amazon Virtual Private Cloud (Amazon VPC) サブネットの正しいタグ
  • クラスターの IAM ロールに必要な AWS ID およびアクセス管理 (IAM) 権限
  • 有効な Kubernetes サービス定義
  • アカウントの上限内にとどまるロードバランサー
  • サブネットに十分な空きIPアドレスがある
  • 接続タイムアウトの問題を回避するために正しく設定されたロードバランサー
  • 正常なロードバランサーターゲット

上記の項目をすべて確認しても問題が解決しない場合は、その他のトラブルシューティング手順を試す セクションの手順に従ってください。

解決策

以下の手順は、Classic Load BalancerとNetwork Load Balancerに適用されます。Application Load Balancerについては、「Amazon EKS でのアプリケーション負荷分散」を参照してください

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

Amazon VPC サブネットには正しいタグを使用してください。

1.    Amazon VPC コンソールを開きます

2.    ナビゲーションペインで、[サブネット] を選択します。

3.    各サブネットの [タグ] タブを選択し、タグが存在することを確認します。例えば:

Key: kubernetes.io/cluster/yourEKSClusterName  
Value: shared

**注:**この場合、********バリューは共有または所有できます

デフォルトでは、コントローラーはサブネットを自動的に検出します。アベイラビリティーゾーンごとに複数のサブネットがある場合、コントローラーは次の順序でサブネットに優先順位を付けます。

  • 正しいロールタグが付いているサブネット:パブリックサブネットの場合は** kubernetes.io/role/elb、プライベートサブネットの場合は kubernetes.io/role/internal-elb**
  • クラスタータグが付いたサブネット:kubernetes.io/cluster/CLUSTER_NAME
  • 辞書順で最初のサブネット

4.    パブリックサブネットには、次のタグが存在することを確認してください。

Key: kubernetes.io/role/elb  
Value: 1

**注:**サブネットがパブリックかどうかを確認するには、サブネットに関連付けられているルートテーブルを確認します。パブリックサブネットには、インターネットゲートウェイ (igw-xxxxxxxxxxx) へのルートがあります。プライベートサブネットには、NAT ゲートウェイまたは NAT インスタンスを経由するインターネットへのルートがあるか、インターネットへのルートがまったくありません。

**重要:**インターネット向けロードバランサーサービスを作成するには、ステップ 4 のタグが必要です。インターネット向けロードバランサーは、クライアントからのリクエストをインターネット経由でターゲットにルーティングします。

5.    プライベートサブネットには、次のタグが存在することを確認してください。

Key: kubernetes.io/role/internal-elb  
Value: 1

**重要:**内部ロードバランサーサービスを作成するには、ステップ 5 のタグが必要です。内部ロードバランサーは、プライベート IP アドレスを使用してリクエストをターゲットにルーティングします。

クラスターの IAM ロールに必要な AWS ID およびアクセス管理 (IAM) 権限を設定します

1.    Amazon EKS コンソールを開きます。

2.    ナビゲーションペインで、クラスター を選択します。

3.    クラスターを選択し、クラスター IAM ロール ARN を書き留めます。

4.    IAM コンソールを開きます。

5.    ナビゲーションペインで、ロール を選択します。

6.    ステップ 3 で特定した クラスター IAM ロール ARN と一致するロールを選択します。

7.    AWS 管理ポリシー** AmazonEKsClusterPolicy** がロールにアタッチされていることを確認します。

**注:**Amazon EKS コントロールプレーンは、前述の IAM ロールを引き継ぎ、サービスのロードバランサーを作成します。

有効な Kubernetes サービス定義を使用してください

Kubernetes サービスの YAML ファイルで、** spec.type** がLoadBalancerに設定されていることを確認します。

ロードバランサーによってバックアップされる Kubernetes サービスの次の例を参照してください。

apiVersion: v1  
kind: Service  
metadata:  
  annotations:  
    # This annotation is only required if you are creating an internal facing ELB. Remove this annotation to create public facing ELB.  
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"  
  name: nginx-elb  
  labels:  
    app: nginx  
spec:  
  type: LoadBalancer  
  ports:  
  - name: "http"  
    port: 80  
    targetPort: 80  
  selector:  
    app: nginx

**注:**サービスを別のアノテーションでカスタマイズするには、Kubernetes ウェブサイトの「AWS での内部ロードバランサーTLS サポート」を参照してください。

デフォルトでは、Kubernetes の組み込みサービスコントローラーはクラシックロードバランサーを作成します。ネットワークロードバランサーをプロビジョニングするには、annotation **service.beta.kubernetes.io/aws-load-balancer-type: "nlb"**が必要です。詳細については、Kubernetes ウェブサイトのAWS のNetwork Load Balancerのサポートを参照してください。

ロードバランサーがアカウント制限内であることを確認する

デフォルトでは、1 つの AWS アカウントには、1 つの AWS リージョンあたり最大 20 のロードバランサーがあります。

ロードバランサーの数を確認するには、 Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。次に、ナビゲーションペインから ロードバランサー を選択します。

ロードバランサーの数が上限に達した場合は、Service Quotasで増額を申請できます。

サブネットに十分な空きIPアドレスがあることを確認する

ロードバランサーを作成するには、そのロードバランサーの各サブネットに最低 8 つの空いている IP アドレスが必要です。これは Classic Load Balancer と Network Load Balancer の両方に必要です。

接続タイムアウトの問題

ロードバランサーで断続的または絶え間ないタイムアウトの問題が発生している場合は、ロードバランサーの設定に問題がある可能性があります。これは、バックエンドサービスが受信トラフィックを処理できない場合や、ロードバランサーに送信されるリクエストが多すぎる場合に発生する可能性があります。詳細については、Elastic Load Balancing の「接続がタイムアウトしました」 エラーのトラブルシューティング方法を教えてください。

ロードバランサーのヘルスチェックを確認する

エンドポイントを正しく設定しなかったり、バックエンドサービスがヘルスチェックリクエストに応答しなかったりすると、ロードバランサーのヘルスチェックの問題が発生します。

ロードバランサーが正しいエンドポイントを指していることを確認するには、AWS CLI コマンド describe-target-health を実行します。

aws elbv2 describe-target-health --target-group-arn arn:aws:elasticloadbalancing:us-west-2:1234567890:targetgroup/my-targets/6d0ecf831eec9f09

ターゲットグループのヘルスチェック設定を確認するには、AWS CLI コマンド describe-target-groups を実行します。

aws elbv2 describe-target-groups --target-group-arns arn:aws:elasticloadbalancing:us-west-2:1234567890:targetgroup/my-targets/6d0ecf831eec9f09

詳細については、ターゲットグループのヘルスチェックを参照してください。

その他のトラブルシューティングの手順を試してください

Kubernetes サービスに問題のトラブルシューティングに役立つエラーメッセージがないかどうかを確認するには、次の describe-service コマンドを実行します。

$ kubectl describe service my-elb-service

サービスが正常に作成されると、次の例のような出力が表示されます。

...  
...  
Events:  
  Type    Reason                Age   From                Message  
  ----    ------                ----  ----                -------  
  Normal  EnsuringLoadBalancer  47s   service-controller  Ensuring load balancer  
  Normal  EnsuredLoadBalancer   44s   service-controller  Ensured load balancer

サービスが正常に作成されない場合、エラーメッセージが表示されます。

エラーメッセージの詳細については、次のリソースを確認してください。

関連情報

VPC のロードバランサーが使用しているサブネットの IP アドレスが不十分なのはなぜですか?

Amazon EKS トラブルシューティング

Application Load Balancerのトラブルシューティング

Classic Load Balancerのトラブルシューティング

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ