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 이상이 설치되어 있어야 합니다. 그렇지 않으면 오류가 발생합니다.

팁: yum, apt-get 또는 macOS용 homebrew와 같은 패키지 관리자를 사용하여 AWS CLI를 설치하세요.

2.    현재 자격 증명을 확인하여 Amazon EKS 클러스터에 대한 권한이 있는 올바른 자격 증명을 사용하고 있는지 확인합니다.

aws sts get-caller-identity

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

3.    클러스터에 대한 kubeconfig 파일을 만들거나 업데이트합니다.

aws eks --region example_region update-kubeconfig --name cluster_name

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

기본적으로 리눅스용 구성 파일은 홈 디렉터리의 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. Networking(네트워킹) 탭을 선택한 다음, Manage Networking(네트워킹 관리)를 선택합니다.
  4. Public(퍼블릭)을 선택합니다
  5. Advanced settings(고급 설정)의 CIDR block(CIDR 블록)에서 허용 목록에 추가해야 하는 모든 퍼블릭 CIDR 범위를 입력합니다.
  6. Save changes(변경 사항 저장)을 선택합니다.

이전의 출력에서 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 서버에 연결할 때 발생하는 'You must be logged in to the server(Unauthorized)서버에 로그인해야 합니다(무단)' 오류를 해결하려면 어떻게 해야 하나요?

AWS 공식
AWS 공식업데이트됨 2달 전