비공개 클러스터 만들기


이 페이지에서는 VPC 기반 클러스터의 일종인 비공개 Google Kubernetes Engine(GKE) 클러스터를 만드는 방법을 설명합니다. 비공개 클러스터의 노드에는 내부 IP 주소만 있습니다. 즉, 노드와 포드는 기본적으로 인터넷에서 격리되어 있습니다.

노드의 내부 IP 주소는 클러스터에서 선택하는 서브넷의 기본 IP 주소 범위에서 가져옵니다. 포드 IP 주소와 서비스 IP 주소는 동일한 서브넷의 두 서브넷 보조 IP 주소 범위에서 가져옵니다. 자세한 내용은 VPC 기반 클러스터의 IP 범위를 참조하세요.

GKE 버전 1.14.2 이상은 비공개 범위(RFC 1918 및 기타 비공개 범위)와 비공개로 사용되는 공개 IP 주소 범위를 비롯한 모든 내부 IP 주소 범위를 지원합니다. 유효한 내부 IP 주소 범위 목록은 VPC 문서를 참조하세요.

비공개 클러스터 작동 방식에 대한 자세한 내용은 비공개 클러스터를 참조하세요.

시작하기 전에

다음 단계로 이동하기 전에 요구사항 및 제한사항을 숙지하세요.

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • 클러스터를 만들 수 있는 올바른 권한이 있는지 확인합니다. 최소한 Kubernetes Engine 클러스터 관리자 권한이 있어야 합니다.

  • 기본 인터넷 게이트웨이에 대한 경로가 있는지 확인합니다.

클라이언트가 공개 엔드포인트에 액세스할 수 없는 비공개 클러스터 만들기

이 섹션에서는 다음 리소스를 만듭니다.

  • 비공개 노드가 있고 공개 엔드포인트에 대한 클라이언트 액세스 권한이 없는 private-cluster-0라는 비공개 클러스터
  • 이름이 my-net-0인 네트워크
  • 이름이 my-subnet-0인 서브넷

Console

네트워크 및 서브넷 만들기

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. VPC 네트워크 만들기를 클릭합니다.

  3. 이름my-net-0를 입력합니다.

  4. 서브넷 생성 모드커스텀을 선택합니다.

  5. 새 서브넷 상자의 이름my-subnet-0를 입력합니다.

  6. 리전 목록에서 원하는 리전을 선택합니다.

  7. IP 주소 범위10.2.204.0/22을 입력합니다.

  8. 비공개 Google 액세스사용으로 설정합니다.

  9. 완료를 클릭합니다.

  10. 만들기를 클릭합니다.

비공개 클러스터 만들기

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭하고 Standard 또는 Autopilot 섹션에서 구성을 클릭합니다.

  3. 이름private-cluster-0를 지정합니다.

  4. 탐색창에서 네트워킹을 클릭합니다.

  5. 네트워크 목록에서 my-net-0을 선택합니다.

  6. 노드 서브넷 목록에서 my-subnet-0을 선택합니다.

  7. 비공개 클러스터 라디오 버튼을 선택합니다.

  8. 외부 IP 주소를 사용한 액세스 제어 영역 체크박스를 선택 취소합니다.

  9. (Autopilot 선택사항): 제어 영역 IP 범위172.16.0.32/28로 설정합니다.

  10. 만들기를 클릭합니다.

gcloud

  • Autopilot 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create-auto private-cluster-0 \
        --create-subnetwork name=my-subnet-0 \
        --enable-master-authorized-networks \
        --enable-private-nodes \
        --enable-private-endpoint
    
  • Standard 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create private-cluster-0 \
        --create-subnetwork name=my-subnet-0 \
        --enable-master-authorized-networks \
        --enable-ip-alias \
        --enable-private-nodes \
        --enable-private-endpoint \
        --master-ipv4-cidr 172.16.0.32/28
    

각 항목의 의미는 다음과 같습니다.

  • --create-subnetwork name=my-subnet-0은 GKE가 자동으로 my-subnet-0이라는 서브넷을 생성하도록 합니다.
  • --enable-master-authorized-networks는 공개 엔드포인트에 대한 액세스를 사용자가 승인한 IP 주소 범위로 제한합니다.
  • --enable-ip-alias는 클러스터를 VPC 기반으로 만듭니다(Autopilot의 경우 필수 아님).
  • --enable-private-nodes는 클러스터의 노드에 외부 IP 주소가 없음을 나타냅니다.
  • --enable-private-endpoint는 클러스터가 제어 영역 API 엔드포인트의 내부 IP 주소를 사용하여 관리됨을 나타냅니다.
  • --master-ipv4-cidr 172.16.0.32/28은 제어 영역의 내부 IP 주소 범위를 지정합니다(Autopilot의 경우 선택사항). 이 설정은 이 클러스터에 영구적으로 유지되며 VPC 내에서 고유해야 합니다. 비RFC 1918 내부 IP 주소를 사용할 수 있습니다.

API

공개적으로 연결 가능한 제어 영역 없이 클러스터를 만들려면 privateClusterConfig 리소스에 enablePrivateEndpoint: true 필드를 지정합니다.

이 시점에서 다음의 IP 주소에서만 제어 영역에 액세스할 수 있습니다.

  • my-subnet-0의 기본 범위
  • 포드에 사용되는 보조 범위

예를 들어 기본 범위 my-subnet-0에 VM을 만들었다고 가정해 보겠습니다. 그런 다음 이 VM에서 제어 영역의 내부 IP 주소를 사용하도록 kubectl을 구성할 수 있습니다.

my-subnet-0 외부에서 제어 영역에 액세스하려면 비공개 엔드포인트에 액세스할 수 있는 하나 이상의 주소 범위를 승인해야 합니다.

클러스터와 동일한 리전의 기본 네트워크에 VM이 있지만 my-subnet-0에는 없다고 가정해 보겠습니다.

예를 들면 다음과 같습니다.

  • my-subnet-0: 10.0.0.0/22
  • 포드 보조 범위: 10.52.0.0/14
  • VM 주소: 10.128.0.3

다음 명령어를 사용하여 VM이 제어 영역에 액세스하도록 승인할 수 있습니다.

gcloud container clusters update private-cluster-0 \
    --enable-master-authorized-networks \
    --master-authorized-networks 10.128.0.3/32

공개 엔드포인트에 대한 액세스가 제한된 비공개 클러스터 만들기

이 구성을 사용하여 비공개 클러스터를 만들 때 자동으로 생성된 서브넷 또는 커스텀 서브넷을 사용할 수 있습니다.

자동 생성된 서브넷 사용

이 섹션에서는 GKE가 클러스터 노드의 서브넷을 자동으로 생성하는 private-cluster-1라는 비공개 클러스터를 만듭니다. 이 서브넷은 비공개 Google 액세스가 사용 설정되어 있습니다. 서브넷에서 GKE는 두 개의 보조 범위를 자동으로 만듭니다. 하나는 포드용이고 하나는 서비스용입니다.

Google Cloud CLI 또는 GKE API를 사용할 수 있습니다.

gcloud

  • Autopilot 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create-auto private-cluster-1 \
        --create-subnetwork name=my-subnet-1 \
        --enable-master-authorized-networks \
        --enable-private-nodes
    
  • Standard 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create private-cluster-1 \
        --create-subnetwork name=my-subnet-1 \
        --enable-master-authorized-networks \
        --enable-ip-alias \
        --enable-private-nodes \
        --master-ipv4-cidr 172.16.0.0/28
    

각 항목의 의미는 다음과 같습니다.

  • --create-subnetwork name=my-subnet-1은 GKE가 자동으로 my-subnet-1이라는 서브넷을 생성하도록 합니다.
  • --enable-master-authorized-networks는 공개 엔드포인트에 대한 액세스를 사용자가 승인한 IP 주소 범위로 제한합니다.
  • --enable-ip-alias는 클러스터를 VPC 기반으로 만듭니다(Autopilot의 경우 필수 아님).
  • --enable-private-nodes는 클러스터의 노드에 외부 IP 주소가 없음을 나타냅니다.
  • --master-ipv4-cidr 172.16.0.0/28은 제어 영역의 내부 IP 주소 범위를 지정합니다(Autopilot의 경우 선택사항). 이 설정은 이 클러스터에 영구적으로 유지되며 VPC 내에서 고유해야 합니다. 비RFC 1918 내부 IP 주소를 사용할 수 있습니다.

API

Cluster API 리소스의 privateClusterConfig 필드를 지정합니다.

{
  "name": "private-cluster-1",
  ...
  "ipAllocationPolicy": {
    "createSubnetwork": true,
  },
  ...
    "privateClusterConfig" {
      "enablePrivateNodes": boolean # Creates nodes with internal IP addresses only
      "enablePrivateEndpoint": boolean # false creates a cluster control plane with a publicly-reachable endpoint
      "masterIpv4CidrBlock": string # CIDR block for the cluster control plane
      "privateEndpoint": string # Output only
      "publicEndpoint": string # Output only
  }
}

이 시점에서 다음의 IP 주소에서만 클러스터 제어 영역에 액세스할 수 있습니다.

  • my-subnet-1의 기본 범위
  • 포드에 사용되는 보조 범위

VPC 네트워크 외부에 203.0.113.0/29 범위의 주소를 가진 머신 그룹이 있다고 가정해 보겠습니다. 다음 명령어를 입력하여 이 머신들이 공개 엔드포인트에 액세스하도록 승인할 수 있습니다.

gcloud container clusters update private-cluster-1 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

그러면 다음의 IP 주소에서만 제어 영역에 액세스할 수 있습니다.

  • my-subnet-1의 기본 범위
  • 포드에 사용되는 보조 범위
  • 승인한 주소 범위(예: 203.0.113.0/29)

커스텀 서브넷 사용

이 섹션에서는 다음 리소스를 만듭니다.

  • 이름이 private-cluster-2인 비공개 클러스터
  • 이름이 my-net-2인 네트워크
  • 클러스터 노드에 기본 범위가 192.168.0.0/20인 서브넷 my-subnet-2 서브넷의 보조 IP 주소 범위는 다음과 같습니다.
    • 포드 IP 주소의 경우 my-pods
    • 서비스 IP 주소의 경우 my-services

Console

네트워크, 서브넷, 보조 범위 만들기

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. VPC 네트워크 만들기를 클릭합니다.

  3. 이름my-net-2를 입력합니다.

  4. 서브넷 생성 모드커스텀을 선택합니다.

  5. 새 서브넷 상자의 이름my-subnet-2를 입력합니다.

  6. 리전 목록에서 원하는 리전을 선택합니다.

  7. IP 주소 범위192.168.0.0/20을 입력합니다.

  8. 보조 IP 범위 만들기를 클릭합니다. 서브넷 범위 이름my-services를 입력하고, 보조 IP 범위10.0.32.0/20을 입력합니다.

  9. IP 범위 추가를 클릭합니다. 서브넷 범위 이름my-pods를 입력하고, 보조 IP 범위10.4.0.0/14를 입력합니다.

  10. 비공개 Google 액세스사용으로 설정합니다.

  11. 완료를 클릭합니다.

  12. 만들기를 클릭합니다.

비공개 클러스터 만들기

서브넷을 사용하는 비공개 클러스터를 만듭니다.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭하고 Standard 또는 Autopilot 섹션에서 구성을 클릭합니다.

  3. 이름private-cluster-2를 입력합니다.

  4. 탐색창에서 네트워킹을 클릭합니다.

  5. 비공개 클러스터 라디오 버튼을 선택합니다.

  6. 승인된 외부 IP 범위에서 액세스할 수 있는 제어 영역을 만들려면 외부 IP 주소를 사용하여 제어 영역에 액세스 체크박스를 선택한 상태로 둡니다.

  7. (Autopilot 선택사항) 제어 영역 IP 범위172.16.0.16/28로 설정합니다.

  8. 네트워크 목록에서 my-net-2를 선택합니다.

  9. 노드 서브넷 목록에서 my-subnet-2를 선택합니다.

  10. 보조 범위 자동 생성 체크박스를 선택 취소합니다.

  11. 포드 보조 CIDR 범위 목록에서 my-pods를 선택합니다.

  12. 서비스 보조 CIDR 범위 목록에서 my-services를 선택합니다.

  13. 제어 영역 승인된 네트워크 사용 체크박스를 선택합니다.

  14. 만들기를 클릭합니다.

gcloud

네트워크 만들기

먼저 클러스터의 네트워크를 만듭니다. 다음 명령어는 my-net-2 네트워크를 만듭니다.

gcloud compute networks create my-net-2 \
    --subnet-mode custom

서브넷 및 보조 범위 만들기

그런 다음 my-net-2 네트워크에 보조 범위(포드의 경우 my-pods, 서비스의 경우 my-services)가 있는 my-subnet-2 서브넷을 만듭니다.

gcloud compute networks subnets create my-subnet-2 \
    --network my-net-2 \
    --range 192.168.0.0/20 \
    --secondary-range my-pods=10.4.0.0/14,my-services=10.0.32.0/20 \
    --enable-private-ip-google-access

비공개 클러스터 만들기

이제 만든 네트워크, 서브넷, 보조 범위를 사용해 비공개 클러스터 private-cluster-2을 만듭니다.

  • Autopilot 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create-auto private-cluster-2 \
        --enable-master-authorized-networks \
        --network my-net-2 \
        --subnetwork my-subnet-2 \
        --cluster-secondary-range-name my-pods \
        --services-secondary-range-name my-services \
        --enable-private-nodes
    
  • Standard 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create private-cluster-2 \
        --enable-master-authorized-networks \
        --network my-net-2 \
        --subnetwork my-subnet-2 \
        --cluster-secondary-range-name my-pods \
        --services-secondary-range-name my-services \
        --enable-private-nodes \
        --enable-ip-alias \
        --master-ipv4-cidr 172.16.0.16/28 \
        --no-enable-basic-auth \
        --no-issue-client-certificate
    

이 시점에서 다음의 IP 주소에서만 제어 영역에 액세스할 수 있습니다.

  • my-subnet-2의 기본 범위
  • my-pods의 보조 범위

my-net-2 외부에 203.0.113.0/29 범위의 주소를 가진 머신 그룹이 있다고 가정해 보겠습니다. 다음 명령어를 입력하여 이 머신들이 공개 엔드포인트에 액세스하도록 승인할 수 있습니다.

gcloud container clusters update private-cluster-2 \
    --enable-master-authorized-networks \
    --master-authorized-networks 203.0.113.0/29

이 시점에서 다음의 IP 주소에서만 제어 영역에 액세스할 수 있습니다.

  • my-subnet-2의 기본 범위
  • my-pods의 보조 범위
  • 승인한 주소 범위(예: 203.0.113.0/29)

Cloud Shell을 사용하여 비공개 클러스터 액세스

자동으로 생성된 서브넷 사용 섹션 private-cluster-1에서 만든 비공개 클러스터에는 공개 엔드포인트가 있고 승인된 네트워크가 사용 설정되어 있습니다. Cloud Shell을 사용하여 클러스터에 액세스하려면 클러스터의 승인된 네트워크 목록에 Cloud Shell의 외부 IP 주소를 추가해야 합니다.

그러려면 다음 안내를 따르세요.

  1. Cloud Shell 명령줄 창에서 dig를 사용하여 Cloud Shell의 외부 IP 주소를 찾습니다.

    dig +short myip.opendns.com @resolver1.opendns.com
    
  2. Cloud Shell의 외부 주소를 클러스터의 승인된 네트워크 목록에 추가합니다.

    gcloud container clusters update private-cluster-1 \
        --enable-master-authorized-networks \
        --master-authorized-networks EXISTING_AUTH_NETS,SHELL_IP/32
    

    다음을 바꿉니다.

    • EXISTING_AUTH_NETS: 기존 승인된 네트워크 목록의 IP 주소입니다. 콘솔에서 또는 다음 명령어를 실행하여 승인된 네트워크를 찾을 수 있습니다.

      gcloud container clusters describe private-cluster-1 --format "flattened(masterAuthorizedNetworksConfig.cidrBlocks[])"
      
    • SHELL_IP: Cloud Shell의 외부 IP 주소입니다.

  3. kubectl을 사용해 클러스터에 액세스할 수 있도록 사용자 인증 정보를 받습니다.

    gcloud container clusters get-credentials private-cluster-1 \
        --project=PROJECT_ID \
        --internal-ip
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  4. Cloud Shell에서 kubectl을 사용하여 비공개 클러스터에 액세스합니다.

    kubectl get nodes
    

    출력은 다음과 비슷합니다.

    NAME                                               STATUS   ROLES    AGE    VERSION
    gke-private-cluster-1-default-pool-7d914212-18jv   Ready    <none>   104m   v1.21.5-gke.1302
    gke-private-cluster-1-default-pool-7d914212-3d9p   Ready    <none>   104m   v1.21.5-gke.1302
    gke-private-cluster-1-default-pool-7d914212-wgqf   Ready    <none>   104m   v1.21.5-gke.1302
    

공개 엔드포인트에 무제한으로 액세스할 수 있는 비공개 클러스터 만들기

이 섹션에서는 모든 IP 주소가 제어 영역에 액세스할 수 있는 비공개 클러스터를 만듭니다.

Console

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭하고 Standard 또는 Autopilot 섹션에서 구성을 클릭합니다.

  3. 이름private-cluster-3를 입력합니다.

  4. 탐색창에서 네트워킹을 클릭합니다.

  5. 비공개 클러스터 옵션을 선택합니다.

  6. 외부 IP 주소를 사용하여 제어 영역 액세스 체크박스를 선택한 상태로 둡니다.

  7. (Autopilot 선택사항) 제어 영역 IP 범위172.16.0.32/28로 설정합니다.

  8. 네트워크노드 서브넷default 설정 그대로 둡니다. 이렇게 하면 GKE가 클러스터의 서브넷을 생성합니다.

  9. 제어 영역에서 승인된 네트워크 사용 체크박스를 선택 해제합니다.

  10. 만들기를 클릭합니다.

gcloud

  • Autopilot 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create-auto private-cluster-3 \
        --create-subnetwork name=my-subnet-3 \
        --no-enable-master-authorized-networks \
        --enable-private-nodes
    
  • Standard 클러스터의 경우 다음 명령어를 실행합니다.

    gcloud container clusters create private-cluster-3 \
        --create-subnetwork name=my-subnet-3 \
        --no-enable-master-authorized-networks \
        --enable-ip-alias \
        --enable-private-nodes \
        --master-ipv4-cidr 172.16.0.32/28
    

각 항목의 의미는 다음과 같습니다.

  • --create-subnetwork name=my-subnet-3은 GKE가 자동으로 my-subnet-3이라는 서브넷을 생성하도록 합니다.
  • --no-enable-master-authorized-networks는 클러스터의 승인된 네트워크를 중지합니다.
  • --enable-ip-alias는 클러스터를 VPC 기반으로 만듭니다(Autopilot의 경우 필수 아님).
  • --enable-private-nodes는 클러스터의 노드에 외부 IP 주소가 없음을 나타냅니다.
  • --master-ipv4-cidr 172.16.0.32/28은 제어 영역의 내부 IP 주소 범위를 지정합니다(Autopilot의 경우 선택사항). 이 설정은 이 클러스터에 영구적으로 유지되며 VPC 내에서 고유해야 합니다. 비RFC 1918 내부 IP 주소를 사용할 수 있습니다.

다른 비공개 클러스터 구성

앞에서 설명한 구성 외에도 다음과 같은 구성으로 비공개 클러스터를 실행할 수 있습니다.

비공개 노드에 아웃바운드 인터넷 액세스 권한 부여

외부 레지스트리에서 이미지를 가져오는 것과 같이 비공개 노드에 아웃바운드 인터넷 액세스 권한을 제공하려면 Cloud NAT를 사용하여 Cloud Router를 만들고 구성합니다. Cloud NAT를 사용하면 비공개 클러스터가 인터넷을 통해 패킷을 보내고 받을 아웃바운드 연결을 설정할 수 있습니다.

Cloud Router를 사용하면 리전의 모든 노드가 기본 및 별칭 IP 범위에 Cloud NAT를 사용할 수 있습니다. 또한 외부 IP 주소가 NAT 게이트웨이에 자동으로 할당됩니다.

Cloud Router를 만들고 구성하는 방법은 Cloud NAT 문서의 Cloud Router를 사용하여 Cloud NAT 구성 만들기를 참조하세요.

공유 VPC 네트워크에서 비공개 클러스터 만들기

공유 VPC 네트워크에서 비공개 클러스터를 만드는 방법은 공유 VPC에서 비공개 클러스터 만들기를 참조하세요.

Windows Server 컨테이너 애플리케이션을 비공개 클러스터에 배포

Windows Server 컨테이너 애플리케이션을 비공개 클러스터에 배포하는 방법은 Windows 노드 풀 문서를 참조하세요.

제어 영역의 비공개 엔드포인트에 전역 액세스

제어 영역의 비공개 엔드포인트는 제어 영역 VPC 네트워크의 내부 패스 스루 네트워크 부하 분산기에 의해 구현됩니다. 내부나 Cloud VPN 터널 및 Cloud Interconnect VLAN 연결을 통해 연결된 클라이언트는 내부 패스 스루 네트워크 부하 분산기에 액세스할 수 있습니다.

기본적으로 이러한 클라이언트는 부하 분산기와 동일한 리전에 위치해야 합니다.

제어 영역 전역 액세스를 사용 설정하면 내부 패스 스루 네트워크 부하 분산기에 전역 액세스할 수 있습니다. 클라이언트 VM 및 온프레미스 시스템은 승인된 네트워크 구성에 따라 모든 리전에서 제어 영역의 비공개 엔드포인트에 연결할 수 있습니다.

내부 패스 스루 네트워크 부하 분산기 및 전역 액세스에 대한 자세한 내용은 내부 부하 분산기 및 연결된 네트워크를 참조하세요.

제어 영역 비공개 엔드포인트 전역 액세스 사용 설정

비공개 클러스터를 만들 때 기본적으로 제어 영역의 비공개 엔드포인트 전역 액세스가 사용 설정되지 않습니다. 제어 영역 전역 액세스를 사용 중지하려면 클러스터 모드를 기준으로 다음 도구를 사용합니다.

  • Standard 클러스터의 경우 Google Cloud CLI 또는 Google Cloud 콘솔을 사용할 수 있습니다.
  • Autopilot 클러스터의 경우 google_container_cluster Terraform 리소스를 사용할 수 있습니다.

Console

제어 영역 전역 액세스가 사용 설정된 새 비공개 클러스터를 만들려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 만들기를 클릭하고 Standard 또는 Autopilot 섹션에서 구성을 클릭합니다.

  3. 이름을 입력합니다.

  4. 탐색창에서 네트워킹을 클릭합니다.

  5. 비공개 클러스터를 선택합니다.

  6. 제어 영역 전역 액세스 사용 체크박스를 선택합니다.

  7. 다른 필드를 원하는 대로 구성합니다.

  8. 만들기를 클릭합니다.

기존 비공개 클러스터에 제어 영역 전역 액세스를 사용 설정하려면 다음 단계를 수행하세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 수정하려는 클러스터 옆에 있는 작업을 클릭한 다음 수정을 클릭합니다.

  3. 네트워킹 섹션에서 제어 영역 전역 액세스 옆에 있는 수정을 클릭합니다.

  4. 제어 영역 전역 액세스 수정 대화상자에서 제어 영역 전역 액세스 사용 체크박스를 선택합니다.

  5. 변경사항 저장을 클릭합니다.

gcloud

--enable-master-global-access 플래그를 추가하여 제어 영역의 비공개 엔드포인트에 대한 전역 액세스가 사용 설정된 비공개 클러스터를 만듭니다.

gcloud container clusters create CLUSTER_NAME \
    --enable-private-nodes \
    --enable-master-global-access

기존 비공개 클러스터에 제어 영역의 비공개 엔드포인트에 대한 전역 액세스를 사용 설정할 수도 있습니다.

gcloud container clusters update CLUSTER_NAME \
    --enable-master-global-access

제어 영역 비공개 엔드포인트 전역 액세스 확인

다음 명령어를 실행하고 출력을 확인하여 제어 영역의 비공개 엔드포인트에 대한 전역 액세스가 사용 설정되었는지 확인할 수 있습니다.

gcloud container clusters describe CLUSTER_NAME

출력에는 masterGlobalAccessConfig의 상태를 볼 수 있는 privateClusterConfig 섹션이 포함됩니다.

privateClusterConfig:
  enablePrivateNodes: true
  masterIpv4CidrBlock: 172.16.1.0/28
  peeringName: gke-1921aee31283146cdde5-9bae-9cf1-peer
  privateEndpoint: 172.16.1.2
  publicEndpoint: 34.68.128.12
  masterGlobalAccessConfig:
    enabled: true

다른 네트워크에서 제어 영역의 비공개 엔드포인트에 액세스

GKE 비공개 클러스터를 만들고 제어 영역의 공개 엔드포인트를 사용 중지하는 경우 제어 영역의 비공개 엔드포인트를 사용하여 kubectl과 같은 도구로 클러스터를 관리해야 합니다. 다음을 포함하여 다른 네트워크에서 클러스터 제어 영역의 비공개 엔드포인트에 액세스할 수 있습니다.

  • Cloud VPN 터널 또는 Cloud Interconnect VLAN 연결을 사용하여 클러스터의 VPC 네트워크에 연결된 온프레미스 네트워크
  • Cloud VPN 터널을 사용하여 클러스터의 VPC 네트워크에 연결된 다른 VPC 네트워크

다음 다이어그램은 온프레미스 네트워크와 GKE 제어 영역 노드 사이의 라우팅 경로를 보여줍니다.

온프렘 VPC와 클러스터 제어 영역 간의 라우팅을 보여주는 다이어그램

다른 네트워크의 시스템을 클러스터의 제어 영역 비공개 엔드포인트에 연결하도록 허용하려면 다음 요구사항을 완료합니다.

  1. 클러스터 및 제어 영역의 비공개 엔드포인트와 관련된 네트워크 정보를 식별하고 기록합니다.

    gcloud container clusters describe CLUSTER_NAME \
       --location=COMPUTE_LOCATION \
       --format="yaml(network, privateClusterConfig)"
    

    다음을 바꿉니다.

    명령어 출력에서 다음 단계에 사용할 다음 정보를 식별하고 기록합니다.

    • network: 클러스터 VPC 네트워크의 이름 또는 URI입니다.
    • privateEndpoint: 제어 영역의 비공개 엔드포인트 또는 바깥쪽 IPv4 CIDR 범위(masterIpv4CidrBlock)의 IPv4 주소입니다.
    • peeringName: 클러스터의 VPC 네트워크를 제어 영역의 VPC 네트워크에 연결하는 데 사용되는 VPC 네트워크 피어링 연결의 이름입니다.

    출력은 다음과 비슷합니다.

    network: cluster-network
    privateClusterConfig:
      enablePrivateNodes: true
      masterGlobalAccessConfig:
        enabled: true
      masterIpv4CidrBlock: 172.16.1.0/28
      peeringName: gke-1921aee31283146cdde5-9bae-9cf1-peer
      privateEndpoint: 172.16.1.2
      publicEndpoint: 34.68.128.12
    
  2. 클러스터의 VPC 네트워크에 있는 모든 리전에서 패킷을 수신할 수 있도록 제어 영역 비공개 엔드포인트 전역 액세스를 사용 설정합니다. 제어 영역 비공개 엔드포인트 전역 액세스를 사용 설정하면 클러스터 리전뿐만 아니라 모든 리전에 있는 Cloud VPN 터널 또는 Cloud Interconnect VLAN 연결을 사용하여 비공개 엔드포인트에 연결할 수 있습니다.

  3. 다른 네트워크에서 privateEndpoint IP 주소 또는 masterIpv4CidrBlock IP 주소 범위에 대한 경로를 만듭니다. 제어 영역의 비공개 엔드포인트 IP 주소는 항상 masterIpv4CidrBlock IPv4 주소 범위 내에 있으므로 privateEndpoint IP 주소 또는 바깥쪽 범위에 대한 경로를 만들면 다음에 해당하는 경우 다른 네트워크에서 제어 영역의 비공개 엔드포인트로의 패킷 경로가 제공됩니다.

    • 다른 네트워크는 동적(BGP) 경로를 사용하는 Cloud Interconnect VLAN 연결 또는 Cloud VPN 터널을 사용하여 클러스터의 VPC 네트워크에 연결하는 경우. Cloud Router 커스텀 경로 공지를 사용합니다. 자세한 내용은 Cloud Router 문서의 커스텀 IP 범위 공지를 참조하세요.

    • 다른 네트워크는 동적 경로를 사용하지 않는 기본 VPN 터널을 사용하여 클러스터의 VPC 네트워크에 연결하는 경우. 다른 네트워크에는 정적 경로를 구성해야 합니다.

  4. VPC 네트워크의 피어링 관계에서 커스텀 경로를 제어 영역의 VPC 네트워크로 내보내도록 클러스터의 VPC 네트워크를 구성합니다. Google Cloud는 항상 클러스터의 VPC 네트워크에서 커스텀 경로를 가져오도록 제어 영역의 VPC 네트워크를 구성합니다. 이 단계에서는 제어 영역의 비공개 엔드포인트에서 다른 네트워크로의 패킷 경로를 제공합니다.

    클러스터의 VPC 네트워크에서 커스텀 경로 내보내기를 사용 설정하려면 다음 명령어를 사용합니다.

    gcloud compute networks peerings update PEERING_NAME \
        --network=CLUSTER_VPC_NETWORK \
        --export-custom-routes
    

    다음을 바꿉니다.

    • PEERING_NAME: 클러스터의 VPC 네트워크를 제어 영역 VPC 네트워크에 연결하는 피어링의 이름입니다.
    • CLUSTER_VPC_NETWORK: 클러스터 VPC 네트워크의 이름 또는 URI입니다.

    기존 VPC 네트워크 피어링 연결의 경로 교환을 업데이트하는 방법에 대한 자세한 내용은 피어링 연결 업데이트를 참조하세요.

    클러스터의 VPC 네트워크에 있는 커스텀 경로에는 온프레미스 네트워크와 같은 다른 네트워크의 IP 주소 범위가 대상인 경로가 포함됩니다. 이러한 경로가 제어 영역의 VPC 네트워크에서 피어링 커스텀 경로로 적용되도록 하려면 다른 네트워크에서 지원되는 대상을 참조하세요.

다른 네트워크에서 지원되는 대상

다른 네트워크가 클러스터의 VPC 네트워크에 있는 Cloud Router로 보내는 주소 범위는 다음 조건을 준수해야 합니다.

  • 클러스터의 VPC는 기본 경로(0.0.0.0/0)를 허용할 수 있지만 제어 영역의 VPC 네트워크는 이미 로컬 기본 경로를 포함하고 있기 때문에 항상 기본 경로를 거부합니다. 다른 네트워크가 VPC 네트워크에 기본 경로를 보낼 경우 다른 네트워크는 제어 영역의 비공개 엔드포인트에 연결해야 하는 시스템의 특정 대상도 보내야 합니다. 자세한 내용은 라우팅 순서를 참조하세요.

  • 제어 영역의 VPC 네트워크가 기본 경로를 효과적으로 대체하는 경로를 허용하는 경우 이 경로는 Google Cloud API 및 서비스에 대한 연결을 끊고 클러스터 제어 영역을 중단합니다. 예를 들어 다른 네트워크는 대상이 0.0.0.0/1128.0.0.0/1인 경로를 공지하면 안 됩니다. 대안은 앞의 항목을 참조하세요.

Cloud Router 한도, 특히 학습된 경로의 고유한 최대 대상 수를 모니터링합니다.

노드에 외부 IP 주소가 없는지 확인

비공개 클러스터를 만든 후 클러스터 노드에 외부 IP 주소가 없는지 확인합니다.

Console

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 클러스터 이름을 클릭합니다.

  3. Autopilot 클러스터의 경우 클러스터 기본사항 섹션에서 외부 엔드포인트 필드를 확인합니다. 값은 사용 중지됨입니다.

표준 클러스터의 경우 다음을 수행합니다.

  1. 클러스터 페이지에서 노드 탭을 클릭합니다.
  2. 노드 풀에서 노드 풀 이름을 클릭합니다.
  3. 노드 풀 세부정보 페이지의 인스턴스 그룹에서 인스턴스 그룹 이름을 클릭합니다. 예: gke-private-cluster-0-default-pool-5c5add1f-grp`
  4. 인스턴스 목록에서 인스턴스에 외부 IP 주소가 없는지 확인합니다.

gcloud

다음 명령어를 실행합니다.

kubectl get nodes --output wide

출력의 EXTERNAL-IP 열이 비어 있습니다.

STATUS ... VERSION        EXTERNAL-IP  OS-IMAGE ...
Ready      v.8.7-gke.1                 Container-Optimized OS
Ready      v1.8.7-gke.1                Container-Optimized OS
Ready      v1.8.7-gke.1                Container-Optimized OS

클러스터의 서브넷 및 보조 주소 범위 확인

비공개 클러스터를 만든 후에는 사용자 또는 GKE가 클러스터에 프로비저닝한 서브넷 및 보조 주소 범위를 확인할 수 있습니다.

Console

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. 서브넷 이름을 클릭합니다. 예를 들면 gke-private-cluster-0-subnet-163e3c97입니다.

  3. IP 주소 범위 아래에서 서브넷의 기본 주소 범위를 볼 수 있습니다. 노드에 사용된 범위입니다.

  4. 보조 IP 범위 아래에서 포드의 IP 주소 범위와 서비스의 범위를 볼 수 있습니다.

gcloud

모든 서브넷 나열

클러스터의 네트워크에 있는 서브넷을 나열하려면 다음 명령어를 실행합니다.

gcloud compute networks subnets list \
    --network NETWORK_NAME

NETWORK_NAME을 비공개 클러스터의 네트워크로 바꿉니다. 자동으로 생성된 서브넷을 사용하여 클러스터를 만든 경우 default를 사용합니다.

명령어 결과에서 클러스터의 서브넷 이름을 찾습니다.

클러스터의 서브넷 보기

자동 생성된 서브넷에 대한 정보를 가져옵니다.

gcloud compute networks subnets describe SUBNET_NAME

SUBNET_NAME을 서브넷 이름으로 바꿉니다.

출력에는 노드의 기본 주소 범위(첫 번째 ipCidrRange 필드)와 포드 및 서비스에 대한 보조 범위(secondaryIpRanges 아래)가 표시됩니다.

...
ipCidrRange: 10.0.0.0/22
kind: compute#subnetwork
name: gke-private-cluster-1-subnet-163e3c97
...
privateIpGoogleAccess: true
...
secondaryIpRanges:
- ipCidrRange: 10.40.0.0/14
  rangeName: gke-private-cluster-1-pods-163e3c97
- ipCidrRange: 10.0.16.0/20
  rangeName: gke-private-cluster-1-services-163e3c97
...

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

비공개 클러스터의 엔드포인트는 gcloud CLI 또는 Google Cloud 콘솔을 사용하여 볼 수 있습니다.

Console

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 클러스터 이름을 클릭합니다.

  3. 세부정보 탭의 클러스터 기본사항에서 엔드포인트 필드를 찾습니다.

gcloud

다음 명령어를 실행합니다.

gcloud container clusters describe CLUSTER_NAME

출력에는 비공개 엔드포인트와 공개 엔드포인트가 모두 표시됩니다.

...
privateClusterConfig:
enablePrivateEndpoint: true
enablePrivateNodes: true
masterIpv4CidrBlock: 172.16.0.32/28
privateEndpoint: 172.16.0.34
publicEndpoint: 35.239.154.67

이미지 레지스트리에서 컨테이너 이미지 가져오기

비공개 클러스터에서 컨테이너 런타임은 Artifact Registry 또는 Container Registry(지원 중단됨)에서 컨테이너 이미지를 가져올 수 있습니다. 인터넷의 다른 컨테이너 이미지 레지스트리에서는 이미지를 가져올 수 없습니다. 비공개 클러스터의 노드에는 외부 IP 주소가 없기 때문입니다. 따라서 기본적으로 Google Cloud 네트워크 외부의 서비스와 통신할 수 없습니다.

비공개 클러스터의 노드는 비공개 Google 액세스가 사용 설정된 네트워크에 있는 경우 Artifact Registry와 같은 Google Cloud 서비스와 통신할 수 있습니다.

다음 명령어는 Artifact Registry 저장소에서 샘플 이미지를 가져오는 배포를 만듭니다.

kubectl run hello-deployment --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

특정 사용 사례를 위한 방화벽 규칙 추가

이 섹션에서는 비공개 클러스터에 방화벽 규칙을 추가하는 방법을 설명합니다. 기본적으로 방화벽 규칙은 클러스터 제어 영역이 포트 443(HTTPS) 및 10250(kubelet)에서만 노드 및 포드에 대한 TCP 연결을 시작하도록 제한합니다. 일부 Kubernetes 기능의 경우 추가 포트에서 액세스를 허용하도록 방화벽 규칙을 추가해야 할 수 있습니다.

추가 방화벽 규칙이 필요한 Kubernetes 기능은 다음과 같습니다.

방화벽 규칙을 추가하면 클러스터 제어 영역의 트래픽이 다음 모두로 전송될 수 있습니다.

  • 각 노드의 지정된 포트(hostPort)
  • 이러한 노드에서 실행되는 각 포드의 지정된 포트
  • 이러한 노드에서 실행되는 각 서비스의 지정된 포트

방화벽 규칙에 대한 자세한 내용은 Cloud Load Balancing 문서의 방화벽 규칙을 참조하세요.

비공개 클러스터에 방화벽 규칙을 추가하려면 클러스터 제어 영역의 CIDR 블록과 사용할 대상을 기록해야 합니다. 이를 기록한 후에 규칙을 만들 수 있습니다.

1단계: 제어 영역의 CIDR 블록 보기

방화벽 규칙을 추가하려면 클러스터 제어 영역의 CIDR 블록이 필요합니다.

Console

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 클러스터 이름을 클릭합니다.

세부정보 탭의 네트워킹에서 제어 영역 주소 범위 필드의 값을 기록해둡니다.

gcloud

다음 명령어를 실행합니다.

gcloud container clusters describe CLUSTER_NAME

CLUSTER_NAME을 비공개 클러스터 이름으로 바꿉니다.

명령어 결과에서 masterIpv4CidrBlock 필드 값을 기록합니다.

2단계: 기존 방화벽 규칙 보기

클러스터의 기존 방화벽 규칙이 사용하는 타겟(이 경우에는 목적지 노드)을 지정해야 합니다.

Console

  1. Google Cloud 콘솔에서 방화벽 정책 페이지로 이동합니다.

    방화벽 정책으로 이동

  2. VPC 방화벽 규칙에 대한 필터 테이블gke-CLUSTER_NAME을 입력합니다.

결과에서 대상 필드 값을 기록합니다.

gcloud

다음 명령어를 실행합니다.

gcloud compute firewall-rules list \
    --filter 'name~^gke-CLUSTER_NAME' \
    --format 'table(
        name,
        network,
        direction,
        sourceRanges.list():label=SRC_RANGES,
        allowed[].map().firewall_rule().list():label=ALLOW,
        targetTags.list():label=TARGET_TAGS
    )'

명령어 결과에서 대상 필드의 값을 기록해 둡니다.

3단계: 방화벽 규칙 추가

Console

  1. Google Cloud 콘솔에서 방화벽 정책 페이지로 이동합니다.

    방화벽 정책으로 이동

  2. 방화벽 규칙 만들기를 클릭합니다.

  3. 이름에 원하는 방화벽 규칙 이름을 입력합니다.

  4. 네트워크 목록에서 관련 네트워크를 선택합니다.

  5. 트래픽 방향에서 인그레스를 클릭합니다.

  6. 일치 시 작업에서 허용을 클릭합니다.

  7. 대상 목록에서 지정된 대상 태그를 선택합니다.

  8. 대상 태그에 이전에 기록한 목표 값을 입력합니다.

  9. 소스 필터 목록에서 IPv4 범위를 선택합니다.

  10. 소스 IPv4 범위에 클러스터 제어 영역의 CIDR 블록을 입력합니다.

  11. 프로토콜 및 포트에서 지정된 프로토콜 및 포트를 클릭하고, 관련 프로토콜(TCP 또는UDP) 체크박스를 선택하고, 프로토콜 입력란에 원하는 포트 번호를 입력합니다.

  12. 만들기를 클릭합니다.

gcloud

다음 명령어를 실행합니다.

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges CONTROL_PLANE_RANGE \
    --rules PROTOCOL:PORT \
    --target-tags TARGET

다음을 바꿉니다.

  • FIREWALL_RULE_NAME: 선택한 방화벽 규칙 이름입니다.
  • CONTROL_PLANE_RANGE: 이전에 수집한 클러스터 제어 영역의 IP 주소 범위(masterIpv4CidrBlock)입니다.
  • PROTOCOL:PORT: 포트 및 해당 포트의 프로토콜(tcp, udp)입니다.
  • TARGET: 이전에 수집한 대상(Targets) 값입니다.

VPC 서비스 제어를 사용하여 비공개 클러스터 보호

VPC 서비스 제어를 사용하여 GKE 비공개 클러스터의 보호를 강화할 수 있습니다.

VPC 서비스 제어는 데이터 무단 반출 위험을 줄이기 위해 GKE 비공개 클러스터에 추가 보안을 제공합니다. VPC 서비스 제어를 사용하면 서비스 경계에 프로젝트를 추가하여 외부 요청으로부터 리소스와 서비스를 보호할 수 있습니다.

서비스 경계에 대한 자세한 내용은 서비스 경계 세부정보 및 구성을 참조하세요.

VPC 서비스 제어 서비스 경계에서 GKE 비공개 클러스터와 함께 Artifact Registry 또는 Container Registry(지원 중단됨)를 사용하는 경우 데이터 무단 반출을 방지하기 위해 제한된 가상 IP로 라우팅을 구성해야 합니다.

VPC 피어링 재사용

2020년 1월 15일 이후에 만든 모든 비공개 클러스터는 VPC 네트워크 피어링 연결을 재사용합니다.

2020년 1월 15일 이전에 만든 모든 비공개 클러스터는 고유한 VPC 네트워크 피어링 연결을 사용합니다. 각 VPC 네트워크는 다른 VPC 네트워크(최대 25개)와 피어링할 수 있습니다. 즉, 피어링이 다른 목적으로 사용되지 않는다고 가정할 때 이러한 클러스터는 네트워크당 비공개 클러스터 최대 25개로 제한됩니다.

이 기능은 이전 출시 버전으로 백포트되지 않습니다. 이전 비공개 클러스터에서 VPC 네트워크 피어 재사용을 사용 설정하려면 클러스터를 삭제하고 다시 만들면 됩니다. 클러스터를 업그레이드해도 클러스터는 기존 VPC 네트워크 피어링 연결을 재사용하지 않습니다.

클러스터에 VPC 네트워크 피어링 재사용이 사용 설정된 경우 각 위치에서 비공개 클러스터를 최대 75개까지 지원할 수 있습니다. 영역과 리전은 별개의 위치로 취급됩니다.

예를 들어 us-east1-a에 비공개 영역 클러스터를 최대 75개까지 만들고 us-east1에 다른 비공개 리전 클러스터 75개를 만들 수 있습니다. 공유 VPC 네트워크에서 비공개 클러스터를 사용하는 경우에도 마찬가지입니다. 단일 VPC 네트워크의 최대 연결 수는 25개이므로 고유한 위치 25개를 사용하는 비공개 클러스터만 만들 수 있습니다.

VPC 네트워크 피어링 재사용은 같은 위치에 있는 클러스터(예: 같은 리전에 있는 리전 클러스터 또는 같은 영역에 있는 영역 클러스터)에만 적용됩니다. 리전의 모든 영역에 리전 클러스터와 영역 클러스터를 모두 만드는 경우 리전마다 VPC 네트워크 피어링이 최대 4개까지 있을 수 있습니다.

gcloud CLI 또는 Google Cloud 콘솔을 사용하여 비공개 클러스터가 VPC 네트워크 피어링 연결을 재사용하는지 확인할 수 있습니다.

Console

클러스터 세부정보 페이지에서 VPC 피어링 행을 확인합니다. 클러스터가 VPC 피어링 연결을 재사용하면 출력은 gke-n으로 시작합니다. 예를 들면 gke-n34a117b968dee3b2221-93c6-40af-peer입니다.

gcloud

gcloud container clusters describe CLUSTER_NAME \
    --format="value(privateClusterConfig.peeringName)"

클러스터가 VPC 피어링 연결을 재사용하면 출력은 gke-n으로 시작합니다. 예를 들면 gke-n34a117b968dee3b2221-93c6-40af-peer입니다.

삭제

이 페이지의 작업을 완료한 후에는 다음 단계에 따라 리소스를 제거하여 계정에서 원치 않는 요금이 부과되지 않도록 합니다.

클러스터 삭제

Console

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 각 클러스터를 선택합니다.

  3. 삭제를 클릭합니다.

gcloud

gcloud container clusters delete -q private-cluster-0 private-cluster-1 private-cluster-2 private-cluster-3

네트워크 삭제

Console

  1. Google Cloud 콘솔에서 VPC 네트워크 페이지로 이동합니다.

    VPC 네트워크로 이동

  2. 네트워크 목록에서 my-net-0을 클릭합니다.

  3. 네트워크 세부정보 페이지에서 VPC 네트워크 삭제를 클릭합니다.

  4. 네트워크 삭제 대화상자에서 삭제를 클릭합니다.

gcloud

gcloud compute networks delete my-net-0

요구사항 및 제한사항

비공개 클러스터의 요구사항은 다음과 같습니다.

비공개 클러스터의 제한사항은 다음과 같습니다.

  • 비공개가 아닌 기존 클러스터를 비공개 클러스터로 변환할 수 없습니다.
  • 제어 영역 IP 범위에 172.17.0.0/16을 사용하면 노드, 포드 또는 서비스 IP 주소에 이 범위를 사용할 수 없습니다.
  • 클러스터 제어 영역과 클러스터 노드 사이의 VPC 피어링을 삭제하거나, 포트 10250에서 클러스터 제어 영역으로부터 노드까지 인그레스 트래픽을 허용하는 방화벽 규칙을 삭제하거나, 기본 인터넷 게이트웨이의 기본 경로를 삭제하면 비공개 클러스터가 작동을 중지합니다. 기본 경로를 삭제할 경우 필요한 Google Cloud 서비스로 가는 트래픽을 라우팅해야 합니다. 자세한 내용은 커스텀 라우팅을 참조하세요.
  • 커스텀 경로 내보내기가 VPC에 사용 설정된 경우 Google Cloud IP 범위와 겹치는 경로를 만들면 클러스터가 손상될 수 있습니다.
  • 프로젝트에서 승인된 네트워크(허용된 CIDR 블록)를 최대 50개까지 추가할 수 있습니다. 자세한 내용은 기존 클러스터에 승인된 네트워크 추가를 참조하세요.

비공개 클러스터의 제한사항은 다음과 같습니다.

  • 클러스터 제어 영역의 RFC 1918 블록 크기는 /28이어야 합니다.
  • GKE는 클러스터 제어 영역 주소 블록과의 겹침은 감지할 수 있지만 공유 VPC 네트워크 내에서의 겹침은 감지할 수 없습니다.
  • 비공개 클러스터의 모든 노드는 공개 IP 없이 생성되며 Google Cloud API 및 서비스에 대한 제한적인 액세스 권한이 있습니다. 비공개 노드에 아웃바운드 인터넷 액세스를 제공하려면 Cloud NAT를 사용하면 됩니다.
  • 공유 VPC를 사용하지 않는 한 비공개 클러스터를 만들면 비공개 Google 액세스가 자동으로 사용 설정됩니다. NAT를 사용하여 인터넷에 액세스하지 않는 한 비공개 Google 액세스를 중지하면 안 됩니다.
  • 피어링이 다른 목적으로 사용되지 않는다고 가정할 때 2020년 1월 15일 이전에 만든 비공개 클러스터는 네트워크당 최대 25개로 제한됩니다. 자세한 내용은 VPC 피어링 재사용을 참조하세요.
  • 모든 비공개 클러스터에는 VPC 간의 피어링 경로가 필요하지만 한 번에 피어링 작업 하나만 수행할 수 있습니다. 비공개 클러스터 여러 개를 동시에 만들려고 하면 클러스터 만들기가 타임아웃될 수 있습니다. 이를 방지하려면 이후의 각 비공개 클러스터에 VPC 피어링 경로가 이미 존재하도록 새 비공개 클러스터를 순차적으로 만듭니다. VPC에서 실행 중인 작업이 있는 경우 비공개 클러스터 하나를 만들려고 해도 타임아웃될 수 있습니다.
  • 추가 노드를 수용하기 위해 서브넷의 기본 IP 범위를 확장하려면 클러스터에 대해 승인된 네트워크 목록으로 확장된 서브넷의 기본 IP 주소 범위를 추가해야 합니다. 그렇지 않으면 제어 영역과 관련된 인그레스 허용 방화벽 규칙이 업데이트되지 않으며, 확장된 IP 주소 공간에서 생성된 새 노드는 제어 영역에 등록할 수 없습니다. 이로 인해 새 노드가 지속적으로 삭제되고 교체되는 중단이 발생할 수 있습니다. 이러한 중단은 노드 풀 업그레이드를 수행할 때 또는 활성 프로브의 오류로 인해 노드가 자동으로 대체될 때 발생합니다.
  • 자동으로 생성되는 방화벽 규칙보다 우선순위가 높은 방화벽 규칙이나 계층식 방화벽 정책 규칙을 생성하지 마세요.

문제 해결

다음 섹션에서는 비공개 클러스터와 관련된 일반적인 문제를 해결하는 방법을 설명합니다.

비공개 클러스터에서 VPC 네트워크 피어링 연결이 사고로 삭제됨

증상

VPC 네트워크 피어링 연결을 실수로 삭제한 경우 클러스터가 복구 상태로 전환되고 모든 노드가 UNKNOWN 상태로 표시됩니다. 제어 영역에 대한 연결 기능이 해제되었기 때문에 어떤 작업도 수행할 수 없습니다. 제어 영역을 검사하면 로그에 다음과 비슷한 로그가 표시됩니다.

error checking if node NODE_NAME is shutdown: unimplemented
가능한 원인

VPC 네트워크 피어링 연결이 실수로 삭제되었습니다.

해결 방법

다음 단계를 따르세요.

  • 새로운 임시 VPC 네트워크 피어링 클러스터를 만듭니다. 클러스터를 만들면 VPC 네트워크 피어링이 다시 생성되고 이전의 클러스터가 정상 작동으로 복원됩니다.

  • 이전 클러스터가 정상 작동으로 복원된 후 임시로 생성된 VPC 네트워크 피어링 클러스터를 삭제합니다.

클러스터가 활성 피어와 겹침

증상

비공개 클러스터를 만들려고 하면 다음과 비슷한 오류가 반환됩니다.

Google Compute Engine: An IP range in the peer network overlaps with an IP
range in an active peer of the local network.
가능한 원인

겹치는 제어 영역 CIDR을 선택했습니다.

해결 방법

클러스터를 삭제하고 다른 제어 영역 CIDR을 사용하여 다시 만듭니다.

비공개 클러스터의 제어 영역에 연결할 수 없음

클러스터 엔드포인트 액세스 구성을 구현하여 클러스터 제어 영역의 연결 가능성을 높입니다. 자세한 내용은 클러스터 엔드포인트에 액세스를 참조하세요.

증상

비공개 클러스터를 만든 후 클러스터에 kubectl 명령어를 실행하려고 하면 다음 중 하나와 비슷한 오류가 반환됩니다.

Unable to connect to the server: dial tcp [IP_ADDRESS]: connect: connection
timed out.
Unable to connect to the server: dial tcp [IP_ADDRESS]: i/o timeout.
가능한 원인

kubectl이 클러스터 제어 영역에 연결할 수 없습니다.

해결 방법

kubeconfig에 대해 클러스터 사용자 인증 정보가 생성되었거나 올바른 컨텍스트가 활성화되었는지 확인합니다. 클러스터 사용자 인증 정보 설정에 대한 자세한 내용은 kubeconfig 항목 생성을 참조하세요.

외부 IP 주소를 사용하여 제어 영역에 액세스하는 것이 허용되는지 확인합니다. 클러스터 제어 영역에 대한 외부 액세스를 중지하면 인터넷에서 클러스터가 격리됩니다. 이 구성은 클러스터 생성 후 변경할 수 없습니다. 이 구성을 사용하면 승인된 내부 네트워크 CIDR 범위 또는 예약된 네트워크만 제어 영역에 액세스할 수 있습니다.

  1. 원본 IP 주소가 제어 영역에 도달하도록 승인되었는지 확인합니다.

      gcloud container clusters describe CLUSTER_NAME \
          --format="value(masterAuthorizedNetworksConfig)"\
          --location=COMPUTE_LOCATION
    

    다음을 바꿉니다.

    원본 IP 주소가 승인되지 않으면 출력에서 원본 IP 주소가 포함되지 않은 빈 결과(중괄호만) 또는 CIDR 범위가 반환될 수 있습니다.

    cidrBlocks:
      cidrBlock: 10.XXX.X.XX/32
      displayName: jumphost
      cidrBlock: 35.XXX.XXX.XX/32
      displayName: cloud shell
    enabled: true
    
  2. 제어 영역에 액세스할 수 있도록 승인된 네트워크를 추가합니다.

온프레미스 환경 또는 클러스터 위치와 다른 리전에서 kubectl 명령어를 실행하는 경우 제어 영역 비공개 엔드포인트 전역 액세스가 사용 설정되어 있는지 확인합니다. 자세한 내용은 제어 영역의 비공개 엔드포인트에 전역 액세스를 참조하세요.

  1. 클러스터를 설명하여 제어 액세스 구성 응답을 확인합니다.

    gcloud container clusters describe CLUSTER_NAME \
        --location=COMPUTE_LOCATION \
        --flatten "privateClusterConfig.masterGlobalAccessConfig"
    

    다음을 바꿉니다.

    성공적인 출력은 다음과 비슷합니다.

      enabled: true
    
  2. null이 반환되면 제어 영역에 대한 전역 액세스를 사용 설정합니다.

겹치는 IPv4 CIDR 블록으로 인해 클러스터를 만들 수 없음

증상

gcloud container clusters create는 다음과 비슷한 오류를 반환합니다.

The given master_ipv4_cidr 10.128.0.0/28 overlaps with an existing network
10.128.0.0/20.
가능한 원인

VPC의 기존 서브넷과 겹치는 제어 영역 CIDR 블록을 지정했습니다.

해결 방법

--master-ipv4-cidr의 기존 서브넷과 겹치지 않는 CIDR 블록을 지정합니다.

이미 다른 클러스터에서 사용 중인 서비스 범위로 인해 클러스터를 만들 수 없음

증상

비공개 클러스터를 만들려고 하면 다음과 비슷한 오류가 반환됩니다.

Services range [ALIAS_IP_RANGE] in network [VPC_NETWORK], subnetwork
[SUBNET_NAME] is already used by another cluster.
가능한 원인

다음 중 하나입니다.

  • 다른 클러스터에서 아직 사용 중인 서비스 범위를 선택했거나 클러스터가 삭제되지 않았습니다.
  • 삭제된 서비스 범위를 사용하는 클러스터가 있지만 보조 범위 메타데이터가 제대로 삭제되지 않았습니다. GKE 클러스터의 보조 범위는 Compute Engine 메타데이터에 저장되며 클러스터가 삭제되면 삭제되어야 합니다. 클러스터가 성공적으로 삭제되더라도 메타데이터가 삭제되지 않을 수 있습니다.
해결 방법

다음 단계를 따르세요.

  • 기존 클러스터에서 서비스 범위를 사용하고 있는지 확인합니다. gcloud container clusters list 명령어를 filter 플래그와 함께 사용하여 클러스터를 검색할 수 있습니다. 서비스 범위를 사용하는 기존 클러스터가 있으면 클러스터를 삭제하거나 새 서비스 범위를 만들어야 합니다.
  • 기존 클러스터에서 서비스 범위를 사용하지 않는 경우 사용하려는 서비스 범위와 일치하는 메타데이터 항목을 수동으로 삭제합니다.

서브넷을 만들 수 없음

증상

자동 서브넷을 사용하여 비공개 클러스터를 만들거나 커스텀 서브넷을 만들려고 하면 다음과 같은 오류가 발생할 수 있습니다.

An IP range in the peer network overlaps
with an IP range in one of the active peers of the local network.
가능한 원인

지정한 제어 영역 CIDR 범위가 클러스터의 다른 IP 범위와 겹칩니다. 최근에 비공개 클러스터를 삭제했고 동일한 제어 영역 CIDR을 사용하여 새 비공개 클러스터를 만들려고 하는 경우에도 이 문제가 발생할 수 있습니다.

해결 방법

다른 CIDR 범위를 사용해 봅니다.

공개 Docker Hub에서 이미지를 가져올 수 없음

증상

클러스터에서 실행 중인 포드가 kubectl describe에 경고를 표시합니다.

Failed to pull image: rpc error: code = Unknown desc = Error response
from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled
while waiting for connection (Client.Timeout exceeded while awaiting
headers)
가능한 원인

비공개 클러스터의 노드에 외부 IP 주소가 없으므로 인터넷 액세스 요구사항을 충족하지 않습니다. 단, 비공개 Google 액세스를 사용 설정하고 네트워크 요구사항을 충족한 경우 노드는 Artifact Registry 및 Container Registry를 포함한 Google Cloud API 및 서비스에 액세스할 수 있습니다.

해결 방법

다음 해결 방법 중 하나를 사용하세요.

  • 비공개 클러스터의 이미지를 Docker Hub에서 Artifact Registry로 복사합니다. 자세한 내용은 타사 레지스트리에서 컨테이너 마이그레이션을 참조하세요.

  • GKE는 자주 액세스되는 Docker Hub 이미지의 캐시된 복사본을 자동으로 mirror.gcr.io에서 확인합니다.

  • Docker Hub 또는 다른 공개 저장소에서 이미지를 가져와야 하는 경우 정적 0.0.0.0/0 경로의 대상인 Cloud NAT 또는 인스턴스 기반 프록시를 사용합니다.

허용 웹훅 타임아웃을 트리거하는 API 요청

증상

443이 아닌 targetPort로 서비스를 사용하도록 구성된 허용 웹훅을 트리거하는 API 요청이 시간 초과되어 요청이 실패합니다.

Error from server (Timeout): request did not complete within requested timeout 30s
가능한 원인

기본적으로 방화벽은 포트 443(HTTPS) 및 10250(kubelet)을 제외한 노드에 대한 TCP 연결을 허용하지 않습니다. 트래픽을 허용하는 커스텀 방화벽 규칙이 없으면 443 이외의 포트에서 포드와 통신을 시도하는 허용 웹훅이 실패합니다.

해결 방법

구체적 사용 사례에 맞는 방화벽 규칙을 추가합니다.

상태 점검 실패로 인해 클러스터를 만들 수 없음

증상

비공개 클러스터를 만들면 상태 점검 단계에서 중지되어 다음 중 하나와 유사한 오류가 보고됩니다.

All cluster resources were brought up, but only 0 of 2 have registered.
All cluster resources were brought up, but: 3 nodes out of 4 are unhealthy
가능한 원인

다음 중 하나인 경우:

  • 클러스터 노드는 Cloud Storage API(storage.googleapis.com)에서 필요한 바이너리를 다운로드할 수 없습니다.
  • 이그레스 트래픽을 제한하는 방화벽 규칙
  • 공유 VPC IAM 권한이 잘못되었습니다.
  • 비공개 Google 액세스를 사용하려면 *.gcr.io의 DNS를 구성해야 합니다.
해결 방법

다음 해결 방법 중 하나를 사용하세요.

kubelet 포드 샌드박스를 만들 수 없음

증상

비공개 클러스터를 만든 후 다음 중 하나와 비슷한 오류가 보고됩니다.

Warning  FailedCreatePodSandBox  12s (x9 over 4m)      kubelet  Failed to create pod sandbox: rpc error: code = Unknown desc = Error response from daemon: Get https://registry.k8s.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
가능한 원인

calico-node 또는 netd 포드는 *.gcr.io에 도달할 수 없습니다.

해결 방법

다음 해결 방법 중 하나를 사용하세요.

비공개 클러스터 노드가 생성되었지만 클러스터에 조인되지 않음

비공개 클러스터에서 사용 중인 VPC에서 커스텀 라우팅 및 타사 네트워크 어플라이언스를 사용할 때 기본 인터넷 게이트웨이 대신 기본 경로(0.0.0.0/0)가 리디렉션되는 경우가 많습니다. 제어 영역 연결 외에도 다음 대상에 연결할 수 있는지 확인해야 합니다.

  • *.googleapis.com
  • *.gcr.io
  • gcr.io

3개 도메인 모두에 대해 비공개 Google 액세스를 구성합니다. 이 권장사항을 따르면 새 노드가 인터넷 연결 트래픽 제한을 제한하면서 클러스터를 시작하고 조인할 수 있습니다.

비공개 GKE 클러스터의 워크로드가 인터넷에 액세스할 수 없음

비공개 GKE 클러스터의 포드는 인터넷에 액세스할 수 없습니다. 예를 들어 exec shell 포드에서 apt update 명령어를 실행한 후 다음과 비슷한 오류를 보고합니다.

0% [Connecting to deb.debian.org (199.232.98.132)] [Connecting to security.debian.org (151.101.130.132)]

클러스터의 포드에 사용되는 서브넷 보조 IP 주소 범위가 Cloud NAT 게이트웨이에 구성되지 않은 경우 포드는 Cloud NAT 게이트웨이에 대해 구성된 외부 IP 주소가 없으므로 인터넷에 연결할 수 없습니다.

클러스터에 사용되는 서브넷에 대해 최소한 다음 서브넷 IP 주소 범위를 적용하도록 Cloud NAT 게이트웨이를 구성해야 합니다.

  • 서브넷 기본 IP 주소 범위(노드에 사용됨)
  • 클러스터의 포드에 사용되는 서브넷 보조 IP 주소 범위
  • 클러스터의 서비스에 사용되는 서브넷 보조 IP 주소 범위

자세한 내용은 포드에 사용되는 보조 서브넷 IP 범위를 추가하는 방법을 참조하세요.

다음 단계