이 튜토리얼에서는 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 소유 프로젝트에서도 실행되며 Private Service Connect(PSC)를 사용하여 VPC 네트워크에 연결됩니다. VPC 네트워크 피어링은 전환 피어링을 지원하지 않으므로 Cloud Build 비공개 풀과 GKE 클러스터 제어 영역 간에 패킷을 직접 라우팅할 수 없습니다.
Cloud Build 작업자 인스턴스가 GKE 클러스터 제어 영역에 액세스할 수 있도록 비공개 풀을 피어링하고 PSC를 사용하여 GKE 클러스터 제어 영역을 사용자가 소유한 두 VPC 네트워크에 연결한 다음 Cloud VPN을 사용하여 이 두 VPC 네트워크를 연결합니다. 이 피어링 및 연결을 통해 VPC 터널의 각 측이 비공개 풀 및 GKE 클러스터 제어 영역 네트워크를 공지하여 라우팅을 완료합니다.
다음 아키텍처 다이어그램은 이 튜토리얼에서 사용되는 리소스를 보여줍니다.
짧은 지연 시간을 위해 이 튜토리얼에 사용된 모든 리소스를 동일한 Google Cloud 리전에 만드는 것이 좋습니다. 자체 구현 시 이 리전 간 통신이 필요한 경우 VPN 터널은 서로 다른 두 리전을 통과할 수 있습니다. 소유하고 있는 두 VPC 네트워크도 서로 다른 프로젝트에 속할 수 있습니다.
목표
- 비공개 GKE 클러스터를 만듭니다.
- Cloud Build 비공개 풀을 설정합니다.
- 두 VPC 네트워크 간에 HA VPN 연결을 만듭니다.
- 두 개의 VPC 네트워크 피어링과 VPC 연결을 통해 패킷 라우팅을 사용 설정합니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Enable the Cloud Build, Google Kubernetes Engine, and Service Networking APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
내 프로젝트에 VPC 네트워크 2개 만들기
이 섹션에서는 두 개의 VPC 네트워크와 GKE 클러스터 노드용 서브넷을 만듭니다.
Cloud Shell에서 첫 번째 VPC 네트워크(앞의 다이어그램에서 '비공개 풀 피어링 VPC 네트워크')를 만듭니다. 이 네트워크에 서브넷을 만들 필요는 없습니다.
gcloud compute networks create PRIVATE_POOL_PEERING_VPC_NAME \ --subnet-mode=CUSTOM
PRIVATE_POOL_PEERING_VPC_NAME을 Cloud Build 비공개 풀 네트워크와 피어링할 VPC 네트워크의 이름으로 바꿉니다.
두 번째 VPC 네트워크(앞의 다이어그램에서 'GKE 클러스터 VPC 네트워크')를 만듭니다.
gcloud compute networks create GKE_CLUSTER_VPC_NAME \ --subnet-mode=CUSTOM
GKE_CLUSTER_VPC_NAME을 GKE 클러스터 제어 영역과 피어링할 VPC 네트워크의 이름으로 바꿉니다.
GKE 클러스터 노드용 서브넷을 만듭니다.
gcloud compute networks subnets create GKE_SUBNET_NAME \ --network=GKE_CLUSTER_VPC_NAME \ --range=GKE_SUBNET_RANGE \ --region=REGION
다음을 바꿉니다.
- GKE_SUBNET_NAME: GKE 클러스터 노드를 호스팅할 서브네트워크의 이름입니다.
- GKE_CLUSTER_VPC_NAME: GKE 클러스터 제어 영역과 연결할 VPC 네트워크의 이름입니다.
- GKE_SUBNET_RANGE: GKE_SUBNET_NAME의 IP 주소 범위입니다. 이 튜토리얼에서는
10.244.252.0/22
를 사용할 수 있습니다. - REGION: GKE 클러스터를 호스팅하는 Google Cloud 리전입니다. 이 튜토리얼에서는
us-central1
를 사용할 수 있습니다.
이제 프로젝트에 VPC 네트워크 두 개를 설정했으며 다른 네트워크와 피어링할 준비가 되었습니다.
비공개 GKE 클러스터 만들기
이 섹션에서는 비공개 GKE 클러스터를 만듭니다.
Cloud Shell에서 클라이언트가 제어 영역의 공개 엔드포인트에 액세스할 수 없는 GKE 클러스터를 만듭니다.
gcloud container clusters create PRIVATE_CLUSTER_NAME \ --region=REGION \ --enable-master-authorized-networks \ --network=GKE_CLUSTER_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 클러스터의 이름입니다.
- REGION: GKE 클러스터의 리전입니다. 이 튜토리얼에서는 VPC 네트워크에 사용한 것과 동일한 리전으로
us-central1
을 사용합니다. - GKE_CLUSTER_VPC_NAME: GKE 클러스터 제어 영역에 연결할 VPC 네트워크의 이름입니다.
- GKE_SUBNET_RANGE: GKE_SUBNET_NAME의 IP 주소 범위입니다. 이 튜토리얼에서는
10.244.252.0/22
를 사용할 수 있습니다. CLUSTER_CONTROL_PLANE_CIDR: GKE 클러스터 제어 영역의 IP 주소 범위입니다.
/28
프리픽스가 있어야 합니다. 이 튜토리얼에서는172.16.0.32/28
을 사용합니다.
이제 비공개 GKE 클러스터를 만들었습니다.
GKE 1.28 이하용 VPC 네트워크 피어링 구성
이 튜토리얼을 사용하여 GKE 버전 1.28 이하를 실행하는 기존 클러스터를 구성하는 경우 비공개 VPC 네트워크는 VPC 네트워크 피어링을 사용하여 GKE 클러스터에 연결합니다. 다음 단계를 완료하세요.
GKE 클러스터의 VPC 네트워크 피어링 이름을 검색합니다. 이 VPC 네트워크 피어링은 GKE 클러스터를 만들 때 자동으로 생성되었습니다.
export GKE_PEERING_NAME=$(gcloud container clusters describe PRIVATE_CLUSTER_NAME \ --region=REGION \ --format='value(privateClusterConfig.peeringName)')
다음을 바꿉니다.
- PRIVATE_CLUSTER_NAME: 비공개 GKE 클러스터의 이름입니다.
- REGION: GKE 클러스터의 리전입니다. 이 튜토리얼에서는 VPC 네트워크에 사용한 것과 동일한 리전으로
us-central1
을 사용합니다.
커스텀 경로 내보내기를 사용 설정하여 비공개 풀 네트워크를 GKE 클러스터 제어 영역에 공지합니다.
gcloud compute networks peerings update $GKE_PEERING_NAME \ --network=GKE_CLUSTER_VPC_NAME \ --export-custom-routes \ --no-export-subnet-routes-with-public-ip
GKE_CLUSTER_VPC_NAME을 GKE 클러스터 제어 영역과 연결할 VPC 네트워크의 이름으로 바꿉니다.
커스텀 경로에 대한 자세한 내용은 커스텀 경로 가져오기 및 내보내기를 참조하세요.
Cloud Build 비공개 풀 만들기
이 섹션에서는 Cloud Build 비공개 풀을 만듭니다.
Cloud Shell에서 Cloud Build 비공개 풀의 PRIVATE_POOL_PEERING_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_PEERING_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
를 사용합니다. 이 튜토리얼에서는20
을 사용하여 풀을 최대 16개까지 만들 수 있습니다. - PRIVATE_POOL_PEERING_VPC_NAME: Cloud Build 비공개 풀 네트워크와 피어링할 VPC 네트워크의 이름입니다.
--purpose
가VPC_PEERING
인 경우 명명된 IP 주소 범위는global
이어야 하므로 IP 범위는global
입니다.
Cloud Build 비공개 풀이 포함된 VPC 네트워크와 PRIVATE_POOL_PEERING_VPC_NAME 간에 비공개 연결을 만듭니다.
gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=RESERVED_RANGE_NAME \ --network=PRIVATE_POOL_PEERING_VPC_NAME
다음을 바꿉니다.
- RESERVED_RANGE_NAME: Cloud Build 비공개 풀을 호스팅하는 비공개 IP 주소 범위의 이름입니다.
- PRIVATE_POOL_PEERING_VPC_NAME: Cloud Build 비공개 풀 네트워크와 피어링할 VPC 네트워크의 이름입니다.
GKE 클러스터 제어 영역 네트워크를 비공개 풀에 공지하려면 커스텀 경로 내보내기를 사용 설정합니다.
gcloud compute networks peerings update servicenetworking-googleapis-com \ --network=PRIVATE_POOL_PEERING_VPC_NAME \ --export-custom-routes \ --no-export-subnet-routes-with-public-ip
PRIVATE_POOL_PEERING_VPC_NAME을 Cloud Build 비공개 풀 네트워크와 피어링할 VPC 네트워크의 이름으로 바꿉니다.
PRIVATE_POOL_PEERING_VPC_NAME과 피어링된 Cloud Build 비공개 풀을 만듭니다.
gcloud builds worker-pools create PRIVATE_POOL_NAME \ --region=REGION \ --peered-network=projects/$GOOGLE_CLOUD_PROJECT/global/networks/PRIVATE_POOL_PEERING_VPC_NAME
다음을 바꿉니다.
- PRIVATE_POOL_NAME: Cloud Build 비공개 풀의 이름입니다.
- REGION: GKE 클러스터의 리전입니다. 이 튜토리얼에서는 VPC 네트워크에 사용한 것과 동일한 리전으로
us-central1
을 사용합니다.
이제 Cloud Build 비공개 풀을 만들고 자체 프로젝트의 VPC 네트워크와 피어링했습니다.
두 VPC 네트워크 사이에 Cloud VPN 연결 만들기
자체 프로젝트에는 이제 Cloud Build 비공개 풀과 피어링된 VPC 네트워크와 비공개 GKE 클러스터와 피어링된 두 번째 VPC 네트워크가 있습니다.
이 섹션에서는 프로젝트의 두 VPC 네트워크 간에 Cloud VPN 연결을 만듭니다. 이 연결은 라우팅을 완료하고 Cloud Build 비공개 풀이 GKE 클러스터에 액세스할 수 있도록 합니다.
Cloud Shell에서 서로 연결되는 HA VPN 게이트웨이 두 개를 만듭니다. 이러한 게이트웨이를 만들려면 서로 연결되는 완전히 구성된 HA VPN 게이트웨이 2개 만들기의 안내를 따르세요. BGP 세션을 만들면 설정이 완료됩니다. 이 안내를 따르는 동안 다음 값을 사용합니다.
NETWORK_1
의 PRIVATE_POOL_PEERING_VPC_NAMENETWORK_2
의 GKE_CLUSTER_VPC_NAMEREGION_1
및REGION_2
의 REGION
비공개 풀 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 액세스를 사용 설정합니다.
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_CLUSTER_NAME: 비공개 GKE 클러스터의 이름입니다.
- REGION: GKE 클러스터의 리전입니다. 이 튜토리얼에서는 VPC 네트워크에 사용한 것과 동일한 리전으로
us-central1
을 사용합니다. - PRIVATE_POOL_NETWORK: RESERVED_RANGE_NAME의 첫 번째 IP 주소입니다. 이 튜토리얼에서는
192.168.0.0
을 사용할 수 있습니다. - PRIVATE_POOL_PREFIX: RESERVED_RANGE_NAME의 프리픽스입니다. 생성된 각 비공개 풀은 이 범위의
/24
를 사용합니다. 이 튜토리얼에서는20
을 사용하여 풀을 최대 16개까지 만들 수 있습니다.
빌드에 사용 중인 서비스 계정에서 GKE 클러스터 제어 영역에 액세스하도록 허용합니다.
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format 'value(projectNumber)') gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member=serviceAccount:SERVICE_ACCOUNT \ --role=roles/container.developer
이제 Cloud Build 비공개 풀이 GKE 클러스터 제어 영역에 액세스할 수 있습니다.
솔루션 확인
이 섹션에서는 비공개 풀에서 실행되는 빌드 단계에서 kubectl get nodes
명령어를 실행하여 솔루션이 작동하는지 확인합니다.
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
다음을 바꿉니다.
- REGION: GKE 클러스터의 리전입니다. 이 튜토리얼에서는 VPC 네트워크에 사용한 것과 동일한 리전으로
us-central1
을 사용합니다. - PRIVATE_CLUSTER_NAME: 비공개 GKE 클러스터의 이름입니다.
- PRIVATE_POOL_NAME: Cloud Build 비공개 풀의 이름입니다.
- REGION: GKE 클러스터의 리전입니다. 이 튜토리얼에서는 VPC 네트워크에 사용한 것과 동일한 리전으로
빌드 작업을 시작합니다.
gcloud builds submit --config=cloudbuild.yaml
출력이 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 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
개별 리소스 삭제
Cloud Shell에서 GKE 클러스터를 삭제합니다.
gcloud container clusters delete PRIVATE_CLUSTER_NAME \ --region=REGION \ --async
이 명령어를 실행하면 VPC 네트워크 피어링이 자동으로 삭제됩니다.
Cloud Build 비공개 풀을 삭제합니다.
gcloud builds worker-pools delete PRIVATE_POOL_NAME \ --region=REGION
서비스 제작자 VPC 네트워크 및 PRIVATE_POOL_PEERING_VPC_NAME 사이의 비공개 연결을 삭제합니다.
gcloud services vpc-peerings delete \ --network=PRIVATE_POOL_PEERING_VPC_NAME \ --async
비공개 풀에 사용되는 명명된 IP 주소 범위를 삭제합니다.
gcloud compute addresses delete RESERVED_RANGE_NAME \ --global
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
두 개의 Cloud Router를 삭제합니다. Cloud Router 만들기에서 지정한 것과 동일한 이름을 사용합니다.
gcloud compute routers delete \ ROUTER_NAME_1 \ ROUTER_NAME_2 \ --region=REGION
2개의 VPN 게이트웨이를 삭제합니다. HA VPN 게이트웨이 만들기에서 지정한 것과 동일한 이름을 사용합니다.
gcloud compute vpn-gateways delete \ GW_NAME_1 \ GW_NAME_2 \ --region=REGION
GKE 클러스터 노드를 호스팅하는 서브네트워크인 GKE_SUBNET_NAME을 삭제합니다.
gcloud compute networks subnets delete GKE_SUBNET_NAME \ --region=REGION
두 VPC 네트워크 PRIVATE_POOL_PEERING_VPC_NAME과 GKE_CLUSTER_VPC_NAME을 삭제합니다.
gcloud compute networks delete \ PRIVATE_POOL_PEERING_VPC_NAME \ GKE_CLUSTER_VPC_NAME
다음 단계
- 비공개 풀에서 빌드를 실행하는 방법을 알아보세요.
- 제어 영역에 대한 액세스 권한이 있는 비공개 GKE 클러스터 내에서 프록시를 실행합니다.
- Cloud Build에서 GKE에 배포하는 방법을 알아봅니다.
- 다른 Google Cloud 기능을 직접 사용해보세요. 가이드를 참조하세요.