Cloud Build 비공개 풀로 비공개 Google Kubernetes Engine 클러스터에 액세스

이 튜토리얼에서는 Cloud Build 비공개 풀을 사용하여 비공개 Google Kubernetes Engine(GKE) 클러스터에 액세스하는 방법을 설명합니다. 이 액세스 권한이 있으면 Cloud Build를 사용하여 비공개 GKE 클러스터에 애플리케이션을 배포할 수 있습니다. 이 튜토리얼은 네트워크 관리자를 대상으로 하며 Cloud Build 비공개 풀이 피어링된 Virtual Private Cloud (VPC) 네트워크에서 실행되는 서비스와 통신해야 하는 모든 상황에 적용됩니다. 예를 들어 비공개 풀 작업자는 다음 서비스와 통신할 수 있습니다.

  • 비공개 GKE 클러스터
  • Cloud SQL 데이터베이스
  • Memorystore 인스턴스
  • Cloud Build 비공개 풀과 피어링된 VPC 네트워크가 아닌 다른 VPC 네트워크에서 실행 중인 Compute Engine 인스턴스

Cloud Build 비공개 풀과 GKE 클러스터 제어 영역은 모두 Google 소유의 VPC 네트워크에서 실행됩니다. 이러한 VPC 네트워크는 Google Cloud에서 자체 VPC 네트워크와 피어링됩니다. 그러나 VPC 네트워크 피어링은 전환 피어링을 지원하지 않으며, 이는 Cloud Build 비공개 풀을 사용할 때 제한될 수 있습니다. 이 튜토리얼에서는 Cloud VPN을 사용하여 Cloud Build 비공개 풀의 작업자가 비공개 GKE 클러스터의 제어 영역에 액세스할 수 있도록 하는 솔루션을 제공합니다.

이 튜토리얼에서는 사용자가 Google Kubernetes Engine, Cloud Build, gcloud 명령어, VPC 네트워크 피어링, Cloud VPN에 익숙하다고 가정합니다.

아키텍처 개요

클라이언트가 공개 엔드포인트에 액세스할 수 없는 비공개 GKE 클러스터를 만들면 클라이언트는 비공개 IP 주소를 사용하여 GKE 클러스터 제어 영역에만 액세스할 수 있습니다. kubectl과 같은 클라이언트는 VPC 네트워크에 액세스할 수 있고 승인된 네트워크에 있는 인스턴스에서 실행되는 경우에만 제어 영역과 통신할 수 있습니다.

이 비공개 GKE 클러스터에 애플리케이션을 배포하기 위해 Cloud Build를 사용하려면 Cloud Build 비공개 풀을 사용하여 GKE 클러스터에 액세스해야 합니다. 비공개 풀은 Google 소유의 Google Cloud 프로젝트에서 실행되고 VPC 네트워크 피어링 연결을 사용하여 VPC 네트워크에 피어링되는 작업자 인스턴스 집합입니다. 이 설정에서 작업자 인스턴스는 GKE 클러스터 제어 영역의 비공개 IP 주소와 통신할 수 있습니다.

하지만 GKE 클러스터 제어 영역은 Google 소유 프로젝트에서도 실행되며 피어링 연결을 사용하여 VPC 네트워크에 피어링됩니다. VPC 네트워크 피어링은 전환 피어링을 지원하지 않으므로 Cloud Build 비공개 풀과 GKE 클러스터 제어 영역 간에 패킷을 직접 라우팅할 수 없습니다.

Cloud Build 작업자 인스턴스가 GKE 클러스터 제어 영역에 액세스할 수 있도록 비공개 풀과 GKE 클러스터 제어 영역을 사용자가 소유한 두 VPC 네트워크와 피어링한 다음 Cloud VPN을 사용하여 이 두 VPC 네트워크를 연결합니다. 이 피어링 및 연결을 통해 VPC 터널의 각 측이 비공개 풀 및 GKE 클러스터 제어 영역 네트워크를 공지하여 라우팅을 완료합니다.

다음 아키텍처 다이어그램은 이 튜토리얼에서 사용되는 리소스를 보여줍니다.

Cloud Build 비공개 풀과 GKE 클러스터 제어 영역 사이의 라우팅을 완료하는 VPN 터널입니다.

짧은 지연 시간을 위해 이 튜토리얼에 사용된 모든 리소스를 동일한 Google Cloud 리전에 만드는 것이 좋습니다. 자체 구현 시 이 리전 간 통신이 필요한 경우 VPN 터널은 서로 다른 두 리전을 통과할 수 있습니다. 소유하고 있는 두 VPC 네트워크도 서로 다른 프로젝트에 속할 수 있습니다.

목표

  • 비공개 GKE 클러스터를 만듭니다.
  • Cloud Build 비공개 풀을 설정합니다.
  • 두 VPC 네트워크 간에 HA VPN 연결을 만듭니다.
  • 두 개의 VPC 네트워크 피어링과 VPC 연결을 통해 패킷 라우팅을 사용 설정합니다.

비용

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

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  3. Cloud Build, Google Kubernetes Engine, and Service Networking API를 사용 설정합니다.

    API 사용 설정

  4. Cloud Console에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

    Cloud Console 하단에 Cloud Shell 세션이 시작되고 명령줄 프롬프트가 표시됩니다. Cloud Shell은 gcloud 명령줄 도구가 포함되고 Cloud SDK가 사전 설치된 셸 환경으로, 현재 프로젝트의 값이 이미 설정되어 있습니다. 세션이 초기화되는 데 몇 초 정도 걸릴 수 있습니다.

내 프로젝트에 VPC 네트워크 2개 만들기

이 섹션에서는 두 개의 VPC 네트워크와 GKE 클러스터 노드용 서브넷을 만듭니다.

  1. Cloud Shell에서 첫 번째 VPC 네트워크(앞의 다이어그램에서 '비공개 풀 피어링 VPC 네트워크')를 만듭니다. 이 네트워크에 서브넷을 만들 필요는 없습니다.

    gcloud compute networks create PRIVATE_POOL_VPC_NAME \
        --subnet-mode=CUSTOM
    

    PRIVATE_POOL_VPC_NAME은 Cloud Build 비공개 풀 네트워크와 피어링할 VPC 네트워크의 이름입니다.

  2. 두 번째 VPC 네트워크(앞의 다이어그램에서 'GKE 피어링 VPC 네트워크')를 만듭니다.

    gcloud compute networks create GKE_VPC_NAME \
        --subnet-mode=CUSTOM
    

    GKE_VPC_NAME은 GKE 클러스터 제어 영역과 피어링할 VPC 네트워크의 이름입니다.

  3. GKE 클러스터 노드용 서브넷을 만듭니다.

    gcloud compute networks subnets create GKE_SUBNET_NAME \
        --network=GKE_VPC_NAME \
        --range=GKE_SUBNET_RANGE \
        --region=REGION
    

    다음을 바꿉니다.

    • GKE_SUBNET_NAME: GKE 클러스터 노드를 호스팅할 서브네트워크의 이름입니다.
    • GKE_SUBNET_RANGE: GKE_SUBNET_NAME의 IP 주소 범위입니다. 이 튜토리얼에서는 10.244.252.0/22를 사용할 수 있습니다.
    • REGION: GKE 클러스터를 호스팅하는 Google Cloud 리전입니다. 이 튜토리얼에서는 us-central1를 사용할 수 있습니다.

이제 프로젝트에 VPC 네트워크 두 개를 설정했으며 다른 네트워크와 피어링할 준비가 되었습니다.

비공개 GKE 클러스터 만들기

이 섹션에서는 비공개 GKE 클러스터를 만듭니다.

  1. Cloud Shell에서 클라이언트가 제어 영역의 공개 엔드포인트에 액세스할 수 없는 GKE 클러스터를 만듭니다.

    gcloud container clusters create PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --enable-master-authorized-networks \
        --network=GKE_VPC_NAME \
        --subnetwork=GKE_SUBNET_NAME \
        --enable-private-nodes \
        --enable-private-endpoint \
        --enable-ip-alias \
        --master-ipv4-cidr=CLUSTER_CONTROL_PLANE_CIDR
    

    다음을 바꿉니다.

    • PRIVATE_CLUSTER_NAME: 비공개 GKE 클러스터의 이름입니다.
    • CLUSTER_CONTROL_PLANE_CIDR: GKE 클러스터 제어 영역의 IP 주소 범위입니다. /28 프리픽스가 있어야 합니다. 이 가이드에서는 172.16.0.32/28을 사용합니다.
    • REGION: GKE 클러스터의 리전입니다. 이 튜토리얼에서는 VPC 네트워크에 사용한 것과 동일한 리전으로 us-central1을 사용합니다.

    이제 자체 프로젝트에서 VPC 네트워크와 피어링된 비공개 GKE 클러스터를 만들었습니다.

  2. GKE 클러스터의 VPC 네트워크 피어링 이름을 검색합니다. 이 VPC 네트워크 피어링은 GKE 클러스터를 만들 때 자동으로 생성되었습니다.

    export GKE_PEERING_NAME=$(gcloud container clusters describe PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --format='value(privateClusterConfig.peeringName)')
    
  3. 커스텀 경로 내보내기를 사용 설정하여 비공개 풀 네트워크를 GKE 클러스터 제어 영역에 공지합니다.

    gcloud compute networks peerings update $GKE_PEERING_NAME \
        --network=GKE_VPC_NAME \
        --export-custom-routes \
        --no-export-subnet-routes-with-public-ip
    

    커스텀 경로에 대한 자세한 내용은 커스텀 경로 가져오기 및 내보내기를 참조하세요.

Cloud Build 비공개 풀 만들기

이 섹션에서는 Cloud Build 비공개 풀을 만듭니다.

  1. Cloud Shell에서 Cloud Build 비공개 풀의 PRIVATE_POOL_VPC_NAME VPC 네트워크에 명명된 IP 주소 범위를 할당합니다.

    gcloud compute addresses create RESERVED_RANGE_NAME \
        --global \
        --purpose=VPC_PEERING \
        --addresses=PRIVATE_POOL_NETWORK \
        --prefix-length=PRIVATE_POOL_PREFIX \
        --network=PRIVATE_POOL_VPC_NAME
    

    다음을 바꿉니다.

    • RESERVED_RANGE_NAME: Cloud Build 비공개 풀을 호스팅하는 비공개 IP 주소 범위의 이름입니다.
    • PRIVATE_POOL_NETWORK: RESERVED_RANGE_NAME의 첫 번째 IP 주소입니다. 이 튜토리얼에서는 192.168.0.0을 사용할 수 있습니다.
    • PRIVATE_POOL_PREFIX: RESERVED_RANGE_NAME의 프리픽스입니다. /24보다 커야 합니다. 이 튜토리얼에서는 16을 사용할 수 있습니다.
    • --purposeVPC_PEERING인 경우 명명된 IP 주소 범위는 global이어야 하므로 IP 범위는 global입니다.
  2. 비공개 풀 VPC 네트워크와 PRIVATE_POOL_VPC_NAME 사이에 비공개 연결을 만듭니다.

    gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=RESERVED_RANGE_NAME \
        --network=PRIVATE_POOL_VPC_NAME
    
  3. GKE 클러스터 제어 영역 네트워크를 비공개 풀에 공지하려면 커스텀 경로 내보내기를 사용 설정합니다.

    gcloud compute networks peerings update servicenetworking-googleapis-com \
        --network=PRIVATE_POOL_VPC_NAME \
        --export-custom-routes \
        --no-export-subnet-routes-with-public-ip
    
  4. PRIVATE_POOL_VPC_NAME과 피어링된 Cloud Build 비공개 풀을 만듭니다.

    gcloud builds worker-pools create PRIVATE_POOL_NAME \
       --region=REGION \
       --peered-network=projects/$GOOGLE_CLOUD_PROJECT/global/networks/PRIVATE_POOL_VPC_NAME
    

    PRIVATE_POOL_NAME은 Cloud Build 비공개 풀의 이름입니다.

이제 Cloud Build 비공개 풀을 만들고 자체 프로젝트의 VPC 네트워크와 피어링했습니다.

두 VPC 네트워크 사이에 Cloud VPN 연결 만들기

자체 프로젝트에는 이제 Cloud Build 비공개 풀과 피어링된 VPC 네트워크와 비공개 GKE 클러스터와 피어링된 두 번째 VPC 네트워크가 있습니다.

이 섹션에서는 프로젝트의 두 VPC 네트워크 간에 Cloud VPN 연결을 만듭니다. 이 연결은 라우팅을 완료하고 Cloud Build 비공개 풀이 GKE 클러스터에 액세스할 수 있도록 합니다.

  1. Cloud Shell에서 서로 연결되는 HA VPN 게이트웨이 두 개를 만듭니다. 이러한 게이트웨이를 만들려면 서로 연결되는 완전히 구성된 HA VPN 게이트웨이 2개 만들기의 안내를 따르세요. BGP 세션을 만들면 설정이 완료됩니다. 이 안내를 따르는 동안 다음 값을 사용합니다.

    • NETWORK_1PRIVATE_POOL_VPC_NAME
    • NETWORK_2GKE_VPC_NAME
    • REGION_1REGION_2REGION
  2. 비공개 풀 VPC 네트워크 및 GKE 클러스터 제어 영역 VPC 네트워크에 대한 경로를 공지하도록 만든 네 개의 BGP 세션을 각각 구성합니다.

    gcloud compute routers update-bgp-peer ROUTER_NAME_1 \
        --peer-name=PEER_NAME_GW1_IF0 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
    
    gcloud compute routers update-bgp-peer ROUTER_NAME_1 \
        --peer-name=PEER_NAME_GW1_IF1 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
    
    gcloud compute routers update-bgp-peer ROUTER_NAME_2 \
        --peer-name=PEER_NAME_GW2_IF0 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR
    
    gcloud compute routers update-bgp-peer ROUTER_NAME_2 \
        --peer-name=PEER_NAME_GW2_IF1 \
        --region=REGION \
        --advertisement-mode=CUSTOM \
        --set-advertisement-ranges=CLUSTER_CONTROL_PLANE_CIDR
    

    여기서 다음 값은 2개의 HA VPN 게이트웨이를 만들 때 사용한 이름과 동일합니다.

    • ROUTER_NAME_1
    • PEER_NAME_GW1_IF0
    • PEER_NAME_GW1_IF1
    • ROUTER_NAME_2
    • PEER_NAME_GW2_IF0
    • PEER_NAME_GW2_IF1

GKE 클러스터 제어 영역에 대한 Cloud Build 액세스 사용 설정

이제 프로젝트의 두 VPC 네트워크 간에 VPN이 연결되었으므로 GKE 클러스터 제어 영역에 대한 Cloud Build 액세스를 사용 설정합니다.

  1. Cloud Shell에서 GKE의 제어 영역에서 승인된 네트워크에 비공개 풀 네트워크 범위를 추가합니다.

    gcloud container clusters update PRIVATE_CLUSTER_NAME \
        --enable-master-authorized-networks \
        --region=REGION \
        --master-authorized-networks=PRIVATE_POOL_NETWORK/PRIVATE_POOL_PREFIX
    

    다음을 바꿉니다.

    • PRIVATE_POOL_NETWORK: RESERVED_RANGE_NAME의 첫 번째 IP 주소입니다. 이 튜토리얼에서는 192.168.0.0을 사용할 수 있습니다.
    • PRIVATE_POOL_PREFIX: RESERVED_RANGE_NAME의 프리픽스입니다. /24보다 커야 합니다. 이 튜토리얼에서는 16을 사용할 수 있습니다.
  2. Cloud Build 서비스 계정이 GKE 클러스터 제어 영역에 액세스하도록 허용합니다.

    export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format 'value(projectNumber)')
    
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
        --role=roles/container.developer
    

이제 Cloud Build 비공개 풀이 GKE 클러스터 제어 영역에 액세스할 수 있습니다.

솔루션 확인

이 섹션에서는 비공개 풀에서 실행되는 빌드 단계에서 kubectl get nodes 명령어를 실행하여 솔루션이 작동하는지 확인합니다.

  1. Cloud Shell에서 kubectl get nodes 명령어를 실행하는 Cloud Build 구성 파일이 포함된 임시 폴더를 만듭니다.

    mkdir private-pool-test && cd private-pool-test
    
    cat > cloudbuild.yaml <<EOF
    steps:
    - name: "gcr.io/cloud-builders/kubectl"
      args: ['get', 'nodes']
      env:
      - 'CLOUDSDK_COMPUTE_REGION=REGION'
      - 'CLOUDSDK_CONTAINER_CLUSTER=PRIVATE_CLUSTER_NAME'
    options:
      workerPool:
        'projects/$GOOGLE_CLOUD_PROJECT/locations/REGION/workerPools/PRIVATE_POOL_NAME'
    EOF
    
  2. 빌드 작업을 시작합니다.

    gcloud builds submit --config=cloudbuild.yaml
    
  3. 출력이 GKE 클러스터의 노드 목록인지 확인합니다. 콘솔에 표시되는 빌드 로그에는 다음과 유사한 테이블이 포함됩니다.

    NAME                                     STATUS   ROLES    AGE   VERSION
    gke-private-default-pool-3ec34262-7lq9   Ready    <none>   9d    v1.19.9-gke.1900
    gke-private-default-pool-4c517758-zfqt   Ready    <none>   9d    v1.19.9-gke.1900
    gke-private-default-pool-d1a885ae-4s9c   Ready    <none>   9d    v1.19.9-gke.1900
    

이제 비공개 풀의 작업자가 GKE 클러스터에 액세스할 수 있음을 확인했습니다. 이 액세스 권한을 통해 Cloud Build를 사용하여 이 비공개 GKE 클러스터에 애플리케이션을 배포할 수 있습니다.

문제 해결하기

이 가이드에서 문제가 발생하면 다음 문서를 참조하세요.

정리

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

  1. Cloud Shell에서 GKE 클러스터를 삭제합니다.

    gcloud container clusters delete PRIVATE_CLUSTER_NAME \
        --region=REGION \
        --async
    

    이 명령어를 실행하면 VPC 네트워크 피어링이 자동으로 삭제됩니다.

  2. Cloud Build 비공개 풀을 삭제합니다.

    gcloud builds worker-pools delete PRIVATE_POOL_NAME \
        --region=REGION
    
  3. 서비스 제작자 VPC 네트워크 및 PRIVATE_POOL_VPC_NAME 사이의 비공개 연결을 삭제합니다.

    gcloud services vpc-peerings delete \
       --network=PRIVATE_POOL_VPC_NAME \
       --async
    
  4. 비공개 풀에 사용되는 명명된 IP 주소 범위를 삭제합니다.

    gcloud compute addresses delete RESERVED_RANGE_NAME \
        --global
    
  5. 4개의 VPN 터널을 삭제합니다. VPN 터널 만들기에서 지정한 것과 동일한 이름을 사용합니다.

    gcloud compute vpn-tunnels delete \
        TUNNEL_NAME_GW1_IF0 \
        TUNNEL_NAME_GW1_IF1 \
        TUNNEL_NAME_GW2_IF0 \
        TUNNEL_NAME_GW2_IF1 \
        --region=REGION
    
  6. 두 개의 Cloud Router를 삭제합니다. Cloud Router 만들기에서 지정한 것과 동일한 이름을 사용합니다.

    gcloud compute routers delete \
        ROUTER_NAME_1 \
        ROUTER_NAME_2 \
        --region=REGION
    
  7. 2개의 VPN 게이트웨이를 삭제합니다. HA VPN 게이트웨이 만들기에서 지정한 것과 동일한 이름을 사용합니다.

    gcloud compute vpn-gateways delete \
        GW_NAME_1 \
        GW_NAME_2 \
        --region=REGION
    
  8. GKE 클러스터 노드를 호스팅하는 서브네트워크인 GKE_SUBNET_NAME을 삭제합니다.

    gcloud compute networks subnets delete GKE_SUBNET_NAME \
        --region=REGION
    
  9. 두 VPC 네트워크 PRIVATE_POOL_VPC_NAMEGKE_VPC_NAME을 삭제합니다.

    gcloud compute networks delete \
        PRIVATE_POOL_VPC_NAME \
        GKE_VPC_NAME
    

다음 단계