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 以降がシステムにインストールされている必要があります。そうでない場合、エラーが表示されます。

**ヒント:AWS CLI をインストールするには、yumapt-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.    前述の出力で 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公式更新しました 1年前
コメントはありません

関連するコンテンツ