Amazon EKS 클러스터에 연결할 수 없는 이유가 무엇인가요?
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. 위의 출력에서 endpointPublicAccess가 true인 경우, publicAccessCidrs 목록의 모든 소스 IP 주소를 허용 목록에 추가해야 합니다. 이를 위해서는 다음을 수행해야 합니다.
- Amazon EKS 콘솔을 엽니다.
- 업데이트하고자 하는 클러스터를 선택합니다.
- Networking(네트워킹) 탭을 선택한 다음, Manage Networking(네트워킹 관리)를 선택합니다.
- Public(퍼블릭)을 선택합니다
- Advanced settings(고급 설정)의 CIDR block(CIDR 블록)에서 허용 목록에 추가해야 하는 모든 퍼블릭 CIDR 범위를 입력합니다.
- Save changes(변경 사항 저장)을 선택합니다.
이전의 출력에서 endPointPrivateAccess가 true일 경우, 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 서버 엔드포인트에 연결할 수 있습니다.
관련 정보
관련 콘텐츠
- 질문됨 2달 전lg...
- 질문됨 한 달 전lg...
- 질문됨 한 달 전lg...
- 질문됨 6년 전lg...
- AWS 공식업데이트됨 3달 전
- AWS 공식업데이트됨 3달 전
- AWS 공식업데이트됨 7달 전
- AWS 공식업데이트됨 3달 전