Amazon EKS クラスターの API サーバーエンドポイントの問題をトラブルシューティングする方法を教えてください。

最終更新日: 2021 年 12 月 10 日

kubectl コマンドを実行できません。そして、Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでエンドポイントアクセス設定をパブリックからプライベートに変更しました。これで、クラスタが Failed 状態のままになります。

簡単な説明

Kubernetes API サーバーエンドポイントに問題がある場合は、以下のいずれかのセクションの手順を完了してください。

  • 新規または既存のクラスターで kubectl コマンドを実行できない
  • エンドポイントアクセスをパブリックからプライベートに変更した後、クラスターで kubectl コマンドを実行できません。
  • クラスターが失敗状態のままスタックし、エンドポイントアクセス設定をパブリックからプライベートに変更できません。

注意: Kubernetes API サーバーエンドポイントへのアクセスを設定するには、Amazon EKS で API サーバーへのパブリックおよびプライベートアクセスを設定する方法を教えてくださいを参照してください。

解決方法

新規または既存のクラスターで kubectl コマンドを実行できない

1.    クラスターとの接続に正しい kubeconfig ファイルを使用していることを確認します。詳細については、 kubeconfig ファイルを使用したクラスターアクセスの整理 (Kubernetes Web サイトから) を参照してください。

2.    kubeconfig ファイル内の複数のコンテキストについて、各クラスターをチェックします。

出力例:

kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
Cluster name    Server
new200.us-east-2.eksctl.io       https://D8DC9092A7985668FF67C3D1C789A9F5.gr7.us-east-2.eks.amazonaws.com

既存の kubeconfig ファイルに正しいクラスター詳細が含まれていない場合は、次のコマンドを使用して正しい詳細を持つクラスターを作成します。

aws eks update-kubeconfig --name cluster name --region region

注:cluster name はクラスターの名前に置き換え、リージョンはお使いの AWS リージョンに置き換えます。

3.    ポート 443 の telnet を使用して、デバイスからの API サーバーエンドポイントの接続を検証します。

出力例:

echo exit | telnet D8DC9092A7985668FF67C3D1C789A9F5.gr7.us-east-2.eks.amazonaws.com 443
Trying 18.224.160.210...
Connected to D8DC9092A7985668FF67C3D1C789A9F5.gr7.us-east-2.eks.amazonaws.com.
Escape character is '^]'.
Connection closed by foreign host.

Telnet が機能しない場合は、次の手順に従ってトラブルシューティングを行います。

DNS リゾルバーを確認する

API サーバーが解決しない場合は、DNS リゾルバーに問題があります。

kubectl コマンドが失敗したのと同じデバイスから、次のコマンドを実行します。

nslookup APISERVER endpoint

注:APISERVER エンドポイントを APISERVER エンドポイントに置き換えます。

API サーバーエンドポイントへのパブリックアクセスを制限していないか確認する

パブリック API サーバーエンドポイントへのアクセスを制限するように CIDR ブロックを指定した場合は、プライベートエンドポイントアクセスもアクティブ化することをお勧めします。

4.    API サーバーエンドポイントのアクセス動作を確認します。では、クラスターエンドポイントのアクセスの変更

エンドポイントアクセスをパブリックからプライベートに変更した後、クラスターで kubectl コマンドを実行できません。

1.    踏み台ホストまたは接続されたネットワーク (ピア接続 VPC、AWS Direct Connect、VPN など) を使用して Amazon EKS API エンドポイントにアクセスしていることを確認します。

注意: プライベートアクセスモードでは、クラスターの VPC 内からのみ Amazon EKS API エンドポイントにアクセスできます。

2.    セキュリティグループまたはネットワークアクセスコントロールリストが API 呼び出しをブロックしているかどうかを確認します。

ピア接続 VPC 経由でクラスターにアクセスする場合は、セキュリティグループで、 ピア接続 VPC からポート 443 でのコントロールプレーンのセキュリティグループへのアクセスが許可されていることを確認します。また、ピアリングされた VPC のポート 53 が相互に開かれていることを確認します。DNS 解決にはポート 53 が使用されます。

クラスターが「失敗」状態のままスタックし、エンドポイントアクセス設定をパブリックからプライベートに変更できません。

AWS Identity and Access Management (IAM) 権限の問題により、クラスターが失敗 になっている可能性があります。

1.    ユーザーの IAM ロールに、AssociateVPCWithHostedZone アクションを実行する権限が付与されていることを確認します。

注意: アクションがブロックされていない場合は、API 呼び出しをブロックし、クラスターが失敗する原因である AWS Organizations ポリシー がユーザーのアカウントにあるかどうかを確認します。

2.    IAM ユーザーのアクセス権限が、アカウントのどのレベルでも暗黙的または明示的にブロックされていないことを確認します。

注:IAM ユーザーのアクセス許可は、 許す ポリシーステートメントに含まれていない場合、暗黙的にブロックされます。Deny ポリシーステートメントに含まれている場合は、明示的にブロックされます。アカウント管理者が*/* 権限を持つ AdministratorAccess IAM ポリシーをユーザーにアタッチしても、アクセス許可はブロックされます。AWS Organizations ポリシーからのアクセス権限は IAM エンティティのアクセス権限よりも優先