Amazon EKS のサービスロードバランサーに関する問題の解決方法を教えてください。
最終更新日: 2020 年 1 月 24 日
Amazon Elastic Kubernetes (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 の ALB Ingress Controller を参照してください。
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 アカウントには、デフォルトで AWS リージョンあたり最大 20 のロードバランサーがあります。
ロードバランサーの数を確認するには、Amazon EC2 コンソールを開き、ナビゲーションペインから [Load Balancers] を選択します。
ロードバランサーの最大数に達した場合は、[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 LoadBalancer サービスの詳細について確認する
- クラウドコントローラーのソースコードを調べる