내용으로 건너뛰기

Amazon EKS 클러스터에 연결할 수 없는 이유가 무엇입니까?

5분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터를 생성했는데 클러스터에 연결할 수 없습니다.

간략한 설명

Amazon EKS 클러스터에 연결할 수 없다면 다음과 같은 이유 중 하나 때문일 수 있습니다.

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

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

kubeconfig 파일을 생성하지 않은 경우

Amazon EKS 클러스터를 생성한 후 kubectl 명령줄을 사용하여 클러스터에 연결할 수 있도록 kubeconfig 파일을 구성하십시오. kubeconfig 파일에는 Kubernetes 클러스터 구성이 포함되어 있습니다.

운영 체제(OS)에 따라 다음 위치에서 kubeconfig 파일을 찾을 수 있습니다.

  • Linux 또는 macOS의 경우 $HOME/.kube/config로 이동합니다.
  • Windows의 경우 %USERPROFILE%\.kube\config로 이동합니다.

다른 파일 위치를 사용하려면 다음 작업 중 하나를 수행하십시오.

  • 새 위치를 가리키도록 KUBECONFIG 환경 변수를 설정합니다.
  • kubectl 명령을 실행하여 사용자 지정 파일 경로를 지정할 때 --kubeconfig 플래그를 사용합니다.

kubeconfig 파일이 기본 위치에 이미 있는 경우 Amazon EKS는 새 구성을 기존 파일에 병합합니다. kubectl config 명령을 사용하여 클러스터 컨텍스트를 관리할 수 있습니다. 자세한 내용은 Kubernetes 웹사이트의 kubectl config를 참조하십시오.

Amazon EKS API 서버 엔드포인트에 연결할 수 없는 경우

이 문제를 해결하려면 다음 단계를 완료하십시오.

  1. Amazon EKS API 서버 URL에 연결할 수 있는지 확인하려면 매우 상세한 다음과 같은 명령을 실행하십시오.

    kubectl get svc --v=9

    명령 출력에는 연결에 사용되는 API 서버 URL을 비롯한 자세한 연결 정보가 표시됩니다. HTTP 추적: DNS 조회에 나열되는 IP 주소를 확인합니다.
    출력 예시:

    I0110 16:43:36.920095   48173 loader.go:373] Config loaded from file:  /Users/abs/.kube/configI0110 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 서버에 공개적으로 액세스할 수 있는지 확인하려면 다음과 같은 describe-cluster AWS CLI 명령을 실행합니다.

    aws eks describe-cluster --name cluster_name --region example_region --query cluster.resourcesVpcConfig

    참고: cluster_name을 클러스터 이름으로 바꾸고 example_region을 AWS 리전으로 바꾸십시오.
    출력 예시:

    {    "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"
        ]
    }

    공개 액세스를 허용하려면 endpointPublicAccesstrue인지 확인하십시오. 액세스를 비공개로 유지하려면 endpointPublicAccessfalse인지 확인하십시오. endpointPublicAccessfalse인 경우 9단계로 진행합니다. endpointPublicAccesstrue인 경우 endpointPublicAccess를 특정 IP 주소 범위로 제한하는 것이 보안 모범 사례입니다. 3~8단계를 완료하여 허용되는 IP 주소를 publicAccessCidrs CIDR 허용 목록에 추가합니다.

  3. Amazon EKS 콘솔을 엽니다.

  4. 클러스터를 선택한 다음 업데이트하려는 클러스터를 선택합니다.

  5. 네트워킹 탭을 선택한 다음 네트워킹 관리를 선택합니다.

  6. 퍼블릭을 선택합니다.

  7. 고급 설정CIDR 블록에서 허용 목록에 추가할 퍼블릭 CIDR 범위를 입력합니다.
    중요: 프라이빗 서브넷의 워커 노드가 인터넷에 액세스하는 데 사용하는 NAT 게이트웨이의 IP 주소를 포함하십시오. 또한 모든 NAT 디바이스 네트워킹 구성 요소의 IP 주소를 포함하십시오.

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

  9. 클러스터의 API 서버를 프라이빗 전용 모드로 구성한 경우 kubectl 요청이 클러스터의 네트워크에서 오는지 확인하십시오. kubectl 요청이 Amazon Virtual Private Cloud(VPC) 외부에서 오는 경우 get svc 명령을 실행하면 다음과 같은 시간 제한 오류가 표시됩니다.

    $ kubectl get svc --v=9I0110 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
  10. 클러스터 보안 그룹을 업데이트하여 소스 IP 주소 또는 CIDR 범위를 허용 목록에 추가합니다. 그러면 kubectl 클라이언트가 클러스터 VPC 내에서 Amazon EKS API 서버 엔드포인트에 연결되도록 할 수 있습니다.

관련 정보

Amazon EKS 클러스터 및 노드 관련 문제 해결

Amazon EKS API 서버에 연결할 때 발생하는 오류를 해결하려면 어떻게 해야 합니까?"You must be logged in to the server (Unauthorized)"

Amazon EKS 워커 노드에 대한 클러스터 네트워킹의 명확성 해소

Amazon EKS 클러스터의 특정 IP 주소에 대한 API 액세스를 차단하려면 어떻게 해야 합니까?