kubectl コマンドを実行できません。また、Amazon Elastic Kubernetes Service (Amazon EKS) クラスターのエンドポイントアクセス設定をパブリックからプライベートに変更しました。現在、クラスターは Failed 状態で停止しています。
解決策
注: Kubernetes API サーバーエンドポイントへのアクセスを設定する方法については、「クラスターエンドポイントへのアクセスを変更する」を参照してください。
新規または既存のクラスターに kubectl コマンドを実行する際のエラーのトラブルシューティング
kubeconfig ファイルがクラスターに接続されていることを確認する
次の手順を実行します。
-
正しい kubeconfig ファイルを使用してクラスターに接続していることを確認します。詳細については、Kubernetes のウェブサイトで「kubeconfig ファイルを使用してクラスターへのアクセスを管理する」を参照してください。
-
次のコマンドを実行し、kubeconfig ファイル内のクラスターコンテキストを一覧表示します。
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
出力例:
Cluster name Server "example-cluster-name" https://"example-cluster-endpoint".eks.amazonaws.com
-
kubeconfig ファイル内のクラスター名とエンドポイントが適切であることを確認します。クラスターの名前またはエンドポイントに誤りがある場合は、次のコマンドを実行して kubeconfig ファイル内のクラスターのコンテキストを更新します。
aws eks update-kubeconfig --name example-cluster-name --region example-region
注: example-cluster-name を更新対象のクラスター名に、example-region を AWS リージョンに置き換えてください。
-
デバイスで次の telnet コマンドをポート 443 に実行し、API サーバーエンドポイントへの接続を確認します。
telnet example-server-endpoint 443
注: example-server-endpoint を API サーバーエンドポイントに置き換えてください。
次の出力例は、ポート 433 でサーバーエンドポイント D8DC9092A7985668FF67C3D1C789A9F5.gr7.us-east-2.eks.amazonaws.com に接続できることを示しています。
$ 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.
デバイスがポート 433 経由で API サーバーエンドポイントに接続できない場合は、次のセクションの解決手順を実行します。
DNS リゾルバーを確認する
kubectl コマンドを実行できなかったデバイスで次のコマンドを実行します。
nslookup example-server-endpoint
注: example-server-endpoint を API サーバーエンドポイントに置き換えてください。
API サーバーエンドポイントへのパブリックアクセスが制限されていないかを確認する
要件に応じて、次のいずれかの手順を実行します。
- パブリック API サーバーエンドポイントへのアクセスが、CIDR ブロックにより制限されている場合は、クライアントマシンの IP アドレスが許可された CIDR 範囲内にあることを確認します。
- Amazon 仮想プライベートクラウド (Amazon VPC) の外部からのアクセスが必要な場合は、CIDR 制限のあるパブリックエンドポイントを使用します。
API サーバーエンドポイントのアクセスの組み合わせがアクセス要件を満たしていることを確認します。
注: API サーバーエンドポイントをプライベートに設定し、外部アクセス用に AWS VPN を構成することを推奨します。詳細については、「プライベート専用 API サーバーへのアクセス」を参照してください。
エンドポイントへのアクセスをパブリックからプライベートに変更した後、kubectl コマンドでエラーが発生する場合のトラブルシューティング
次の手順を実行します。
- 踏み台ホストまたはコネクテッドネットワーク経由で Amazon EKS API エンドポイントにアクセスしていることを確認します。コネクテッドネットワークには、ピアリングされた VPC、AWS Direct Connect、VPN が含まれます。
注: プライベートアクセスモードでは、クラスターの VPC またはコネクテッドネットワーク内からのみ Amazon EKS API エンドポイントにアクセスできます。
- セキュリティグループまたはネットワークアクセスコントロールリスト (ネットワーク ACL) が Kubernetes API サーバーへのリクエストをブロックしていないかを確認します。
注: ピアリングされた VPC を使用する場合は、コントロールプレーンのセキュリティグループがピアリングされたVPCからのアクセスをポート 443 で許可していることを確認します。
エンドポイントへのアクセス設定をパブリックからプライベートに変更できず、クラスターが Failed ステータスから移行できない場合のトラブルシューティング
AWS Identity and Access Management (IAM) の権限に問題がある場合、クラスターは Failed ステータスに移行します。
使用する IAM ロールは、AssociateVPCWithHostedZone アクションの実行を許可されていることを確認します。
このアクションがブロックされていない場合は、AWS アカウントに API コールをブロックする AWS Organizations サービスコントロールポリシー (SCP) がないかを確認します。暗黙的または明示的な拒否が原因で、IAM ユーザーの権限が組織レベルまたはアカウントレベルでブロックされていないかを確認します。アカウント管理者がユーザーに対し、*/* 権限が付与された AdministratorAccess IAM ポリシーをアタッチした場合も、Deny ステートメントは権限をブロックします。AWS Organizations の SCP は、IAM エンティティの権限をオーバーライドします。