1. 소개
자동 DNS 구성이 적용된 Private Service Connect는 서비스 디렉터리 및 Cloud DNS를 사용하여 소비자 Private Service Connect 엔드포인트 IP 주소로 프로그래밍된 DNS 레코드를 자동으로 만듭니다.
빌드할 항목
이 Codelab에서는 그림 1과 같이 자동 DNS 사용을 보여주는 포괄적인 Private Service Connect 아키텍처를 빌드합니다.
자동 DNS는 다음을 통해 가능합니다.
- 프로듀서 서비스 연결은 Private Service Connect 서비스 연결을 만들 때 소유한 공개 도메인에 '– domain-names' 플래그를 제공하여 자동 DNS를 만듭니다.
- 소비자가 엔드포인트 이름을 정의합니다.
- 자동 DNS는 소비자 엔드포인트 이름으로 구성된 서비스 디렉터리 항목 외에도 DNS 영역 goog-psc-default-us-central1 및 DNS 이름 cosmopup.net을 모두 만듭니다.
자동 DNS의 이점은 (4)에서 확인할 수 있습니다. 여기서 최종 사용자는 DNS, FQDN stargazer.cosmopup.net을 통해 소비자 엔드포인트와 통신할 수 있습니다.
그림 1
학습할 내용
- 내부 HTTP(S) 부하 분산기를 만드는 방법
- 자동 DNS를 사용하여 서비스 연결을 만드는 방법
- Private Service Connect 프로듀서 서비스를 설정하는 방법
- 자동 DNS를 사용하여 소비자 엔드포인트에 액세스하는 방법
필요한 항목
- Google Cloud 프로젝트
- 소유한 공개 도메인
2. 시작하기 전에
Codelab을 지원하도록 프로젝트 업데이트
이 Codelab에서는 $variables를 사용하여 Cloud Shell에서 gcloud 구성을 구현합니다.
Cloud Shell에서 다음을 실행합니다.
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectname=YOUR-PROJECT-NAME
echo $projectname
3. 프로듀서 설정
프로듀서 VPC 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create producer-vpc --project=$projectname --subnet-mode=custom
프로듀서 서브넷 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create gce-subnet --project=$projectname --range=172.16.20.0/28 --network=producer-vpc --region=us-central1
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create load-balancer-subnet --project=$projectname --range=172.16.10.0/28 --network=producer-vpc --region=us-central1
내부 부하 분산기의 IP 주소 예약
Cloud Shell에서 다음을 실행합니다.
gcloud compute addresses create lb-ip \
--region=us-central1 \
--subnet=load-balancer-subnet \
--purpose=GCE_ENDPOINT
할당된 IP 주소 보기
compute addresses describe 명령어를 사용하여 할당된 IP 주소를 확인합니다.
gcloud compute addresses describe lb-ip --region=us-central1 | grep address:
지역 프록시 서브넷 만들기
프록시는 부하 분산기 수준이 아닌 VPC 네트워크 수준에서 할당됩니다. Envoy 기반 부하 분산기를 사용하는 가상 네트워크 (VPC)의 리전마다 프록시 전용 서브넷 하나를 만들어야 합니다. 동일한 리전과 동일한 VPC 네트워크에 있는 부하 분산기 여러 개를 배포하면 배포된 부하 분산기는 동일한 부하 분산용 프록시 전용 서브넷을 공유합니다.
- 클라이언트는 부하 분산기 전달 규칙의 IP 주소와 포트에 연결됩니다.
- 각 프록시는 해당 부하 분산기의 전달 규칙에서 지정한 IP 주소와 포트를 리슨합니다. 프록시 중 하나에서 클라이언트의 네트워크 연결을 수신하고 종료합니다.
- 프록시는 부하 분산기의 URL 맵과 백엔드 서비스에서 지정한 대로 적절한 백엔드 VM에 대한 연결을 설정합니다.
VPC 네트워크가 자동 모드인지 또는 커스텀 모드인지 여부에 관계없이 프록시 전용 서브넷을 만들어야 합니다. 프록시 전용 서브넷에서 IP 주소를 64개 이상 제공해야 합니다. 이는 /26 이하의 프리픽스 길이에 해당합니다. 권장 서브넷 크기는 /23 (프록시 전용 주소 512개)입니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create proxy-subnet-us-central \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=us-central1 \
--network=producer-vpc \
--range=172.16.0.0/23
Private Service Connect NAT 서브넷 만들기
Private Service Connect에서 사용할 전용 서브넷을 하나 이상 만듭니다. Google Cloud 콘솔을 사용하여 서비스를 게시하는 경우 해당 절차 중에 서브넷을 만들 수 있습니다. 서비스의 부하 분산기와 동일한 리전에 서브넷을 만듭니다. 일반 서브넷을 Private Service Connect 서브넷으로 변환할 수 없습니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks subnets create psc-nat-subnet \
--project $projectname \
--network producer-vpc \
--region us-central1 \
--range 100.100.10.0/24 \
--purpose PRIVATE_SERVICE_CONNECT
생산자 방화벽 규칙 만들기
Private Service Connect NAT 서브넷과 ILB 프록시 전용 서브넷 간의 트래픽을 허용하도록 방화벽 규칙을 구성합니다.
Cloud Shell에서 다음을 실행합니다.
gcloud compute --project=$projectname firewall-rules create allow-to-ingress-nat-subnet --direction=INGRESS --priority=1000 --network=producer-vpc --action=ALLOW --rules=all --source-ranges=100.100.10.0/24
Cloud Shell에서 fw-allow-health-check 방화벽 규칙을 만들어 Google Cloud 상태 점검이 TCP 포트 80의 프로듀서 서비스 (백엔드 서비스)에 도달하도록 합니다.
gcloud compute firewall-rules create fw-allow-health-check \
--network=producer-vpc \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--rules=tcp:80
프록시 전용 서브넷에 대한 인그레스 허용 방화벽 규칙을 만들어 부하 분산기가 TCP 포트 80에서 백엔드 인스턴스와 통신할 수 있도록 합니다.
gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
--network=producer-vpc \
--action=allow \
--direction=ingress \
--source-ranges=172.16.0.0/23 \
--rules=tcp:80
Cloud Router 및 NAT 구성
VM 인스턴스에 외부 IP 주소가 없으므로 이 Codelab에서는 소프트웨어 패키지 설치에 Cloud NAT를 사용합니다.
Cloud Shell에서 Cloud Router를 만듭니다.
gcloud compute routers create cloud-router-for-nat --network producer-vpc --region us-central1
Cloud Shell에서 NAT 게이트웨이를 만듭니다.
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
인스턴스 그룹 구성
다음 섹션에서는 Compute Engine 인스턴스 및 비관리형 인스턴스 그룹을 만듭니다. 이후 단계에서 인스턴스 그룹이 부하 분산기 백엔드 서비스로 사용됩니다.
Cloud Shell 내에서 제작자 서비스에 전달된 지역 상태 점검을 만듭니다.
gcloud compute instances create app-server-1 \
--project=$projectname \
--machine-type=e2-micro \
--image-family debian-10 \
--no-address \
--image-project debian-cloud \
--zone us-central1-a \
--subnet=gce-subnet \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo 'Welcome to App-Server-1 !!' | tee /var/www/html/index.html
EOF"
Cloud Shell에서 비관리형 인스턴스 그룹을 만듭니다.
gcloud compute instance-groups unmanaged create psc-instance-group --zone=us-central1-a
gcloud compute instance-groups unmanaged set-named-ports psc-instance-group --project=$projectname --zone=us-central1-a --named-ports=http:80
gcloud compute instance-groups unmanaged add-instances psc-instance-group --zone=us-central1-a --instances=app-server-1
부하 분산기 구성
다음 단계에서는 나중에 서비스 첨부파일로 게시될 내부 HTTP 부하 분산기 를 구성합니다.
Cloud Shell에서 지역 상태 확인을 만듭니다.
gcloud compute health-checks create http http-health-check \
--region=us-central1 \
--use-serving-port
Cloud Shell에서 백엔드 서비스를 만듭니다.
gcloud compute backend-services create l7-ilb-backend-service \
--load-balancing-scheme=INTERNAL_MANAGED \
--protocol=HTTP \
--health-checks=http-health-check \
--health-checks-region=us-central1 \
--region=us-central1
Cloud Shell에서 백엔드 서비스에 백엔드를 추가합니다.
gcloud compute backend-services add-backend l7-ilb-backend-service \
--balancing-mode=UTILIZATION \
--instance-group=psc-instance-group \
--instance-group-zone=us-central1-a \
--region=us-central1
Cloud Shell에서 수신되는 요청을 백엔드 서비스로 라우팅하는 URL 맵을 만듭니다.
gcloud compute url-maps create l7-ilb-map \
--default-service l7-ilb-backend-service \
--region=us-central1
HTTP 대상 프록시를 만듭니다.
gcloud compute target-http-proxies create l7-ilb-proxy\
--url-map=l7-ilb-map \
--url-map-region=us-central1 \
--region=us-central1
수신되는 요청을 프록시로 라우팅하는 전달 규칙을 만듭니다. 프록시 전용 서브넷을 사용하여 전달 규칙을 만들지 마세요.
gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
--load-balancing-scheme=INTERNAL_MANAGED \
--network=producer-vpc \
--subnet=load-balancer-subnet \
--address=lb-ip \
--ports=80 \
--region=us-central1 \
--target-http-proxy=l7-ilb-proxy \
--target-http-proxy-region=us-central1
4. 부하 분산기 유효성 검사
Cloud 콘솔에서 네트워크 서비스 → 부하 분산 → 부하 분산기로 이동합니다. 백엔드 서비스에 상태 점검 성공을 기록합니다.
'l7-ilb-map'을 선택하면 프런트엔드 IP 주소가 표시되며, 이 주소는 이전 단계에서 grep한 IP 주소와 일치해야 하며 백엔드 서비스를 식별합니다.
5. Private Service Connect 서비스 연결 만들기
서비스 연결 만들기
Cloud Shell 내에서 서비스 연결을 만듭니다. 도메인 이름 끝에 '.'을 추가해야 합니다.
gcloud compute service-attachments create published-service --region=us-central1 --producer-forwarding-rule=l7-ilb-forwarding-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet --domain-names=cosmopup.net.
선택사항: 공유 VPC를 사용하는 경우 서비스 프로젝트에서 서비스 연결을 만듭니다.
gcloud compute service-attachments create published-service --region=us-central1 --producer-forwarding-rule=l7-ilb-forwarding-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/us-central1/subnetworks/psc-nat-subnet --domain-names=cosmopup.net.
네트워크 서비스 → Private Service Connect로 이동하여 새로 설정된 서비스 연결을 확인합니다.
published-service를 선택하면 소비자가 Private Service Connection을 설정하는 데 사용하는 서비스 연결 URI와 도메인 이름을 비롯한 세부정보가 더 많이 표시됩니다.
서비스 연결 세부정보:
projects/<project name>/regions/us-central1/serviceAttachments/published-service
6. 소비자 설정
소비자 API 사용 설정
Cloud Shell에서 다음을 실행합니다.
gcloud services enable dns.googleapis.com
gcloud services enable servicedirectory.googleapis.com
소비자 VPC 네트워크 만들기
Cloud Shell에서 다음을 실행합니다.
gcloud compute networks create consumer-vpc --project=$projectname --subnet-mode=custom
소비자 서브넷 만들기
Cloud Shell에서 테스트 인스턴스의 서브넷을 만듭니다.
gcloud compute networks subnets create db1-subnet --project=$projectname --range=10.20.0.0/28 --network=consumer-vpc --region=us-central1
Cloud Shell에서 소비자 엔드포인트의 서브넷을 만듭니다.
gcloud compute networks subnets create consumer-ep-subnet --project=$projectname --range=10.10.0.0/28 --network=consumer-vpc --region=us-central1
소비자 엔드포인트 (전달 규칙) 만들기
Cloud Shell에서 소비자 엔드포인트에 사용할 고정 IP 주소를 만듭니다.
gcloud compute addresses create psc-consumer-ip-1 --region=us-central1 --subnet=consumer-ep-subnet --addresses 10.10.0.10
이전에 생성된 서비스 연결 URI를 사용하여 소비자 엔드포인트를 만듭니다.
Cloud Shell에서 소비자 엔드포인트를 만듭니다.
gcloud compute forwarding-rules create stargazer --region=us-central1 --network=consumer-vpc --address=psc-consumer-ip-1 --target-service-attachment=projects/$projectname/regions/us-central1/serviceAttachments/published-service
7. 소비자의 VPC 네트워크에서 연결 확인
소비자 VPC 네트워크에서 네트워크 서비스 → Private Service Connect → 연결된 엔드포인트로 이동하여 비공개 서비스 연결이 성공적으로 이루어졌는지 확인합니다. 이전에 만든 Stargazer 연결과 해당 IP 주소를 확인합니다.
psc-consumer-1을 선택하면 서비스 연결 URI를 비롯한 세부정보가 제공됩니다.
8. 프로듀서의 VPC 네트워크에서 연결을 확인합니다.
프로듀서의 VPC 네트워크에서 네트워크 서비스 → Private Service Connect(비공개 서비스 연결) → 게시된 서비스로 이동하여 비공개 서비스 연결이 성공적으로 이루어졌는지 확인합니다. 이제 게시된 서비스 연결에 전달 규칙 1개 (연결 엔드포인트)가 표시됩니다.
9. 자동 DNS 구성 유효성 검사
DNS 및 서비스 디렉터리 구성을 평가해 보겠습니다.
Cloud DNS 구성
네트워크 서비스 → Cloud DNS → 영역으로 이동합니다. 영역 goog-psc-default-us-central 및 DNS 이름 cosmopup.net이 자동으로 생성됩니다.
DNS 및 서비스 디렉터리 구성 보기
영역 이름을 선택하면 서비스 디렉터리가 Cloud DNS와 통합되는 방식을 확인할 수 있습니다.
서비스 디렉터리 구성
네트워크 서비스 → 서비스 디렉터리로 이동합니다.
소비자 엔드포인트 이름인 'stargazer'를 기억하시나요? 서비스 디렉터리에서 자동으로 프로그래밍되므로 FQDN stargazer.goog-psc-default–us-central1을 사용하여 소비자 엔드포인트에 도달할 수 있습니다.
10. 소비자가 제작자 서비스에 액세스할 수 있는지 확인
소비자의 VPC 네트워크에서 소비자 엔드포인트 stargazer.cosmopup.net에 액세스하여 게시된 서비스의 연결을 테스트할 VM을 만듭니다.
Cloud Shell 내에서 소비자 VPC에 테스트 인스턴스를 만듭니다.
gcloud compute instances create db1 \
--zone=us-central1-a \
--image-family=debian-10 \
--image-project=debian-cloud \
--subnet=db1-subnet \
--no-address
IAP가 VM 인스턴스에 연결하도록 하려면 다음과 같은 방화벽 규칙을 만드세요.
- IAP를 사용하여 액세스할 수 있도록 하려는 모든 VM 인스턴스에 적용됩니다.
- IP 범위 35.235.240.0/20에서 들어오는 인그레스 트래픽을 허용합니다. 이 범위에는 IAP가 TCP 전달에 사용하는 모든 IP 주소가 포함됩니다.
Cloud Shell에서 IAP 방화벽 규칙을 만듭니다.
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
Cloud Shell에서 IAP를 사용하여 consumer-vm에 로그인하여 curl을 실행하여 프로듀서 서비스에 대한 연결을 확인합니다. 시간 초과가 발생하면 다시 시도합니다.
gcloud compute ssh db1 --project=$projectname --zone=us-central1-a --tunnel-through-iap
프로듀서 서비스에 대한 연결을 확인하는 curl을 실행합니다. 확인되면 VM을 종료하고 Cloud Shell 프롬프트로 돌아갑니다.
Cloud Shell 내에서 커스텀 도메인(예: stargazer.[custom-domain.com].)에 대해 curl을 실행합니다. 아래 출력에서 stargazer.cosmopup.net에 대해 curl이 실행됩니다.
user@db1:~$ curl -v stargazer.cosmopup.net
* Trying 10.10.0.10...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55d3aa8190f0)
* Connected to stargazer.cosmopup.net (10.10.0.10) port 80 (#0)
> GET / HTTP/1.1
> Host: stargazer.cosmopup.net
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 200 OK
< date: Thu, 22 Dec 2022 00:16:25 GMT
< server: Apache/2.4.38 (Debian)
< last-modified: Wed, 21 Dec 2022 20:26:32 GMT
< etag: "1b-5f05c5e43a083"
< accept-ranges: bytes
< content-length: 27
< content-type: text/html
< via: 1.1 google
<
Welcome to App-Server-1 !!
VM을 종료하고 Cloud Shell 프롬프트로 돌아가서 정리 작업을 시작합니다.
11. 삭제
Cloud Shell에서 Codelab 구성요소를 삭제합니다.
gcloud compute forwarding-rules delete stargazer --region=us-central1 --quiet
gcloud compute instances delete db1 --zone=us-central1-a --quiet
gcloud compute addresses delete psc-consumer-ip-1 --region=us-central1 --quiet
gcloud compute networks subnets delete consumer-ep-subnet db1-subnet --region=us-central1 --quiet
gcloud compute firewall-rules delete ssh-iap-consumer --quiet
gcloud compute networks delete consumer-vpc --quiet
gcloud compute service-attachments delete published-service --region=us-central1 --quiet
gcloud compute forwarding-rules delete l7-ilb-forwarding-rule --region=us-central1 --quiet
gcloud compute target-http-proxies delete l7-ilb-proxy --region=us-central1 --quiet
gcloud compute url-maps delete l7-ilb-map --region=us-central1 --quiet
gcloud compute backend-services delete l7-ilb-backend-service --region=us-central1 --quiet
gcloud compute instance-groups unmanaged delete psc-instance-group --zone=us-central1-a --quiet
gcloud compute instances delete app-server-1 --zone=us-central1-a --quiet
gcloud compute firewall-rules delete allow-to-ingress-nat-subnet fw-allow-health-check fw-allow-proxy-only-subnet --quiet
gcloud compute addresses delete lb-ip --region=us-central1 --quiet
gcloud compute networks subnets delete gce-subnet load-balancer-subnet psc-nat-subnet proxy-subnet-us-central --region=us-central1 --quiet
gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet
gcloud compute networks delete producer-vpc --quiet
12. 축하합니다
자동 DNS 구성을 사용하여 Private Service Connect 엔드포인트를 구성하고 유효성을 검사했습니다.
제작자 인프라를 만들고 공개 도메인 등록이 포함된 서비스 연결을 추가했습니다. 자동 생성된 DNS를 사용하여 온프레미스 서비스에 연결할 수 있는 소비자 VPC 네트워크에서 소비자 엔드포인트를 만드는 방법을 알아봤습니다.
코스모퍼프는 Codelab이 멋지다고 생각합니다.
다음 단계
다음 Codelab을 확인하세요.
- Private Service Connect를 소비하여 GKE로 서비스 게시 및 사용
- Private Service Connect를 소비한 서비스 게시 및 사용
- Private Service Connect 및 내부 TCP 프록시 부하 분산기를 사용하여 하이브리드 네트워킹을 통해 온프레미스 서비스에 연결