비공개 클러스터

이 페이지에서는 Google Kubernetes Engine(GKE)에서 비공개 클러스터가 작동하는 방식을 설명합니다. 비공개 클러스터를 만들고 관리하는 방법도 설명합니다.

비공개 클러스터내부 IP 주소에만 의존하는 VPC 기반 클러스터 유형입니다. 비공개 클러스터의 노드, Pod, 서비스에는 고유한 서브넷 IP 주소 범위가 필요합니다.

Standard 또는 Autopilot에서 비공개 클러스터를 만들고 구성할 수 있습니다.

특정 비공개 노드에 아웃바운드 인터넷 액세스 권한을 부여하려면 Cloud NAT를 사용하거나 자체 NAT 게이트웨이를 관리하면 됩니다.

아키텍처

비공개 클러스터는 외부 IP 주소가 없는 노드를 사용합니다. 즉, 인터넷의 클라이언트가 노드의 IP 주소에 연결할 수 없습니다. 예를 들어 비공개 클러스터에 호스팅된 NodePort 유형의 서비스는 노드에 인터넷 라우팅이 가능한 공개 IP 주소가 없으므로 외부 클라이언트에 액세스할 수 없습니다.

공개 클러스터와 달리 비공개 클러스터에는 제어 영역 비공개 엔드포인트와 제어 영역 공개 엔드포인트가 모두 있습니다. 제어 영역의 비공개 엔드포인트에 고유한 /28 IP 주소 범위를 지정해야 하며 제어 영역의 공개 엔드포인트를 사용 중지할 수 있습니다.

다음 다이어그램은 비공개 클러스터의 아키텍처를 간략하게 보여줍니다.

비공개 클러스터 아키텍처

노드가 내부 IP 주소를 사용하더라도 외부 클라이언트가 클러스터의 서비스에 연결할 수 있습니다. 예를 들면 다음과 같습니다.

비공개 클러스터에서 비공개 Google 액세스 사용

클러스터와 동일한 프로젝트에서 VPC 네트워크를 사용하는 비공개 클러스터의 경우 GKE는 클러스터를 만들 때 비공개 클러스터에서 사용하는 서브넷에 비공개 Google 액세스를 사용 설정해야 합니다. 공유 VPC 호스트 프로젝트의 네트워크 관리자, 프로젝트 소유자 또는 프로젝트 편집자는 비공개 클러스터가 공유 VPC 서비스 프로젝트에서 생성된 경우, 비공개 클러스터에서 사용하는 서브넷에 비공개 Google 액세스를 수동으로 사용 설정해야 합니다.

비공개 Google 액세스는 공유 VPC 클러스터를 제외하고 비공개 클러스터에서 기본적으로 사용 설정됩니다. 공유 VPC 클러스터의 경우 비공개 Google 액세스를 수동으로 사용 설정해야 합니다.

비공개 Google 액세스는 Google Cloud API 및 Google 비공개 네트워크에 대한 서비스 액세스 권한을 비공개 노드와 워크로드에 제공합니다. 예를 들어 비공개 클러스터가 Artifact Registry에서 컨테이너 이미지에 액세스하고 Cloud Logging으로 로그를 전송하려면 비공개 Google 액세스가 필요합니다.

비공개 클러스터의 제어 영역

모든 GKE 클러스터에는 제어 영역(마스터)에서 관리되는 Kubernetes API 서버가 있습니다.

제어 영역은 Google 소유 프로젝트의 VPC 네트워크에 있는 가상 머신(VM)에서 실행됩니다. 리전 클러스터에는 여러 제어 영역이 있으며 각 제어 영역은 자체 VM에서 실행됩니다.

비공개 클러스터에서 제어 영역의 VPC 네트워크는 VPC 네트워크 피어링을 통해 클러스터의 VPC 네트워크에 연결됩니다. VPC 네트워크에는 클러스터 노드가 포함되고 Google 소유의 Google Cloud VPC 네트워크에는 클러스터의 제어 영역이 포함됩니다.

노드와 제어 영역 간의 트래픽은 전적으로 내부 IP 주소를 통해 라우팅됩니다. VPC 네트워크 피어링을 사용하여 클러스터의 VPC 네트워크를 세 번째 네트워크에 연결하면 세 번째 네트워크는 제어 영역의 VPC 네트워크에 있는 리소스에 도달할 수 없습니다. 이는 VPC 네트워크 피어링이 직접 피어링된 네트워크 간의 통신만 지원하고 세 번째 네트워크는 제어 영역 네트워크와 피어링될 수 없기 때문입니다. 자세한 내용은 VPC 네트워크 피어링 제한을 참조하세요.

VPC 네트워크 피어링 재사용

2020년 1월 15일 이후에 생성된 비공개 클러스터는 클러스터가 같은 위치에 있고 동일한 VPC 네트워크를 사용하는 경우 공통 VPC 네트워크 피어링 연결을 사용합니다. 여기에서 위치는 Google Cloud 리전 또는 Google Cloud 영역을 배타적으로 나타냅니다.

  • 영역 클러스터의 경우, 영역에서 만드는 첫 번째 비공개 클러스터는 클러스터의 VPC 네트워크에 대한 새로운 VPC 네트워크 피어링 연결을 생성합니다. 동일한 영역 및 VPC 네트워크에서 만드는 추가 영역 비공개 클러스터는 동일한 피어링 연결을 사용합니다.

  • 리전 클러스터의 경우 리전에서 처음 만든 비공개 클러스터가 클러스터의 VPC 네트워크에 대한 새 VPC 네트워크 피어링 연결을 생성합니다. 동일한 리전 및 VPC 네트워크에서 만드는 추가 리전 비공개 클러스터는 동일한 피어링 연결을 사용합니다.

  • GKE는 영역 클러스터가 리전 클러스터와 동일한 리전에 속하는 경우에도 영역 클러스터 및 리전 클러스터에 공통 피어링을 사용하지 않습니다.

다음 예시는 이 동작을 명확하게 설명합니다. 각 예시에서는 VPC 네트워크 피어링 연결 한 개를 사용합니다.

  • us-east1-b 영역에 동일한 VPC 네트워크를 사용하는 둘 이상의 영역 비공개 클러스터

  • 동일한 VPC 네트워크를 사용하는, us-east1 리전에 있는 두 개 이상의 리전 비공개 클러스터

하지만 동일한 VPC 네트워크를 사용하는, us-east1-b에 있는 하나 이상의 영역 비공개 클러스터와 us-east1에 있는 하나 이상의 리전 클러스터에는 두 개의 VPC 네트워크 피어링 연결이 필요합니다.

비공개 클러스터 및 연결에 대한 자세한 내용은 VPC 네트워크 피어링 재사용을 참조하세요.

비공개 클러스터의 엔드포인트

비공개 클러스터의 제어 영역에는 공개 엔드포인트 외에도 비공개 엔드포인트가 있습니다. 비공개가 아닌 클러스터의 제어 영역에는 공개 엔드포인트만 있습니다.

비공개 엔드포인트
비공개 엔드포인트는 제어 영역의 VPC 네트워크에 있는 내부 IP 주소입니다. 비공개 클러스터에서 노드는 항상 제어 영역의 비공개 엔드포인트와 통신합니다. 구성에 따라 kubectl과 같은 도구를 사용하여 클러스터를 관리할 수 있으며 이 도구는 비공개 엔드포인트에도 연결됩니다. 비공개 클러스터를 통해 동일한 서브넷을 사용하는 모든 VM은 비공개 엔드포인트에 액세스할 수도 있습니다.
공개 엔드포인트
제어 영역의 외부 IP 주소입니다. 기본적으로 kubectl과 같은 도구는 공개 엔드포인트에서 제어 영역과 통신합니다.

클러스터 엔드포인트에 액세스

다음 구성 중 하나를 사용하여 엔드포인트에 대한 액세스를 제어할 수 있습니다.

  • 공개 엔드포인트 액세스 중지: 제어 영역에 대한 모든 인터넷 액세스를 차단하므로 가장 안전한 옵션입니다. Cloud Interconnect 또는 Cloud VPN을 사용하여 온프레미스 네트워크를 Google Cloud에 연결하도록 구성한 경우에 적합합니다.

    공개 엔드포인트 액세스를 중지하면 비공개 엔드포인트에 승인된 네트워크를 구성해야 합니다. 이 작업을 수행하지 않으면 클러스터와 동일한 서브넷의 클러스터 노드 또는 VM에서만 비공개 엔드포인트에 연결할 수 있습니다. 이 설정의 경우 승인된 네트워크는 내부 IP 주소여야 합니다.

  • 공개 엔드포인트 액세스 사용 설정, 승인된 네트워크 사용 설정: 이 구성에서 승인된 네트워크는 제어 영역의 공개 엔드포인트에 적용됩니다. 이는 Cloud Interconnect 또는 Cloud VPN을 사용하여 클러스터의 VPC 네트워크에 연결되지 않은 소스 네트워크에서 클러스터를 관리해야 하는 경우에 적합합니다.

  • 공개 엔드포인트 액세스 사용 설정, 승인된 네트워크 중지: 기본값이며 최소한으로 제한되는 옵션입니다. 승인된 네트워크를 사용 설정하지 않으므로 인증 후 모든 소스 IP 주소에서 클러스터를 관리할 수 있습니다.

다음 표에는 엔드포인트에 액세스할 수 있는 여러 가지 방법이 요약되어 있습니다.

공개 엔드포인트 액세스 중지 공개 엔드포인트 액세스 사용 설정,
승인된 네트워크 사용 설정.
공개 엔드포인트 액세스 사용 설정,
승인된 네트워크 사용 안 함.
보안 제어 영역에 대한 최고 수준의 제한된 액세스. 제어 영역의 공개 엔드포인트에 대한 클라이언트 액세스가 차단됩니다. 제어 영역에 대한 액세스는 내부 IP 주소에서 이루어져야 합니다. 정의된 내부 및 외부 IP 주소로부터 제어 영역에 대한 제한된 액세스 모든 IP 주소로부터 제어 영역에 대한 액세스
세부 구성 단계 클라이언트가 공개 엔드포인트에 액세스할 수 없는 비공개 클러스터 만들기 공개 엔드포인트에 대한 액세스가 제한된 비공개 클러스터 만들기 공개 엔드포인트에 무제한으로 액세스할 수 있는 비공개 클러스터 만들기
Cloud Console 구성 옵션
  1. VPC 기반 사용을 선택합니다.
  2. 비공개 클러스터를 선택합니다.
  3. 외부 IP 주소를 사용하여 제어 영역 액세스를 선택 해제합니다.
    제어 영역 승인된 네트워크 사용 설정이 자동으로 사용 설정됩니다.
  1. VPC 기반 사용을 선택합니다.
  2. 비공개 클러스터를 선택합니다.
  3. 외부 IP 주소를 사용하여 제어 영역 액세스를 선택합니다.
  4. 제어 영역 승인된 네트워크 사용 설정을 선택합니다.
  1. VPC 기반 사용을 선택합니다.
  2. 비공개 클러스터를 선택합니다.
  3. 외부 IP 주소를 사용하여 제어 영역 액세스를 선택합니다.
  4. 제어 영역 승인된 네트워크 사용 설정을 선택 해제합니다.
gcloud 클러스터 생성 플래그 --enable-ip-alias
--enable-private-nodes
--enable-private-endpoint
--enable-master-authorized-networks
--enable-ip-alias
--enable-private-nodes
--enable-master-authorized-networks
--enable-ip-alias
--enable-private-nodes
--no-enable-master-authorized-networks
노드와 제어 영역 간 통신

노드는 항상 비공개 엔드포인트를 사용하여 제어 영역과 통신합니다.

노드와 API 서버 간의 웹훅 통신

443 이외의 targetPort로 서비스를 사용하는 웹훅에는 이를 허용하는 방화벽 규칙이 필요합니다. 자세한 내용은 특정 사용 사례를 위한 방화벽 규칙 추가를 참조하세요.

제어 영역(마스터) 승인된 네트워크

노드 및 Pod가 아닌 내부 IP 주소로부터 제어 영역에 대한 액세스에 필요합니다.

노드의 내부 IP 주소 범위를 명시적으로 승인할 필요가 없습니다. 클러스터 서브넷의 기본 IP 주소 범위에 있는 주소는 항상 비공개 엔드포인트와 통신하도록 승인됩니다.

--master-authorized-networks를 사용하여 제어 영역에 액세스할 수 있는 추가 내부 IP 주소를 지정합니다. 공개 엔드포인트에 대한 액세스가 사용되지 않기 때문에 승인된 네트워크 목록에 외부 IP 주소를 포함할 수 없습니다.

외부 IP 주소와 내부 IP 주소(노드 및 Pod 제외)에서 제어 영역에 액세스하는 데 필요합니다.

--master-authorized-networks를 사용하여 제어 영역에 액세스할 수 있는 외부 및 내부 IP 주소(노드 및 Pod 제외)를 지정합니다.

사용되지 않음.

승인된 네트워크를 사용 설정하지 않고 제어 영역의 공개 엔드포인트에 대한 액세스를 사용 설정하면 제어 영역의 공개 엔드포인트에 대한 액세스가 제한되지 않습니다.

kubectl을 사용한 액세스

노드에서: 항상 비공개 엔드포인트를 사용합니다. kubectl비공개 엔드포인트를 사용하도록 구성되어야 합니다.

클러스터의 VPC 네트워크에 있는 다른 VM에서: 다른 VM은 클러스터와 같은 리전에 있고 내부 IP 주소가 승인된 네트워크 목록에 있거나 클러스터의 노드와 동일한 서브넷에 있는 경우에만 kubectl을 사용하여 비공개 엔드포인트와 통신할 수 있습니다. kubectl비공개 엔드포인트를 사용하도록 구성되어야 합니다.

공개 IP 주소에서: 불가능합니다.

노드에서: 항상 비공개 엔드포인트를 사용합니다. kubectl은 반드시 비공개 엔드포인트를 사용하도록 구성되어야 합니다.

클러스터의 VPC 네트워크에 있는 다른 VM에서: 다른 VM은 클러스터와 같은 리전에 있고 내부 IP 주소가 승인된 네트워크 목록에 있거나 클러스터의 노드와 동일한 서브넷에 있는 경우에만 kubectl을 사용하여 비공개 엔드포인트와 통신할 수 있습니다. kubectl비공개 엔드포인트를 사용하도록 구성되어야 합니다.

공개 IP 주소에서: 공개 IP 주소가 있는 머신은 공개 IP 주소가 승인된 네트워크 목록에 포함된 경우에만 kubectl을 사용하여 공개 엔드포인트와 통신할 수 있습니다. 여기에는 Google Cloud 외부의 시스템과 외부 IP 주소가 포함된 Google Cloud VM이 포함됩니다.

노드에서: 항상 비공개 엔드포인트를 사용합니다. kubectl은 반드시 비공개 엔드포인트를 사용하도록 구성되어야 합니다.

클러스터의 VPC 네트워크에 있는 다른 VM에서: 다른 VM은 클러스터와 같은 리전에 있는 경우에만 kubectl을 사용하여 비공개 엔드포인트와 통신할 수 있습니다. kubectl비공개 엔드포인트를 사용하도록 구성되어야 합니다.

공개 IP 주소에서: 공개 IP 주소가 있는 모든 머신은 kubectl을 사용하여 공개 엔드포인트와 통신할 수 있습니다. 여기에는 Google Cloud 외부의 머신과 외부 IP 주소가 있는 Google Cloud VM이 포함됩니다.

다음 단계