자동 DNS 구성을 사용하는 Private Service Connect

1. 소개

자동 DNS 구성이 포함된 Private Service Connect는 서비스 디렉터리 및 Cloud DNS를 사용하여 소비자 Private Service Connect 엔드포인트 IP 주소로 프로그래밍된 DNS 레코드를 자동으로 만듭니다.

빌드할 항목

이 Codelab에서는 그림 1과 같이 자동 DNS의 사용을 보여주는 포괄적인 Private Service Connect 아키텍처를 빌드합니다.

자동 DNS는 다음을 통해 가능합니다.

  1. 생산자 서비스 연결은 소유한 공개 도메인에 ‘– 도메인 이름’을 제공하여 자동 DNS를 시작합니다. Private Service Connect 서비스 연결을 만들 때 플래그를 지정합니다.
  2. 소비자는 엔드포인트 이름을 정의합니다.
  3. 자동 DNS는 소비자 엔드포인트 이름으로 구성된 서비스 디렉터리 항목 외에도 DNS 영역 goog-psc-default-us-central1 및 DNS 이름 cosmopup.net을 모두 만듭니다.

자동 DNS의 이점은 (4)에 설명되어 있습니다. 여기서 최종 사용자가 DNS, FQDN stargazer.cosmopup.net을 통해 소비자 엔드포인트와 통신할 수 있습니다.

그림 1

5e26a358454d1336.png

학습할 내용

  • 내부 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. Producer 설정

생산자 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 address describe 명령어를 사용하여 할당된 IP 주소 보기

gcloud compute addresses describe lb-ip  --region=us-central1 | grep address:

리전 프록시 서브넷 만들기

프록시 할당은 부하 분산기 수준이 아닌 VPC 네트워크 수준에서 이루어집니다. Envoy 기반 부하 분산기를 사용하는 가상 네트워크 (VPC)의 각 리전에 프록시 전용 서브넷 을 하나씩 만들어야 합니다. 동일한 리전 및 동일한 VPC 네트워크에 여러 부하 분산기를 배포하는 경우 부하 분산을 위해 동일한 프록시 전용 서브넷을 공유합니다.

  1. 클라이언트가 부하 분산기 전달 규칙의 IP 주소와 포트에 연결합니다.
  2. 각 프록시는 해당 부하 분산기의 전달 규칙에서 지정한 IP 주소와 포트를 리슨합니다. 프록시 중 하나에서 클라이언트의 네트워크 연결을 수신하고 종료합니다.
  3. 프록시는 부하 분산기의 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 내에서 Google Cloud 상태 점검이 TCP 포트 80의 프로듀서 서비스 (백엔드 서비스)에 도달할 수 있도록 fw-allow-health-check 방화벽 규칙을 만듭니다.

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 구성

Cloud NAT는 Codelab에서 소프트웨어 패키지 설치를 위해 사용됩니다. VM 인스턴스에 외부 IP 주소가 없기 때문입니다.

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 콘솔에서 네트워크 서비스 → 부하 분산 → 부하 분산기로 이동합니다. 백엔드 서비스에 대한 성공적인 상태 점검을 기록합니다.

881567cc11627009.png

'l7-ilb-map'을 선택하면 이전 단계에서 grep한 IP 주소와 일치하는 프런트엔드 IP 주소가 생성되며 백엔드 서비스를 식별합니다.

bab89b0a7b4f95e9.png

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.

Network Services → Private Service Connect로 이동하여 새로 설정된 서비스 연결을 확인합니다.

d27fee9073dbbe2.png

published-service를 선택하면 소비자가 Private Service Connection을 설정하는 데 사용하는 서비스 연결 URI와 도메인 이름을 입력합니다.

503df63730c62df2.png

서비스 연결 세부정보:

projects/<프로젝트 이름>/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 주소를 기록해 둡니다.

c60812433c3e1676.png

psc-consumer-1을 선택할 때 서비스 연결 URI를 포함한 세부정보가 제공됩니다.

14d3e3b1e0aee3c2.png

8. 제작자의 VPC 네트워크에서 연결 검증

제작자의 VPC 네트워크에서 네트워크 서비스 → Private Service Connect→게시된 서비스로 이동하여 성공한 비공개 서비스 연결을 확인합니다. 이제 게시된 서비스 연결이 전달 규칙 1개 (연결 엔드포인트)를 나타냅니다.

911dbd7421bcfd3a.png

9. 자동 DNS 구성의 유효성 검사

DNS와 서비스 디렉터리 구성을 평가해 보겠습니다.

Cloud DNS 구성

네트워크 서비스 → Cloud DNS → 영역으로 이동합니다. 영역 goog-psc-default-us-central & DNS 이름 cosmopup.net.이 자동으로 생성됩니다.

4395e7b33fc42faa.png

DNS 및 서비스 디렉터리 구성 보기

영역 이름을 선택하면 서비스 디렉터리가 Cloud DNS와 어떻게 통합되는지 확인할 수 있습니다.

e4fe44d945b20451.png

서비스 디렉터리 구성

네트워크 서비스 → 서비스 디렉터리로 이동합니다.

소비자 엔드포인트 이름 ‘stargazer’를 기억하시나요? 서비스 디렉터리에서 자동으로 프로그래밍되어 FQDN stargazer.goog-psc-default–us-central1을 사용하여 소비자 엔드포인트에 연결할 수 있습니다.

602deab65b5ac315.png

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 네트워크에서 소비자 엔드포인트를 만드는 방법을 알아봤습니다.

Cosmopup은 Codelab이 멋지다고 생각합니다.

8c2a10eb841f7b01.jpeg

다음 단계

다음 Codelab을 확인하세요.

추가 자료 및 동영상

참조 문서