Amazon EKS クラスターに接続できないのはなぜですか?

所要時間4分
0

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 用の yumapt-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.    上記の出力で、 endpointPublicAccesstrue の場合は、必ず publicAccessCidrs リストのすべての送信元 IP アドレスを許可リストに登録してください。そのためには、次の操作を行います。

  1. Amazon EKS コンソールを開いてください。
  2. 更新したいクラスターを選択します。
  3. [ネットワーク] タブを選択し、[ネットワークの管理] を選択します。
  4. [公開] を選択します。
  5. [詳細設定] の [CIDR ブロック] に、許可リストに登録する必要があるすべてのパブリック CIDR 範囲を入力します。
  6. [変更を保存] を選択します。

上記の出力で、endPointPrivateAccesstrue の場合、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 サーバーのエンドポイントに接続できます。


関連情報

Amazon EKS のトラブルシューティング

Amazon EKS API サーバーに接続したときに「You must be logged in to the server (Unauthorized)」(サーバーにログインする必要があります (未承認)) というエラーを解決する方法を教えてください。

AWS公式
AWS公式更新しました 10ヶ月前
コメントはありません

関連するコンテンツ