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 以降がシステムにインストールされている必要があります。そうでない場合、エラーが表示されます。
**ヒント:AWS CLI をインストールするには、yum、apt-get、macOS 用の **homebrew などのパッケージマネージャーを使用ます。
2. 現在の ID をチェックして、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 ID を使用します。詳細については、「Turning on IAM user and role access to your cluster」を参照してください。
3. クラスターの kubeconfig ファイルを作成または更新します。
aws eks --region example_region update-kubeconfig --name cluster_name
**注:**example-region は AWS リージョンの名前に置き換えます。cluster_name は EKS クラスターの名前に置き換えます。
デフォルトでは、Linux 用の設定ファイルはホームディレクトリの kubeconfig パス ($HOME/.kube/config) で作成されます。このファイルは、そこにある既存の kubeconfig とマージされる場合もあります。Windows の場合、ファイルは %USERPROFILE%\.kube\configにあります。
KUBECONFIG (Kubernetes のウェブサイトから) 環境変数を設定するか、次の --kubeconfig オプションを使用して別のパスを指定することもできます。
$ kubectl get pods --kubeconfig ./.kube/config
注:kubectl コマンドを実行するときの認証には、--role-arn オプションを使用して IAM ロールの Amazon リソースネーム (ARN) を指定できます。それ以外の場合は、デフォルトの AWS CLI または AWS SDK 認証情報チェーンの IAM エンティティが使用されます。詳細については、「update-kubeconfig」を参照してください。または、「Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」の「Create kubeconfig file manually」セクションのステップ 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 の詳細をオンにして、次のコマンドを実行します。
$ 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 サーバーエンドポイントに接続できるようになります。
関連情報
関連するコンテンツ
- 質問済み 5ヶ月前lg...
- AWS公式更新しました 3ヶ月前
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 8ヶ月前