GKE에 대해 비공개로 사용되는 공개 IP 주소 구성


이 튜토리얼에서는 비공개로 사용된 공개 IP(PUPI) 주소를 Google Kubernetes Engine(GKE) 포드 주소 블록에 적용하는 방법을 보여줍니다.

비공개로 사용되는 공개 IP(PUPI) 주소는 Google Cloud Virtual Private Cloud(VPC) 네트워크 내에서 비공개로 사용할 수 있는 주소입니다. 이러한 IP 주소는 Google의 소유가 아닙니다. 이를 비공개로 사용하기 위해 이러한 공개 IP 주소를 소유할 필요가 없습니다.

개요

GKE 클러스터는 노드, 포드, 서비스에 대한 전용 IP 주소 범위가 필요합니다. 인프라 성장에 따라 표준 내부 IP 주소 공간이 소진될 수 있습니다(RFC 1918). 비공개 RFC 1918 주소 소진을 해결하는 한 가지 방법은 GKE 포드 CIDR 블록에 대해 비공개로 사용되는 공개 IP(PUPI) 주소를 사용하는 것입니다. PUPI는 GKE 포드 네트워크의 대안을 제공하여 다른 클러스터 구성요소를 위한 비공개 IP 주소를 예약합니다.

단일 클러스터: GKE 클러스터를 하나만 만드는 경우 비공개로 사용되는 외부 IP 주소 범위를 사용 설정하여 PUPI를 사용 설정할 수 있습니다.

여러 클러스터: VPC 피어링을 통해 연결된 여러 GKE 클러스터를 사용 중이면(서비스 제공업체의 일반적인 시나리오) 보다 복잡한 구성이 필요합니다. 다음 다이어그램은 회사(생산자)가 VPC 피어링과 함께 PUPI를 사용해서 관리형 서비스를 고객(소비자)에게 제공하는 방법의 예시를 보여줍니다.

GKE 포드 CIDR 블록의 PUPI 주소

위 다이어그램에는 다음과 같은 고려사항이 포함됩니다.

  • 기본 CIDR 블록: 노드 및 내부 부하 분산기(ILB)에 사용되는 PUPI 이외의 CIDR 블록이며 VPC간에 겹치지 않아야 합니다.
  • 생산자 보조 CIDR 블록: 포드에 사용되는 PUPI CIDR 블록입니다(예: 45.45.0.0/16).
  • 소비자 보조 CIDR 블록: 고객 측에 있는 다른 모든 PUPI CIDR 블록입니다(예: 5.5.0.0/16).

서비스 제공업체 시나리오에서의 PUPI 사용 방법

서비스 제공업체(생산자)는 VPC(vpc-producer) 내의 GKE 클러스터(gke-2)에서 관리형 서비스를 실행합니다. 이 클러스터는 해당 포드 IP 주소에 대해 PUPI 범위 45.0.0.0/8을 사용합니다.

고객(소비자)에게는 또한 포드 IP 주소에 대해 다른 PUPI 범위인 5.0.0.0/8을 사용하는 자체 VPC(vpc-consumer)의 GKE 클러스터(gke-1)가 있습니다.

이러한 두 VPC는 VPC 피어링을 사용하여 연결되지만 노드, 서비스, 내부 부하 분산기에 대해 서로 표준 비공개 IP 주소(RFC 1918)를 계속 사용합니다.

VPC 간 통신 보장

  • 소비자에서 생산자로: 기본적으로 소비자의 VPC는 RFC 1918 경로(PUPI 제외)를 생산자와 자동으로 공유합니다. 따라서 일반적으로 내부 부하 분산기를 통해 소비자 VPC의 리소스가 생산자 VPC의 서비스에 액세스할 수 있습니다.
  • 생산자에서 소비자로: 생산자의 포드가 소비자 VPC의 리소스에 도달하기 위해서는 명시적인 구성이 필요합니다.
  • 겹침 없음: 생산자 및 소비자는 소비자의 PUPI 범위가 생산자 VPC에 사용된 IP 주소와 충돌하지 않는지 확인해야 합니다.
  • 내보내기/가져오기: 생산자는 PUPI 경로의 내보내기를 사용 설정하고 소비자는 피어링 연결을 통해 이러한 경로의 가져오기를 사용 설정해야 합니다.

PUPI 범위가 겹칠 때 통신 사용 설정

소비자 VPC에 이미 생산자와 동일한 PUPI 범위가 사용될 경우에는 생산자 포드로부터 직접 통신이 가능하지 않습니다. 대신 생산자는 포드 IP 주소가 생산자의 노드 IP 주소 뒤에 숨겨지는 IP 주소 매스커레이드를 사용 설정할 수 있습니다.

다음 표에는 각 VPC의 기본 가져오기 및 내보내기 설정이 나와 있습니다. gcloud compute networks peerings update 명령어를 사용하여 기본 VPC 피어링 설정을 수정할 수 있습니다.

VPC 네트워크 설정 가져오기 설정 내보내기 참고
제작자

기본 동작(해제됨): 공개 IP 주소를 사용하여 서브넷 경로를 가져오지 않습니다.
사용 설정: --import-subnet-routes-with-public-ip(피어링 사용)

기본 동작(설정됨): 공개 IP 주소를 사용하여 서브넷 경로를 내보냅니다.
사용 해제: --no-export-subnet-routes-with-public-ip(피어링 사용)

서비스 네트워킹을 통해 제어되는 플래그.
소비자 사용 중지됨(기본값) 사용 설정됨(기본값) 일반적으로 고객이 관리하며, 서비스 네트워킹을 통해 수정할 필요가 없음

이러한 설정을 사용하면 다음과 같은 결과가 발생합니다.

  • 생산자 VPC는 모든 고객 경로를 확인합니다.
  • 소비자 VPC는 생산자 VPC의 포드 서브넷에서 구성된 PUPI 경로를 볼 수 없습니다.
  • 생산자 포드에서 vpc-consumer 네트워크로 전송되는 트래픽은 생산자 클러스터의 노드 주소 뒤에 변환되어야 합니다.

기본 요건

VPC 포드와 다른 VPC 사이에 통신을 성공적으로 설정하려면 다음 기본 요건과 구성이 충족되었는지 확인합니다.

  • GKE 클러스터는 다음과 같은 최소 버전 요구사항을 충족해야 합니다.
    • Autopilot 클러스터: GKE 버전 1.22 이상
    • 표준 클러스터: GKE 버전 1.14 이상
  • 공개적으로 라우팅할 수 없거나 Google에서 소유되는 PUPI 범위를 선택합니다.
  • 두 VPC의 노드 IP 주소와 기본 IP 주소 범위가 겹치지 않는지 확인합니다.
  • 고객 VPC와 관리형 서비스 사이에 직접 포드 간 통신이 필요하면 다음 단계를 수행합니다.
    • Autopilot 클러스터: 포드 간 통신을 보장하도록 PUPI에 대한 SNAT를 구성합니다. 추가 구성은 필요하지 않습니다.
    • 표준 클러스터: SNAT를 사용해서 포드 IP 주소를 해당 노드 IP 주소로 변환합니다. PUPI 트래픽에 대해 SNAT를 사용 설정합니다. 자세한 내용은 비공개로 사용되는 외부 IP 주소 범위 사용 설정을 참조하세요.

GKE 클러스터에 대해 비공개로 사용되는 공개 IP 주소 구성

GKE 클러스터에 대해 PUPI 주소를 구성하려면 다음 안내를 따르세요.

  1. 2개의 가상 프라이빗 클라우드(VPC) 네트워크를 구성합니다.
  2. 각 가상 프라이빗 클라우드(VPC) 네트워크 내에 서브넷을 하나 구성합니다.
  3. 각 서브넷의 보조 IP 주소 범위에 PUPI 주소 범위를 구성합니다.
  4. 적절한 가져오기 및 내보내기 설정으로 두 가상 프라이빗 클라우드(VPC) 네트워크 간의 가상 프라이빗 클라우드(VPC) 피어링 관계를 설정합니다.
  5. 각 가상 프라이빗 클라우드(VPC) 내의 경로를 검사합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용합니다.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • VPC 기반 클러스터만 사용합니다.

  • VPC 피어링에 필요한 IPAM 사양을 설정합니다.

네트워크 및 클러스터 설정

  1. VPC 네트워크 만들기:

    RFC-1918를 사용해서 노드의 기본 범위 및 포드의 PUPI 범위로 다음 2개의 VPC 네트워크를 만듭니다. RFC 1918 비공개 주소 공간(예: 10.x.x.x, 172.16.x.x, 192.168.x.x)의 기본 IP 주소 범위를 두 VPC에 모두 할당합니다. 이러한 범위는 일반적으로 GKE 클러스터 내의 워커 노드에 사용됩니다. 내부 IP 주소 범위 외에도 각 VPC에 대해 비공개로 사용되는 공개 IP 주소(PUPI)에 대한 개별 범위를 지정합니다. 이러한 PUPI 범위는 해당 GKE 클러스터 내에서 포드 IP 주소에 배타적으로 사용됩니다.

    • 소비자 VPC 네트워크: 이 VPC는 소비자 애플리케이션 또는 워크로드가 실행되는 GKE 클러스터를 호스팅합니다. 다음과 비슷한 구성을 사용할 수 있습니다.

      Network: consumer
      Subnetwork: consumer-subnet
      Primary range: 10.129.0.0/24
      Service range name and cidr: consumer-services, 172.16.5.0/24
      Pod range name and cidr: consumer-pods, 5.5.5.0/24
      Cluster name: consumer-cluster
      
    • 생산자 VPC 네트워크: 이 VPC는 소비자가 사용하는 서비스를 제공해야 하는 GKE 클러스터를 호스팅합니다. 다음과 비슷한 구성을 사용할 수 있습니다.

      Network: producer
      Subnetwork: producer-subnet
      Primary range: 10.128.0.0/24
      Service range name and cidr: producer-services, 172.16.45.0/24
      Pod range name and cidr: producer-pods, 45.45.45.0/24
      Cluster name: producer-cluster
      

    VPC 네트워크 만들기에 대한 자세한 내용은 VPC 네트워크 만들기를 참조하세요.

  2. 이전 단계에서 PUPI 범위로 생성된 VPC 네트워크와 서브넷에서는 2개의 GKE 클러스터(producerconsumer)를 만들 수 있습니다.

    1. 다음과 같이 생산자 네트워크 및 서브넷을 사용하여 producer 클러스터를 만듭니다.

      gcloud container clusters create PRODUCER_CLUSTER_NAME \
          --enable-ip-alias \
          --network=NETWORK_NAME \
          --subnetwork=SUBNETWORK_NAME \
          --cluster-secondary-range-name=PRODUCER_PODS \
          --services-secondary-range-name=PRODUCER_SERVICES \
          --num-nodes=1 \
          --zone=PRODUCER_ZONE_NAME \
          --project=PRODUCER_PROJECT_NAME
      

      다음을 바꿉니다.

      • PRODUCER_CLUSTER_NAME: GKE 생산자 클러스터의 이름입니다.
      • COMPUTE_LOCATION: 클러스터의 Compute Engine 위치입니다.
      • PRODUCER_SUBNET_NAME: 기존 서브넷의 이름입니다. 서브넷의 기본 IP 주소 범위는 노드에 사용됩니다. 서브넷은 클러스터에서 사용되는 리전과 같은 리전에 있어야 합니다. 이를 생략하면 GKE는 클러스터 리전의 default VPC 네트워크에서 서브넷 사용을 시도합니다.
      • 보조 범위 할당 방법이 GKE에서 관리되는 경우 각 항목의 의미는 다음과 같습니다.
        • POD_IP_RANGE: CIDR 표기법을 따른 IP 주소 범위(예: 10.0.0.0/14) 또는 CIDR 블록의 서브넷 마스크 크기(예: /14)입니다. 이는 포드의 서브넷 보조 IP 주소 범위를 만드는 데 사용됩니다. --cluster-ipv4-cidr 옵션을 생략하면 GKE는 /14 범위(218개의 주소)를 자동으로 선택합니다. 자동으로 선택되는 범위는 10.0.0.0/8(224개 주소 범위)에서 무작위로 선택됩니다.
        • SERVICES_IP_RANGE: CIDR 표기법(예: 10.4.0.0/19) 또는 CIDR 블록의 서브넷 마스크 크기(예: /19)에서 IP 주소 범위입니다. 서비스의 서브넷 보조 IP 주소 범위를 만드는 데 사용됩니다.
      • 보조 범위 할당 방법을 사용자가 관리하는 경우의 각 항목의 의미는 다음과 같습니다.
        • SECONDARY_RANGE_PODS: 지정된 SUBNET_NAME에 있는 기존 보조 IP 주소 범위의 이름입니다. GKE에서는 클러스터의 포드에 전체 서브넷 보조 IP 주소 범위를 사용합니다.
        • SECONDARY_RANGE_SERVICES: 지정된 기존 보조 IP 주소 범위의 이름입니다.
    2. 다음과 같이 소비자 네트워크 및 서브넷을 사용하여 consumer 클러스터를 만듭니다.

      gcloud container clusters create CONSUMER_CLUSTER_NAME \
          --enable-ip-alias \
          --network=CONSUMER_NETWORK_NAME \
          --subnetwork=CONSUMER_SUBNETWORK_NAME \
          --cluster-secondary-range-name=CONSUMER_PODS \
          --services-secondary-range-name=CONSUMER_SERVICES \
          --num-nodes=1 \
          --zone=CONSUMER_ZONE \
          --project=CONSUMER_PROJECT
      

      다음을 바꿉니다.

      • CONSUMER_CLUSTER_NAME: GKE 소비자 클러스터의 이름입니다.
      • COMPUTE_LOCATION: 클러스터의 Compute Engine 위치입니다.
      • CONSUMER_SUBNET_NAME: 기존 서브넷의 이름입니다. 서브넷의 기본 IP 주소 범위는 노드에 사용됩니다. 서브넷은 클러스터에서 사용되는 리전과 같은 리전에 있어야 합니다. 이를 생략하면 GKE는 클러스터 리전의 default VPC 네트워크에서 서브넷 사용을 시도합니다.
      • 보조 범위 할당 방법이 GKE에서 관리되는 경우 각 항목의 의미는 다음과 같습니다.
        • POD_IP_RANGE: CIDR 표기법을 따른 IP 주소 범위(예: 10.0.0.0/14) 또는 CIDR 블록의 서브넷 마스크 크기(예: /14)입니다. 이는 포드의 서브넷 보조 IP 주소 범위를 만드는 데 사용됩니다. --cluster-ipv4-cidr 옵션을 생략하면 GKE는 /14 범위(218개의 주소)를 자동으로 선택합니다. 자동으로 선택되는 범위는 10.0.0.0/8(224개 주소 범위)에서 무작위로 선택되고, VM 및 기존 경로에 할당된 IP 주소 범위 또는 다른 클러스터에 할당된 범위가 포함되지 않습니다. 자동으로 선택된 범위는 예약된 IP 주소, 동적 경로 또는 이 클러스터와 피어링하는 VPC 내의 경로와 충돌할 수 있습니다. 이 중 하나를 사용하는 경우 충돌을 방지하려면 --cluster-ipv4-cidr을 지정해야 합니다.
        • SERVICES_IP_RANGE: CIDR 표기법(예: 10.4.0.0/19) 또는 CIDR 블록의 서브넷 마스크 크기(예: /19)에서 IP 주소 범위입니다. 서비스의 서브넷 보조 IP 주소 범위를 만드는 데 사용됩니다.
      • 보조 범위 할당 방법을 사용자가 관리하는 경우의 각 항목의 의미는 다음과 같습니다.
        • SECONDARY_RANGE_PODS: 지정된 SUBNET_NAME에 있는 기존 보조 IP 주소 범위의 이름입니다. GKE에서는 클러스터의 포드에 전체 서브넷 보조 IP 주소 범위를 사용합니다.
        • SECONDARY_RANGE_SERVICES: 지정된 기존 보조 IP 주소 범위의 이름입니다.

    클러스터 만들기에 대한 자세한 내용은 클러스터 만들기를 참조하세요.

  3. 다음과 같이 consumer-vpc 네트워크와 producer-vpc 네트워크 사이에 VPC 피어링 관계를 설정합니다.

    • consumer 네트워크를 생산자에 연결하려면 다음 명령어를 실행합니다.

      gcloud compute networks peerings create PEERING_NAME \
          --project=consumer_project \
          --network=consumer \
          --peer-network=producer
      
    • producer 네트워크를 소비자에 연결하려면 다음 명령어를 실행합니다.

      gcloud compute networks peerings create PEERING_NAME \
          --project=producer_project \
          --network=producer \
          --peer-network=consumer \
          --no-export-subnet-routes-with-public-ip \
          --import-subnet-routes-with-public-ip
      

    다음을 바꿉니다.

    • PEERING_NAME: GKE 소비자 클러스터의 이름입니다.
    • CONSUMER_CLUSTER_NAME: GKE 소비자 클러스터의 이름입니다.

    기본적으로 소비자 VPC는 PUPI 주소를 내보냅니다. 생산자 VPC를 만들 때 다음 인수를 사용하여 PUPI 주소를 가져오도록 VPC를 구성하지만 내보내지는 않습니다.

    --no-export-subnet-routes-with-public-ip
    --import-subnet-routes-with-public-ip
    

네트워크 및 서브네트워크 확인

  1. 생산자 네트워크를 확인합니다.

    gcloud compute networks describe producer \
        --project=producer_project
    

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

    ...
    kind: compute#network
    name: producer
    peerings:
    - autoCreateRoutes: true
      exchangeSubnetRoutes: true
      exportCustomRoutes: false
      exportSubnetRoutesWithPublicIp: false
      importCustomRoutes: false
      importSubnetRoutesWithPublicIp: true
      name: producer-peer-consumer
    …
    
  2. 생산자 서브네트워크를 확인합니다.

    gcloud compute networks subnets describe producer-subnet \
        --project=producer_project\
        --region=producer_region
    

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

    ...
    ipCidrRange: 10.128.0.0/24
    kind: compute#subnetwork
    name: producer-subnet
    …
    secondaryIpRanges:
    - ipCidrRange: 172.16.45.0/24
      rangeName: producer-services
    - ipCidrRange: 45.45.45.0/24
      rangeName: producer-pods
    …
    
  3. 소비자 네트워크를 확인합니다.

    gcloud compute networks subnets describe consumer-subnet \
        --project=consumer_project \
        --region=consumer_region
    

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

    ...
    kind: compute#network
    name: consumer
    peerings:
    - autoCreateRoutes: true
      exchangeSubnetRoutes: true
      exportCustomRoutes: false
      exportSubnetRoutesWithPublicIp: true
      importCustomRoutes: false
      importSubnetRoutesWithPublicIp: false
      name: consumer-peer-producer
    ...
    
  4. 소비자 서브네트워크를 확인합니다.

    gcloud compute networks describe consumer \
    --project=consumer_project
    

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

    ...
    ipCidrRange: 10.129.0.0/24
    kind: compute#subnetwork
    name: consumer-subnet
    ...
    secondaryIpRanges:
    - ipCidrRange: 172.16.5.0/24
      rangeName: consumer-services
    - ipCidrRange: 5.5.5.0/24
      rangeName: consumer-pods
    ...
    

GKE 클러스터 및 리소스 확인

  1. 소비자 클러스터 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials consumer-cluster \
        --project=consumer_project \
        --zone=consumer_zone
    

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

    ...
    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for consumer-cluster.
    ...
    
  2. helloapp을 설치하고 확인합니다.

    또는 다음 매니페스트를 deployment.yaml로 저장할 수 있습니다.

    kubectl apply -f - <<'EOF'
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloweb
      labels:
        app: hello
    spec:
      selector:
        matchLabels:
          app: hello
          tier: web
      template:
        metadata:
          labels:
            app: hello
            tier: web
        spec:
          containers:
          - name: hello-app
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: 200m
    EOF
    
  3. deployment.yaml을 적용합니다.

    kubectl apply -f
    
  4. helloweb 배포를 확인합니다.

    kubectl get deployment helloweb
    

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

    ...
    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    helloweb   1/1     1            1           10s
    ...
    

솔루션 확인

  1. VPC 피어링이 성공적으로 생성되었는지 확인합니다.

    gcloud compute networks peerings list
    

    출력은 다음과 비슷하며, 소비자 및 생산자라는 이름의 피어링을 보여줍니다.

    NAME                                     NETWORK    PEER_PROJECT                PEER_NETWORK                            STACK_TYPE  PEER_MTU  IMPORT_CUSTOM_ROUTES  EXPORT_CUSTOM_ROUTES  STATE   STATE_DETAILS
    consumer-peer-producer                   consumer   <project_name>            producer                                IPV4_ONLY   1460      False                 False                 ACTIVE  [2023-08-07T13:14:57.178-07:00]: Connected.
    producer-peer-consumer                   producer   <project_name>             consumer                                IPV4_ONLY   1460      False                 False                 ACTIVE  [2023-08-07T13:14:57.178-07:00]: Connected.
    
  2. 소비자 VPC가 PUPI 경로를 내보내는지 확인합니다.

    gcloud compute networks peerings list-routes consumer-peer-producer \
        --direction=OUTGOING \
        --network=consumer \
        --region=<consumer_region>
    

    출력은 다음과 비슷하며, 세 가지 소비자 CIDR 블록을 모두 보여줍니다.

    DEST_RANGE     TYPE                  NEXT_HOP_REGION  PRIORITY  STATUS
    10.129.0.0/24  SUBNET_PEERING_ROUTE  us-central1      0         accepted by peer
    172.16.5.0/24  SUBNET_PEERING_ROUTE  us-central1      0         accepted by peer
    5.5.5.0/24     SUBNET_PEERING_ROUTE  us-central1      0         accepted by peer
    
  3. 생산자 VPC가 가져온 PUPI 경로를 검증합니다.

    gcloud compute networks peerings list-routes producer-peer-consumer \
        --direction=INCOMING \
        --network=producer \
        --region=<producer_region>
    

    출력은 다음과 비슷하며, 세 가지 소비자 CIDR 블록을 모두 보여줍니다.

    DEST_RANGE     TYPE                  NEXT_HOP_REGION  PRIORITY  STATUS
    10.129.0.0/24  SUBNET_PEERING_ROUTE  us-central1      0         accepted
    172.16.5.0/24  SUBNET_PEERING_ROUTE  us-central1      0         accepted
    5.5.5.0/24     SUBNET_PEERING_ROUTE  us-central1      0         accepted
    
  4. GKE 포드에 PUPI 주소가 있는지 확인합니다.

    kubectl get pod -o wide
    

    출력은 다음과 비슷하며, 포드의 IP 주소가 5.5.5/24 범위에 속하는 것을 보여줍니다.

    NAME                        READY   STATUS    RESTARTS   AGE   IP         NODE                                              NOMINATED NODE   READINESS GATES
    helloweb-575d78464d-xfklj   1/1     Running   0          28m   5.5.5.16   gke-consumer-cluster-default-pool-e62b6542-dp5f   <none>           <none>
    

다음 단계