Amazon EKS 클러스터 엔드포인트 액세스 제어 - Amazon EKS

Amazon EKS 클러스터 엔드포인트 액세스 제어

이 주제에서는 Amazon EKS 클러스터의 Kubernetes API 서버 엔드포인트에 대한 프라이빗 액세스를 활성화하거나 인터넷에서 퍼블릭 액세스를 완전히 비활성화하는 방법을 설명합니다.

새 클러스터를 생성할 때 Amazon EKS에서는 클러스터와 통신하는 데 사용하는 관리형 Kubernetes API 서버에 대한 엔드포인트를 생성합니다(kubectl과 같은 Kubernetes 관리 도구 사용). 기본적으로 이 API 서버 엔드포인트는 인터넷에 공개되어 있으며, API 서버에 대한 액세스는 AWS Identity and Access Management(IAM) 및 기본 Kubernetes RBAC(역할 기반 액세스 제어)의 조합을 통해 보호됩니다.

작업자 노드와 API 서버 간의 모든 통신이 VPC 내에 유지되도록 Kubernetes API 서버에 대한 프라이빗 액세스를 활성화할 수 있습니다. 인터넷에서 API 서버로 액세스하는 IP 주소를 제한하거나 API 서버로의 인터넷 액세스를 완전히 비활성화할 수 있습니다.

참고

이 엔드포인트는 AWS API와 통신하기 위한 기존 AWS PrivateLink 엔드포인트가 아닌 Kubernetes API 서버용 엔드포인트이므로 Amazon VPC 콘솔에서 엔드포인트로 표시되지 않습니다.

클러스터에 대해 엔드포인트 프라이빗 액세스를 활성화하면 Amazon EKS에서는 사용자 대신 Route 53 프라이빗 호스팅 영역을 생성하고 클러스터의 VPC에 연결합니다. 이 프라이빗 호스팅 영역은 Amazon EKS에서 관리하며, 사용자 계정의 Route 53 리소스에는 표시되지 않습니다. 프라이빗 호스팅 영역이 API 서버로 트래픽을 올바로 라우팅하려면 VPC에서 enableDnsHostnamesenableDnsSupporttrue로 설정되어야 하고, VPC에 설정된 DHCP 옵션이 도메인 이름 서버 목록에 AmazonProvidedDNS를 포함해야 합니다. 자세한 내용은 Amazon VPC 사용 설명서Updating DNS Support for Your VPC 단원을 참조하십시오.

참고

IAM 사용자 또는 역할에는 표준 Amazon EKS 권한 외에 클러스터의 엔드포인트에 대한 프라이빗 액세스를 위한 route53:AssociateVPCWithHostedZone 권한도 있어야 합니다.

새 클러스터를 생성할 때 API 서버 엔드포인트 액세스 요구 사항을 정의할 수 있으며, 언제든지 클러스터에 대한 API 서버 엔드포인트 액세스를 업데이트할 수 있습니다.

클러스터 엔드포인트 액세스 수정

이 단원의 절차를 통해 기존 클러스터에 대한 엔드포인트 액세스를 수정합니다. 다음 표에는 지원되는 API 서버 엔드포인트 액세스 조합과 연결된 동작이 나와 있습니다.

API 서버 엔드포인트 액세스 옵션
엔드포인트 퍼블릭 액세스 엔드포인트 프라이빗 액세스 동작
활성 Disabled
  • 새 Amazon EKS 클러스터의 기본 동작입니다.

  • 클러스터의 VPC 내에서 비롯된 Kubernetes API 요청(예: 제어 플레인 통신에 대한 작업자 노드)은 VPC에서 벗어나지만, Amazon의 네트워크에서는 벗어나지 않습니다.

  • 인터넷에서 클러스터 API 서버에 액세스할 수 있습니다. 선택적으로 퍼블릭 엔드포인트에 액세스할 수 있는 CIDR 블록을 제한할 수 있습니다. 특정 CIDR 블록에 대한 액세스를 제한하는 경우, 프라이빗 엔드포인트를 활성화하거나 지정된 CIDR 블록에 작업자 노드와 Fargate 포드(사용하는 경우)가 퍼블릭 엔드포인트에 액세스하는 주소가 포함되도록 하는 것이 좋습니다.

활성 활성
  • 클러스터의 VPC 내 Kubernetes API 요청(예: 제어 플레인 통신에 대한 작업자 노드)은 프라이빗 VPC 엔드포인트를 사용합니다.

  • 인터넷에서 클러스터 API 서버에 액세스할 수 있습니다. 선택적으로 퍼블릭 엔드포인트에 액세스할 수 있는 CIDR 블록을 제한할 수 있습니다.

Disabled 활성
  • 클러스터 API 서버에 대한 모든 트래픽은 클러스터의 VPC 또는 연결된 네트워크 내에서 비롯되어야 합니다.

  • 인터넷에서 API 서버로 퍼블릭 액세스할 수 없습니다. 모든 kubectl 명령은 VPC 또는 연결된 네트워크 내에서 가져와야 합니다. 연결 옵션은 프라이빗 전용 API 서버 액세스 단원을 참조하십시오.

  • 클러스터의 API 서버 엔드포인트는 퍼블릭 DNS 서버에 의해 VPC의 프라이빗 IP 주소로 확인됩니다. 이전에는 VPC 내에서만 엔드포인트를 확인할 수 있었습니다.

    엔드포인트가 VPC 내부에서 기존 클러스터에 대한 프라이빗 IP 주소로 확인되지 않는 경우 다음을 수행할 수 있습니다.

    • 퍼블릭 액세스를 활성화한 다음 다시 비활성화합니다. 클러스터에 대해 한 번만 수행하면 엔드포인트가 해당 시점부터 프라이빗 IP 주소로 확인됩니다.

    • 클러스터를 업데이트합니다.

AWS Management 콘솔 또는 AWS CLI를 사용하여 클러스터 API 서버 엔드포인트 액세스를 수정할 수 있습니다. 지침을 보려면 사용할 도구의 탭을 선택하십시오.

AWS Management 콘솔
  1. Open the Amazon EKS console at https://console.aws.amazon.com/eks/home#/clusters.

  2. 클러스터 이름을 선택하여 클러스터 정보를 표시합니다.

  3. Networking(네트워킹)에서 Update(업데이트)를 선택합니다.

  4. Private access(프라이빗 액세스)에서 클러스터의 Kubernetes API 서버 엔드포인트에 대해 프라이빗 액세스를 활성화할지 아니면 비활성화할지를 선택합니다. 프라이빗 액세스를 활성화하면 클러스터의 VPC 내에서 비롯된 Kubernetes API 요청이 프라이빗 VPC 엔드포인트를 사용합니다. 퍼블릭 액세스를 비활성화하려면 프라이빗 액세스를 활성화해야 합니다.

  5. Public access(퍼블릭 액세스)에서 클러스터의 Kubernetes API 서버 엔드포인트에 대해 퍼블릭 액세스를 활성화할지 아니면 비활성화할지를 선택합니다. 퍼블릭 액세스를 비활성화하면 클러스터의 Kubernetes API 서버가 클러스터의 VPC 내에서 비롯된 요청만 수신할 수 있습니다.

  6. (선택 사항) 퍼블릭 액세스를 활성화한 경우, 인터넷에서 퍼블릭 엔드포인트와 통신할 수 있는 주소를 지정할 수 있습니다. Advanced Settings(고급 설정)를 선택합니다. CIDR 블록(예: 203.0.113.5/32)을 입력합니다. 블록에는 예약된 주소가 포함될 수 없습니다. Add Source(소스 추가)를 선택하여 추가 블록을 입력할 수 있습니다. 지정할 수 있는 최대 CIDR 블록 수가 있습니다. 자세한 내용은 Amazon EKS 서비스 할당량 단원을 참조하십시오. 블록을 지정하지 않은 경우 퍼블릭 API 서버 엔드포인트는 모든 (0.0.0.0/0) IP 주소에서 요청을 수신합니다. CIDR 블록을 사용하여 퍼블릭 엔드포인트에 대한 액세스를 제한하는 경우, 작업자 노드와 Fargate 포드(사용하는 경우)가 클러스터와 통신할 수 있도록 프라이빗 엔드포인트 액세스도 활성화하는 것이 좋습니다. 프라이빗 엔드포인트를 활성화하지 않은 경우, 퍼블릭 액세스 엔드포인트 CIDR 소스에는 VPC의 송신 소스가 포함되어야 합니다. 예를 들어 NAT 게이트웨이를 통해 인터넷과 통신하는 프라이빗 서브넷에 작업자 노드가 있는 경우, 퍼블릭 엔드포인트에서 화이트리스트로 지정된 CIDR 블록의 일부로 NAT 게이트웨이의 아웃바운드 IP 주소를 추가해야 합니다.

  7. Update(업데이트)를 선택하여 완료합니다.

AWS CLI

AWS CLI 버전 1.18.86 이상을 사용하여 다음 단계를 완료합니다. aws --version을 사용하여 현재 버전을 확인할 수 있습니다. AWS CLI를 설치하거나 업그레이드하려면 AWS CLI 설치를 참조하십시오,

  1. 다음 AWS CLI 명령을 통해 클러스터 API 서버 엔드포인트 액세스를 업데이트합니다. 클러스터 이름과 원하는 엔드포인트 액세스 값을 대체합니다. endpointPublicAccess=true를 설정한 경우 선택적으로 단일 CIDR 블록 또는 publicAccessCidrs에 대한 쉼표로 구분된 CIDR 블록 목록을 입력할 수 있습니다. 블록에는 예약된 주소가 포함될 수 없습니다. CIDR 블록을 지정한 경우 퍼블릭 API 서버 엔드포인트는 나열된 블록에서만 요청을 수신합니다. 지정할 수 있는 최대 CIDR 블록 수가 있습니다. 자세한 내용은 Amazon EKS 서비스 할당량 단원을 참조하십시오. CIDR 블록을 사용하여 퍼블릭 엔드포인트에 대한 액세스를 제한하는 경우, 작업자 노드와 Fargate 포드(사용하는 경우)가 클러스터와 통신할 수 있도록 프라이빗 엔드포인트 액세스도 활성화하는 것이 좋습니다. 프라이빗 엔드포인트를 활성화하지 않은 경우, 퍼블릭 액세스 엔드포인트 CIDR 소스에는 VPC의 송신 소스가 포함되어야 합니다. 예를 들어 NAT 게이트웨이를 통해 인터넷과 통신하는 프라이빗 서브넷에 작업자 노드가 있는 경우, 퍼블릭 엔드포인트에서 화이트리스트로 지정된 CIDR 블록의 일부로 NAT 게이트웨이의 아웃바운드 IP 주소를 추가해야 합니다. CIDR 블록을 지정하지 않은 경우 퍼블릭 API 서버 엔드포인트는 모든 (0.0.0.0/0) IP 주소에서 요청을 수신합니다.

    참고

    다음 명령은 API 서버 엔드포인트에 대한 단일 IP 주소에서 프라이빗 액세스 및 퍼블릭 액세스를 활성화합니다. 203.0.113.5/32를 단일 CIDR 블록 또는 네트워크 액세스를 제한할 쉼표로 구분된 CIDR 블록 목록으로 바꿉니다.

    aws eks update-cluster-config \ --region region-code \ --name dev \ --resources-vpc-config endpointPublicAccess=true,publicAccessCidrs="203.0.113.5/32",endpointPrivateAccess=true

    결과:

    { "update": { "id": "e6f0905f-a5d4-4a2a-8c49-EXAMPLE00000", "status": "InProgress", "type": "EndpointAccessUpdate", "params": [ { "type": "EndpointPublicAccess", "value": "true" }, { "type": "EndpointPrivateAccess", "value": "true" }, { "type": "publicAccessCidrs", "value": "[\203.0.113.5/32\"]" } ], "createdAt": 1576874258.137, "errors": [] } }
  2. 이전 명령에서 반환된 클러스터 이름과 업데이트 ID를 사용하여 다음 명령으로 엔드포인트 액세스 업데이트의 상태를 모니터링합니다. 상태가 Successful로 표시되면 업데이트가 완료된 것입니다.

    aws eks describe-update \ --region region-code \ --name dev \ --update-id e6f0905f-a5d4-4a2a-8c49-EXAMPLE00000

    결과:

    { "update": { "id": "e6f0905f-a5d4-4a2a-8c49-EXAMPLE00000", "status": "Successful", "type": "EndpointAccessUpdate", "params": [ { "type": "EndpointPublicAccess", "value": "true" }, { "type": "EndpointPrivateAccess", "value": "true" }, { "type": "publicAccessCidrs", "value": "[\203.0.113.5/32\"]" } ], "createdAt": 1576874258.137, "errors": [] } }

프라이빗 전용 API 서버 액세스

클러스터의 Kubernetes API 서버 엔드포인트에 대해 퍼블릭 액세스를 비활성화하면 VPC 또는 연결된 네트워크 내에서만 API 서버에 액세스할 수 있습니다. Kubernetes API 서버 엔드포인트에 액세스하는 방법은 다음과 같습니다.

  • 연결된 네트워크AWS 전송 게이트웨이 또는 기타 연결 옵션을 사용하여 네트워크를 VPC에 연결한 다음 연결된 네트워크의 컴퓨터를 사용합니다. Amazon EKS 제어 플레인 보안 그룹에 연결된 네트워크의 포트 443에서 수신 트래픽을 허용하는 규칙이 포함되어 있는지 확인해야 합니다.

  • Amazon EC2 배스천 호스트 – Amazon EC2 인스턴스를 클러스터의 VPC에 있는 퍼블릭 서브넷으로 시작한 다음 SSH를 통해 해당 인스턴스에 로그인하여 kubectl 명령을 실행할 수 있습니다. 자세한 내용은 AWS 기반 Linux 배스천 호스트를 참조하십시오. Amazon EKS 제어 플레인 보안 그룹에 베스천 호스트의 포트 443에서 수신 트래픽을 허용하는 규칙이 포함되어 있는지 확인해야 합니다. 자세한 내용은 Amazon EKS 보안 그룹 고려 사항 단원을 참조하십시오.

    배스천 호스트에 대해 kubectl을 구성할 때 클러스터의 RBAC 구성에 이미 매핑된 AWS 자격 증명을 사용하거나, 엔드포인트 퍼블릭 액세스를 제거하기 전에 배스천에서 사용할 IAM 사용자 또는 역할을 RBAC 구성에 추가해야 합니다. 자세한 내용은 클러스터의 사용자 또는 IAM 역할 관리권한이 없거나 액세스가 거부됨(kubectl) 단원을 참조하십시오.

  • AWS Cloud9 IDE – AWS Cloud9는 브라우저만으로 코드를 작성, 실행 및 디버깅할 수 있는 클라우드 기반 통합 개발 환경(IDE)입니다. 클러스터의 VPC에 AWS Cloud9 IDE를 생성할 수 있으며, IDE를 사용하여 클러스터와 통신할 수 있습니다. 자세한 내용은 AWS Cloud9에서 환경 생성 단원을 참조하십시오. Amazon EKS 제어 플레인 보안 그룹에 IDE 보안 그룹의 포트 443에서 수신 트래픽을 허용하는 규칙이 포함되어 있는지 확인해야 합니다. 자세한 내용은 Amazon EKS 보안 그룹 고려 사항 단원을 참조하십시오.

    AWS Cloud9 IDE에 대해 kubectl을 구성할 때 클러스터의 RBAC 구성에 이미 매핑된 AWS 자격 증명을 사용하거나, 엔드포인트 퍼블릭 액세스를 제거하기 전에 IDE에서 사용할 IAM 사용자 또는 역할을 RBAC 구성에 추가해야 합니다. 자세한 내용은 클러스터의 사용자 또는 IAM 역할 관리권한이 없거나 액세스가 거부됨(kubectl) 단원을 참조하십시오.