Amazon EKS クラスターに接続できないのはなぜですか?
Amazon Elastic Kubernetes Service (Amazon EKS) クラスターを作成しましたが、クラスターに接続できません。
簡単な説明
次のいずれかの理由により、EKS クラスターに接続できない場合があります。
- クラスターの kubeconfig ファイルが作成されていません。
- Amazon EKS API サーバーエンドポイントに接続できません。
解決方法
kubeconfig ファイルを作成していません
Amazon EKS クラスターを作成した後で、AWS コマンドラインインターフェイス (AWS CLI) を使用して kubeconfig ファイルを設定する必要があります。この設定では、 kubectl コマンドラインを使ってクラスターに接続できます。次の解決方法では、AWS CLI update-kubeconfig コマンドを使用してクラスターの kubeconfig ファイルを作成する方法を示しています。AWS CLI を使用せずに kubeconfig ファイルを手動で更新するには、「 Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」を参照してください。 注: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
1. AWS CLI バージョン 1.16.308 以降がシステムにインストールされていることを確認します。
$ aws --version
重要: システムに Python バージョン 2.7.9 以降がインストールされている必要があります。それ以外のバージョンの場合、エラーが発生します。
ヒント: macOS 用の yum、apt-get、または homebrew などのパッケージマネージャーを使用して AWS CLI をインストールします。
2. 現在のアイデンティティをチェックして、Amazon EKS クラスターに対する許可がある正しい認証情報を使用していることを確認します。
aws sts get-caller-identity
注意: Amazon クラスターを作成する AWS Identity and Access Management (IAM) エンティティユーザーまたはロールには、クラスターの作成時に許可が自動的に付与されます。これらの許可は、コントロールプレーン内のクラスターの RBAC 設定で付与されます。IAM ユーザーまたはロールには、aws-auth ConfigMap で Amazon EKS クラスターへのアクセス権も付与できます。デフォルトで、AWS IAM Authenticator for Kubernetes は設定済みの AWS CLI または AWS SDK アイデンティティを使用します。詳細については、「クラスターへの IAM ユーザーおよびロールアクセスを有効にする」を参照してください。
3. クラスターの kubeconfig ファイルを作成または更新します。
aws eks --region example_region update-kubeconfig --name cluster_name
注: お使いの AWS リージョンの名前を含む example_regionで置き換えてください。cluster_name をご自分の EKS クラスター名に置き換えます。
デフォルトでは、Linux用の設定ファイルはホームディレクトリの kubeconfig パス ($HOME/.kube/config) に作成されます。このファイルは、その場所にある既存の kubeconfig とマージされることもあります。Windows の場合、ファイルは %USERPROFILE%.kube\config にあります。
Kubernetes ウェブサイトからの KUBECONFIG 環境変数を設定するか、以下の --kubeconfig オプションを使用することによって、別のパスを指定することもできます。
$ kubectl get pods --kubeconfig ./.kube/config
注: kubectl コマンドを実行するときの認証には、--role-arn オプションを使用して IAM ロールの Amazon リソースネーム (ARN) を指定できます。それ以外の場合、デフォルトの AWS CLI または AWS SDK 認証情報チェーンの IAM エンティティが使用されます。詳細については、update-kubeconfig を参照してください。または、「Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」の「kubeconfig を手動で作成する」セクションのステップ 6 を完了してください。
4. 設定をテストします。
$ kubectl get svc
出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 1m
注: 他の認証またはリソースタイプのエラーが発生した場合は、許可されていないか、アクセスが拒否されました (kubectl) を参照してください。
Amazon EKS API サーバーエンドポイントに接続できない
1. 正しい Amazon EKS API サーバー URL に接続していることを確認します。そのためには、kubectl verbosity をオンにしてから、以下のコマンドを実行します。
$ kubectl get svc --v=9
出力は次のようになります。
I0110 16:43:36.920095 48173 loader.go:373] Config loaded from file: /Users/abs/.kube/config I0110 16:43:36.936844 48173 round_trippers.go:466] curl -v -XGET -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500' I0110 16:43:37.362185 48173 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/ resolved to [{18.119.155.77 } {3.136.153.3 }] I0110 16:43:37.402538 48173 round_trippers.go:510] HTTP Trace: Dial to tcp:18.119.155.77:443 succeed I0110 16:43:37.500276 48173 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500 200 OK in 563 milliseconds I0110 16:43:37.500302 48173 round_trippers.go:570] HTTP Statistics: DNSLookup 1 ms Dial 40 ms TLSHandshake 44 ms ServerProcessing 52 ms Duration 563 ms I0110 16:43:37.500308 48173 round_trippers.go:577] Response Headers: I0110 16:43:37.500316 48173 round_trippers.go:580] Audit-Id: 37c17136-7fa7-40e9-8fe6-b24426e81564 I0110 16:43:37.500323 48173 round_trippers.go:580] Cache-Control: no-cache, private I0110 16:43:37.500329 48173 round_trippers.go:580] Content-Type: application/json I0110 16:43:37.500334 48173 round_trippers.go:580] X-Kubernetes-Pf-Flowschema-Uid: 508eb99e-d99b-44db-8ade-838c99fe8e9f I0110 16:43:37.500340 48173 round_trippers.go:580] X-Kubernetes-Pf-Prioritylevel-Uid: d324d3db-05ce-441b-a0ff-c31cbe8f696c I0110 16:43:37.500345 48173 round_trippers.go:580] Date: Tue, 10 Jan 2023 21:43:37 GMT
2. 次のコマンドを実行して、Amazon EKS API サーバーにパブリックにアクセスできることを確認します。
$ aws eks describe-cluster --name cluster_name --region example_region --query cluster.resourcesVpcConfig
出力は次のようになります。
{ "subnetIds": [ "subnet-abc1", "subnet-abc2", "subnet-abc3", "subnet-abc4", "subnet-abc5", "subnet-abc6" ], "securityGroupIds": [ "sg-abc7" ], "clusterSecurityGroupId": "sg-abc7", "vpcId": "vpc-abc9", "endpointPublicAccess": true, "endpointPrivateAccess": false, "publicAccessCidrs": [ "0.0.0.0/0" ] }
3. 上記の出力で、 endpointPublicAccess が true の場合は、必ず publicAccessCidrs リストのすべての送信元 IP アドレスを許可リストに登録してください。そのためには、次の操作を行います。
- Amazon EKS コンソールを開いてください。
- 更新したいクラスターを選択します。
- [ネットワーク] タブを選択し、[ネットワークの管理] を選択します。
- [公開] を選択します。
- [詳細設定] の [CIDR ブロック] に、許可リストに登録する必要があるすべてのパブリック CIDR 範囲を入力します。
- [変更を保存] を選択します。
上記の出力で、endPointPrivateAccess が true の場合、kubectl リクエストがクラスターのネットワーク内から送信されていることを確認してください。kubectl リクエストが Amazon Virtual Private Cloud (Amazon VPC) の外部からのものである場合、次のタイムアウトエラーが発生します。
$ kubectl get svc --v=9 I0110 17:15:58.889798 50514 loader.go:373] Config loaded from file: /Users/example-user/.kube/config I0110 17:15:58.896715 50514 round_trippers.go:466] curl -v -XGET -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500' I0110 17:15:59.374499 50514 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com resolved to [{192.168.126.17 } {192.168.144.26 }] I0110 17:16:14.285027 50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.126.17:443 failed: dial tcp 192.168.126.17:443: i/o timeout I0110 17:16:29.191768 50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.144.26:443 failed: dial tcp 192.168.144.26:443: i/o timeout I0110 17:16:29.196959 50514 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500 in 30300 milliseconds I0110 17:16:29.197724 50514 round_trippers.go:570] HTTP Statistics: DNSLookup 183 ms Dial 14906 ms TLSHandshake 0 ms Duration 30300 ms I0110 17:16:29.197768 50514 round_trippers.go:577] Response Headers: I0110 17:16:29.199254 50514 helpers.go:264] Connection error: Get https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500: dial tcp 192.168.126.17:443: i/o timeout Unable to connect to the server: dial tcp 192.168.126.17:443: i/o timeout
また、クラスターセキュリティグループを更新して、ソース IP または CIDR 範囲が許可リストに登録されていることを確認します。これにより、kubectl クライアントは Amazon EKS API サーバーのエンドポイントに接続できます。
関連情報

関連するコンテンツ
- 承認された回答質問済み 6ヶ月前lg...
- 質問済み 25日前lg...
- AWS公式更新しました 9ヶ月前
- AWS公式更新しました 2年前