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 서버로의 인터넷 액세스를 완전히 비활성화할 수 있습니다.

참고

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

AWS Management Console 또는 AWS CLI를 사용하여 클러스터 API 서버 엔드포인트 액세스를 수정할 수 있습니다.

AWS Management Console
AWS Management Console을 사용하여 클러스터 API 서버 엔드포인트 액세스를 수정하려면
  1. https://console.aws.amazon.com/eks/home#/clusters에서 Amazon EKS 콘솔을 엽니다.

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

  3. 네트워킹(Networking) 탭을 선택하고 업데이트(Update)를 선택합니다.

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

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

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

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

AWS CLI
AWS CLI을 사용하여 클러스터 API 서버 엔드포인트 액세스를 수정하려면

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

  1. 다음 AWS CLI 명령을 통해 클러스터 API 서버 엔드포인트 액세스를 업데이트합니다. 클러스터 이름과 원하는 엔드포인트 액세스 값을 대체합니다. endpointPublicAccess=true를 설정한 경우 선택적으로 단일 CIDR 블록 또는 publicAccessCidrs에 대한 쉼표로 구분된 CIDR 블록 목록을 입력할 수 있습니다. 블록에는 예약된 주소가 포함될 수 없습니다. CIDR 블록을 지정한 경우 퍼블릭 API 서버 엔드포인트는 나열된 블록에서만 요청을 수신합니다. 지정할 수 있는 최대 CIDR 블록 수가 있습니다. 자세한 내용은 Amazon EKS 서비스 할당량 섹션을 참조하세요. CIDR 블록을 사용하여 퍼블릭 엔드포인트에 대한 액세스를 제한하는 경우, 노드와 Fargate Pods(사용하는 경우)가 클러스터와 통신할 수 있도록 프라이빗 엔드포인트 액세스도 활성화하는 것이 좋습니다. 프라이빗 엔드포인트를 활성화하지 않은 경우, 퍼블릭 액세스 엔드포인트 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 my-cluster \ --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 my-cluster \ --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 Bastion Host

Amazon EC2 인스턴스를 클러스터의 VPC에 있는 퍼블릭 서브넷으로 시작한 다음 SSH를 통해 해당 인스턴스에 로그인하여 kubectl 명령을 실행할 수 있습니다. 자세한 내용은 AWS 기반 Linux Bastion Host를 참조하세요. Amazon EKS 제어 영역 보안 그룹에 Bastion Host의 포트 443에서 수신 트래픽을 허용하는 규칙이 포함되어 있는지 확인해야 합니다. 자세한 내용은 Amazon EKS 보안 그룹 요구 사항 및 고려 사항 섹션을 참조하세요.

Bastion Host에 대해 kubectl을 구성할 때 클러스터의 RBAC 구성에 이미 매핑된 AWS 자격 증명을 사용하거나, 엔드포인트 퍼블릭 액세스를 제거하기 전에 Bastion에서 사용할 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) 섹션을 참조하십시오.