Amazon EKS のサービスロードバランサーに関する問題の解決方法を教えてください。
最終更新日: 2021 年 8 月 24 日
Amazon Elastic Kubernetes Service (Amazon EKS) のロードバランサーによってバックアップされる Kubernetes サービスを作成できません。
簡単な説明
サービスロードバランサーに関する問題を解決するには、以下があることを確認します。
- Amazon Virtual Private Cloud (Amazon VPC) サブネットの正しいタグ
- クラスターの IAM ロールに必要な AWS Identity and Access Management (IAM) アクセス許可
- 有効な Kubernetes サービスの定義
- アカウント制限内に収まるロードバランサー
- 利用可能な IP アドレスが十分にサブネットにあること
前述のすべての項目を確認しても問題が解決しない場合は、追加のトラブルシューティング手順を試すセクションの手順に従います。
解決方法
注意: 次の手順は Classic Load Balancer と Network Load Balancer に適用されます。Application Load Balancer については、「Amazon EKS でのアプリケーションの負荷分散」を参照してください。
Amazon VPC サブネットの正しいタグを使用する
1. AWS VPC コンソールを開きます。
2. ナビゲーションペインで、[Subnets] を選択します。
3. 各サブネットの [Tags] タブを選択し、タグが存在することを確認します。以下はその例です。
Key: kubernetes.io/cluster/yourEKSClusterName
Value: shared
4. パブリックサブネットに、次のタグが存在することを確認します。
Key: kubernetes.io/role/elb
Value: 1
注意: サブネットがパブリックサブネットであるかどうかを確認するには、サブネットに関連付けられたルートテーブルを確認します。パブリックサブネットには、インターネットゲートウェイへのルートがあります (igw-xxxxxxxxxxx)。プライベートサブネットには、NAT ゲートウェイまたは NAT インスタンスを経由したインターネットへのルートがあるか、インターネットへのルートがまったくありません。
重要: インターネット向けロードバランサーサービスを作成するには、ステップ 4 のタグが必要です。
5. プライベートサブネットに、次のタグが存在することを確認します。
Key: kubernetes.io/role/internal-elb
Value: 1
重要: 内部向けロードバランサーサービスを作成するには、ステップ 5 のタグが必要です。
クラスターの IAM ロールに必要な IAM アクセス許可を設定する
1. Amazon EKS コンソールを開きます。
2. ナビゲーションペインで、[Clusters] を選択します。
3. クラスターを選択し、クラスター IAM ロール ARN を書き留めます。
4. IAM コンソールを開きます。
5. ナビゲーションペインで、[Roles] を選択します。
6. ステップ 3 で特定したクラスター IAM ロール ARN に一致するロールを選択します。
7. AWS 管理ポリシー AmazonEKSClusterPolicy がロールにアタッチされていることを確認します。
注意: Amazon EKS コントロールプレーンは、前述の IAM ロールを引き受けて、サービスのロードバランサーを作成します。
有効な Kubernetes サービスの定義を使用する
1. 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
注意: 別の注釈を使用してサービスをカスタマイズするには、内部ロードバランサーと AWS での TLS サポートを参照してください。AWS Load Balancer Controller を使用して Network Load Balancer を管理する場合、アノテーションは Kubernetes サービスの定義を満たす必要があります。詳細については、「Amazon EKS でのネットワーク負荷分散」を参照してください。
ロードバランサーがアカウント制限内であることを確認します。
AWS アカウントには、デフォルトで AWS リージョンあたり最大 20 のロードバランサーがあります。
持っているロードバランサーの数を確認するには、Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開きます。ナビゲーションペインで、[ロードバランサー] をクリックします。
ロードバランサーの最大数に達した場合は、[Service Quotas] で引き上げを申請できます。
サブネットに十分な空き IP アドレスがあることを確認する
ロードバランサーを作成するには、そのロードバランサーの各サブネットに、少なくとも 8 つの利用可能な IP アドレスが必要です。これは、Classic Load Balancer と Network Load Balancer の両方に必要です。
追加のトラブルシューティング手順を試す
Kubernetes サービスで、問題のトラブルシューティングに役立つエラーメッセージを確認するには、次のコマンドを実行します。
$ 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
サービスが正常に作成されない場合は、エラーメッセージが表示されます。
エラーメッセージの詳細情報を取得するには、以下の操作を行います。
- Amazon EKS コントロールプレーンログを使用する
- (Kubernetes のウェブサイトで) Kubernetes ロードバランサーサービスの詳細をご覧ください
- (Kubernetes GitHub ウェブサイトで) クラウドコントローラーのソースコードを調べる