Amazon EKS 클러스터에 연결할 수 없는 이유가 무엇인가요?

5분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터를 생성했는데, 클러스터에 연결이 안 됩니다.

간략한 설명

EKS 클러스터에 연결하지 못하는 경우 다음과 같은 몇 가지 이유가 있을 수 있습니다.

  • 클러스터에 kubeconfig 파일을 만들지 않은 경우.
  • Amazon EKS API 서버 엔드포인트에 연결할 수 없는 경우.

해결 방법

kubeconfig 파일을 만들지 않은 경우

Amazon EKS 클러스터를 생성한 후에는 AWS Command Line Interface(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를 설치할 수 있습니다.

  1. 현재 ID를 확인하여 Amazon EKS 클러스터에 권한이 있는 올바른 보안 인증 정보를 사용하고 있는지 확인합니다.
aws sts get-caller-identity

참고: Amazon 클러스터를 생성할 수 있는 AWS Identity and Access Management(AWS IAM) 엔터티 사용자나 역할에는 클러스터가 생성될 때 자동으로 권한이 부여됩니다. 이 권한은 컨트롤 플레인의 클러스터 RBAC 구성에서 부여됩니다. 또 aws-auth ConfigMap에서도 IAM 사용자나 역할에 Amazon EKS 액세스 권한을 부여할 수 있습니다. 기본적으로 Kubernetes용 AWS IAM 인증기에서는 구성된 AWS CLI나 AWS SDK ID를 사용합니다. 자세한 내용은 클러스터에서 IAM 사용자 및 역할 액세스 켜기를 참고하세요.

  1. 클러스터에서 kubeconfig 파일을 생성하거나 업데이트합니다.
aws eks --region example_region update-kubeconfig --name cluster_name

참고: example_region을 내 AWS 리전 이름으로 변경합니다. cluster_name을 내 클러스터 이름으로 바꿉니다.

기본적으로 Linux용 구성 파일은 홈 디렉터리의 kubeconfig 경로($HOME/.kube/config)에 생성됩니다. 이 파일은 해당 위치에 있는 기존 kubeconfig와 병합될 수도 있습니다. Windows의 경우 %USERPROFILE%\.kube\config에 파일이 있습니다.

KUBECONFIG 환경 변수를 설정하거나(Kubernetes 웹 사이트에서) 다음 --kubeconfig 옵션을 사용해 다른 경로를 지정할 수도 있습니다.

$ kubectl get pods --kubeconfig ./.kube/config

참고: kubectl 명령 실행 시, 인증할 때 Amazon 리소스 이름(ARN)을 --role-arn 옵션을 사용해 지정할 수 있습니다. 아니면 기본 AWS CLI이나 AWS SDK 보안 인증 정보 체인에 있는 IAM 엔터티가 사용됩니다. 자세한 내용은 update-kubeconfig을 참고하세요. 또는 Amazon EKS 클러스터에서 kubeconfig 파일을 생성 또는 업데이트수동으로 kubeconfig 파일 생성에 안내된 6단계를 완료하세요.

  1. 구성 테스트:
$ 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
  1. 다음 명령을 실행해 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"
    ]
}
  1. 위 출력에서 endpointPublicAccesstrue인 경우 publicAccessCidrs 목록의 모든 소스 IP 주소를 허용 목록에 추가해야 합니다. 그러려면 다음을 따르세요.

  2. Amazon EKS 콘솔을 엽니다.

  3. 업데이트할 클러스터를 선택합니다.

  4. 네트워킹 탭에서 네트워킹 관리를 선택합니다.

  5. 공용을 선택합니다.

  6. 고급 설정CIDR 차단에서 허용 목록에 추가하려는 공용 CIDR 범위를 모두 입력합니다.

  7. 변경 사항 저장을 선택합니다.

위 출력에서 endPointPrivateAccesstrue인 경우, kubectl 요청이 클러스터의 네트워크 내에서 오는지 확인해야 합니다. kubectl 요청이 Amazon Virtual Private Cloud(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 서버에 연결할 때 “서버에 로그인해야 합니다(승인되지 않음)” 오류를 해결하려면 어떻게 해야 하나요?

AWS 공식
AWS 공식업데이트됨 일 년 전