PSC를 사용한 GCP L7 부하 분산기의 명시적 체이닝

1. 소개

Private Service Connect(PSC) 네트워크 엔드포인트 그룹(NEG)은 내부 HTTPS 부하 분산기를 외부 HTTPS 부하 분산기와 연결하는 기능을 지원합니다. 이렇게 하면 고객이 정의한 범위를 사용하여 온프레임에 분산 상태 점검 및 데이터 영역 트래픽을 제공할 수 있습니다. 또한 이 토폴로지에서는 여러 리전 InterConnect를 통해 온프렘에 연결되는 여러 VPC도 지원됩니다.

이 Codelab에서는 아래 토폴로지를 기반으로 이 엔드 투 엔드를 구성하는 방법을 보여줍니다. 왼쪽에서 오른쪽으로 온프레미스 고객은 HTTP 서비스를 시뮬레이션하고, 하이브리드 연결(HA-VPN 또는 Interconnect) 및 하이브리드 NEG를 활용하여 내부 HTTPS 부하 분산기를 통해 노출하는 VM을 보유하고 있습니다. PSC는 내부 HTTPS LB를 서비스 연결로 사용합니다. PSC NEG는 연결을 외부 HTTPS LB에 노출된 백엔드 서비스로 사용합니다. 인터넷 사용자는 Google 글로벌 네트워크를 사용하여 온프레미스 HTTP 서비스 액세스를 가속화할 수 있습니다.

e3f26d8497323a42.png

그림 1. Private Service Connect는 네트워크 엔드포인트 그룹 및 서비스 연결을 사용하여 외부 HTTPS 부하 분산기를 내부 HTTPS 부하 분산기에 연결하고 백엔드를 온프렘으로 확장합니다.

학습할 내용

  • 하이브리드 NEG 및 분산 상태 점검이 있는 내부 HTTPS 부하 분산기
  • 내부 HTTPS 부하 분산기가 있는 PSC 서비스 연결
  • PSC 네트워크 엔드포인트 그룹 설정
  • 외부 HTTPS 부하 분산기로 PSC NEG 노출

필요한 항목

  • HA-VPN과 같은 하이브리드 연결에 대한 지식
  • 내부/외부 HTTPS 부하 분산에 대한 지식
  • Private Service Connect에 대한 지식

2. 시작하기 전에

참고: Codelab에서는 그림과 같은 토폴로지를 기반으로 구성 및 유효성 검사 단계를 제공합니다. 조직의 요구사항을 충족하도록 필요에 따라 절차를 수정하세요. IAM 권한은 이 Codelab의 범위에 해당하지 않습니다.

Codelab에서는 하나의 프로젝트를 사용하여 전체 프로세스를 시뮬레이션합니다. 여러 프로젝트도 지원됩니다.

단일 프로젝트 - 제작자 및 소비자 네트워크를 지원하도록 프로젝트 업데이트

Cloud Shell 내에서 프로젝트 ID가 설정되어 있는지 확인합니다.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

3. 온프레미스 리소스 만들기

다음 섹션에서는 고객 온프레미스 서비스를 시뮬레이션하기 위해 온프레미스 VPC 및 VM을 설정합니다.

VPC 네트워크

Cloud Shell 사용

gcloud compute networks create vpc-demo-onprem --project=$prodproject --subnet-mode=custom

서브넷 만들기

Cloud Shell 사용

gcloud compute networks subnets create vpc-demo-onprem-asia-southeast1 --project=$prodproject --range=10.0.0.0/24 --network=vpc-demo-onprem --region=asia-southeast1

방화벽 규칙을 만듭니다.

내부 HTTPS 부하 분산기는 분산 상태 점검을 지원하므로 방화벽 규칙에서 프록시 서브넷 IP 범위만 허용하면 됩니다. 문서에 따라 프로젝트를 허용 목록에 추가합니다.

Cloud Shell에서 프록시 서브넷의 백엔드 상태 점검 및 데이터 영역 트래픽을 사용 설정하는 방화벽 규칙을 만듭니다.

gcloud compute firewall-rules create vpc-demo-health-checks --allow tcp:80,tcp:443 --network vpc-demo-onprem --source-ranges 10.0.3.0/24 --enable-logging

Cloud Shell에서 IAP가 VM 인스턴스에 연결할 수 있도록 방화벽 규칙을 만듭니다.

gcloud compute firewall-rules create psclab-iap-prod --network vpc-demo-onprem --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

4. 온프렘 VM 인스턴스 만들기

이 VM은 온프레미스 서비스를 시뮬레이션하며 하이브리드 NEG를 사용하여 내부 HTTPS 부하 분산기로 노출해야 합니다.

Cloud Shell에서 인스턴스 만들기 www01

gcloud compute instances create www01 \
    --zone=asia-southeast1-b \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=vpc-demo-onprem-asia-southeast1 \
    --shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring \
    --metadata=startup-script='#! /bin/bash
sudo apt-get update
sudo apt-get install nginx -y
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
filter="{print \$NF}"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone \
| awk -F/ "${filter}")"
echo "Page on $vm_hostname in $vm_zone" | \
tee /var/www/html/index.nginx-debian.html
sudo systemctl restart nginx'

다음 섹션에서는 letsencrypt를 사용하여 인증서를 생성하고 Nginx에 설치합니다. 다음 단계를 위해 공개 및 비공개 키 파일을 다운로드합니다. 인증서를 생성하려면 TCP 포트 80을 인터넷에 일시적으로 열어야 합니다.

이 VM에 공개적으로 확인된 도메인 이름이 있는지 확인하세요. 예를 들어 Cloud DNS에서 A 레코드 [www01.yinghli.demo.altostrat.com](http://www01.yinghli.demo.altostrat.com)를 추가하고 VM 공개 IP 주소를 가리킵니다.

gcloud dns --project=$prodproject record-sets create www01.yinghli.demo.altostrat.com. --zone="yinghli-demo" --type="A" --ttl="300" --rrdatas="34.87.77.186"

VM www01 콘솔에서 안내에 따라 Nginx에 인증서를 설치하고 다음 단계를 위해 fullchain.pem 및 private.pem의 사본을 만듭니다.

sudo apt install snapd
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx

5. 생산자 VPC 네트워크 만들기

참고: 하이브리드 네트워킹 구성은 이 구성에 포함되지 않습니다.

VPC 네트워크

Cloud Shell 사용

gcloud compute networks create vpc-demo-producer --project=$prodproject --subnet-mode=custom

서브넷 만들기

Cloud Shell 사용

gcloud compute networks subnets create vpc-demo-asia-southeast1 --project=$prodproject --range=10.0.2.0/24 --network=vpc-demo-producer --region=asia-southeast1

프록시 서브넷 만들기

Cloud Shell 사용

gcloud compute networks subnets create proxy-subnet-asia-southeast1 \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --region=asia-southeast1 \
  --network=vpc-demo-producer \
  --range=10.0.3.0/24

하이브리드 연결

Cloud VPN 문서에 따라 온프레미스 및 프로듀서 VPC 간에 HA-VPN 연결을 구현합니다. Cloud Router의 기본 구성을 유지합니다. BGP 공지에 130.211.0.0/22, 35.191.0.0/16을 추가할 필요가 없습니다.

6. 제작자 하이브리드 NEG 만들기

하이브리드 네트워크 엔드포인트 그룹을 만들고 온프렘 VM IP:PORT를 NEG에 추가합니다.

Cloud Shell 사용

gcloud compute network-endpoint-groups create on-prem-service-neg \
    --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
    --zone=asia-southeast1-b \
    --network=vpc-demo-producer

gcloud compute network-endpoint-groups update on-prem-service-neg \
    --zone=asia-southeast1-b \
    --add-endpoint="ip=10.0.0.2,port=443"

7. 프로듀서 내부 HTTPS 부하 분산기 만들기

현재 외부 HTTPS 부하 분산기는 PSC NEG에 대한 HTTPS 프로토콜만 지원합니다( 문서). 서비스를 게시할 때 내부 HTTPS 부하 분산기를 사용하고 전달 규칙 전역 액세스를 사용 설정해야 합니다.

Cloud Shell에서 지역 상태 확인을 만듭니다.

gcloud compute health-checks create https on-prem-service-hc \
    --region=asia-southeast1 \
    --use-serving-port

Cloud Shell에서 백엔드 서비스를 만들고 하이브리드 NEG를 추가합니다.

gcloud compute backend-services create on-premise-service-backend \
   --load-balancing-scheme=INTERNAL_MANAGED \
   --protocol=HTTPS \
   --region=asia-southeast1 \
   --health-checks=on-prem-service-hc \
   --health-checks-region=asia-southeast1

gcloud compute backend-services add-backend on-premise-service-backend \
   --network-endpoint-group=on-prem-service-neg \
   --network-endpoint-group-zone=asia-southeast1-b \
   --region=asia-southeast1 \
   --balancing-mode=RATE \
   --max-rate-per-endpoint=100

Cloud Shell에서 URL 맵 만들기

gcloud compute url-maps create on-premise-url \
    --default-service on-premise-service-backend \
    --region=asia-southeast1

Cloud Shell에서 리전별 SSL 인증서를 만듭니다. 두 개의 인증서 파일이 VM에서 다운로드됩니다.

gcloud compute ssl-certificates create www01 \
    --certificate=fullchain.pem \
    --private-key=private.pem \
    --region=asia-southeast1

Cloud Shell에서 https-target-proxy 만들기

gcloud compute target-https-proxies create on-premise-httpsproxy \
    --ssl-certificates=www01 \
    --url-map=on-premise-url \
    --url-map-region=asia-southeast1 \
    --region=asia-southeast1

Cloud Shell에서 내부 고정 IP를 예약하고 전달 규칙 만들기

gcloud compute addresses create ilbaddress \
  --region=asia-southeast1 \
  --subnet=vpc-demo-asia-southeast1  \
  --addresses=10.0.2.100 

gcloud compute forwarding-rules create https-ilb-psc \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=vpc-demo-producer \
      --subnet=vpc-demo-asia-southeast1  \
      --address=ilbaddress \
      --ports=443 \
      --region=asia-southeast1 \
      --target-https-proxy=on-premise-httpsproxy \
      --target-https-proxy-region=asia-southeast1
      --allow-global-access

8. 프로듀서 VM 인스턴스 만들기

확인을 위한 제작자 VM 만들기

Cloud Shell 사용

gcloud compute instances create test01 \
    --zone=asia-southeast1-b \
    --image-family=debian-11 \
    --image-project=debian-cloud \
    --network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=vpc-demo-asia-southeast1 \
    --shielded-secure-boot \
    --shielded-vtpm \
    --shielded-integrity-monitoring

IAP에서 VM 인스턴스에 연결할 수 있도록 허용하려면 다음과 같은 방화벽 규칙을 만듭니다.

Cloud Shell 사용

gcloud compute firewall-rules create psclab-iap-prod --network vpc-demo-producer --allow tcp:22 --source-ranges=35.235.240.0/20 --enable-logging

제작자 VM 콘솔에서 [www01.yinghli.demo.altostrat.com](https://www01.yinghli.demo.altostrat.com)에 액세스하고 내부 HTTPS 부하 분산기 IP 주소를 확인합니다. HTTP 200은 구성이 예상대로 작동했음을 나타냅니다.

curl -v --resolve www01.yinghli.demo.altostrat.com:443:10.0.2.100 https://www01.yinghli.demo.altostrat.com

* Added www01.yinghli.demo.altostrat.com:443:10.0.2.100 to DNS cache
* Hostname www01.yinghli.demo.altostrat.com was found in DNS cache
*   Trying 10.0.2.100:443...
* Connected to www01.yinghli.demo.altostrat.com (10.0.2.100) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=www01.yinghli.demo.altostrat.com
*  start date: Jun  4 10:36:43 2023 GMT
*  expire date: Sep  2 10:36:42 2023 GMT
*  subjectAltName: host "www01.yinghli.demo.altostrat.com" matched cert's "www01.yinghli.demo.altostrat.com"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55865ef982e0)
> GET / HTTP/2
> Host: www01.yinghli.demo.altostrat.com
> user-agent: curl/7.74.0
> accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200 
< server: nginx/1.18.0
< date: Mon, 05 Jun 2023 02:29:38 GMT
< content-type: text/html
< content-length: 35
< last-modified: Sun, 04 Jun 2023 09:02:16 GMT
< etag: "647c5318-23"
< accept-ranges: bytes
< via: 1.1 google
< 
Page on www01 in asia-southeast1-b
* Connection #0 to host www01.yinghli.demo.altostrat.com left intact

참고: 온프레미스 방화벽에서 프록시 서브넷 10.0.3.0/24만 액세스하도록 허용하므로 VM 10.0.0.2 HTTPS 서비스에 직접 액세스할 수 없습니다.

9. PSC NAT 서브넷 만들기

Cloud Shell 사용

gcloud compute networks subnets create psc-nat-subnet \
--network=vpc-demo-producer \
--region=asia-southeast1 \
--range=10.0.5.0/24 \
--purpose=private-service-connect

10. HTTPS 서비스 연결 만들기

Cloud Shell에서 HTTPS 서비스 연결 만들기

gcloud compute service-attachments create ilbserviceattach \
--region=asia-southeast1 \
--producer-forwarding-rule=https-ilb-psc \
--connection-preference=ACCEPT_AUTOMATIC \
--nat-subnets=psc-nat-subnet

HTTPS 서비스 연결 유효성 검사

gcloud compute service-attachments describe ilbserviceattach --region asia-southeast1

서비스 연결 이름을 기록합니다.

projects/<project>/regions/asia-southeast1/serviceAttachments/ilbserviceattach

11. 소비자 VPC 네트워크 만들기

다음 섹션에서는 소비자 VPC가 동일한 프로젝트에서 구성되지만 다른 프로젝트도 지원됩니다. 소비자 네트워크와 프로듀서 네트워크 간의 통신은 프로듀서 네트워크에 정의된 서비스 연결을 통해 이루어집니다.

VPC 네트워크

Cloud Shell 사용

gcloud compute networks create vpc-demo-consumer --project=$prodproject --subnet-mode=custom

서브넷 만들기

Cloud Shell 사용

gcloud compute networks subnets create consumer-subnet --project=$prodproject  --range=10.0.6.0/24 --network=vpc-demo-consumer --region=asia-southeast1

12. PSC 네트워크 엔드포인트 그룹 만들기

PSC NEG 만들기

이전 https 서비스 첨부파일 이름을 복사하여 매개변수 --psc-target-service에 붙여넣습니다.

Cloud Shell 사용

gcloud beta compute network-endpoint-groups create consumerpscneg \
--project=$prodproject \
--region=asia-southeast1 \
--network-endpoint-type=PRIVATE_SERVICE_CONNECT \
--psc-target-service=projects/<project>/regions/asia-southeast1/serviceAttachments/ilbserviceattach \
--network=vpc-demo-consumer \
--subnet=consumer-subnet

PSC NEG 설정이 성공적으로 완료되면 UI에서 Private Service Connect -> Published Services -> 게시된 ilbserviceattach 연결은 이제 전달 규칙 1개를 나타냅니다.

320741b7dedc7984.png

13. 소비자 외부 HTTPS 부하 분산기 만들기

외부 HTTPS 부하 분산기를 만들고 PSC NEG를 백엔드 서비스로 사용합니다( 문서).

Cloud Shell 사용

gcloud compute addresses create httpspsclb \
    --ip-version=IPV4 --global

gcloud compute backend-services create consumer-bs \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTPS \
    --global

gcloud compute backend-services add-backend consumer-bs \
  --network-endpoint-group=consumerpscneg \
  --network-endpoint-group-region=asia-southeast1 \
  --global

gcloud compute url-maps create consumer-url \
  --default-service=consumer-backend-service \
  --global

gcloud compute ssl-certificates create wwwglobal \
    --certificate=fullchain.pem \
    --private-key=private.pem \
    --global

gcloud compute target-https-proxies create consumer-url-target-proxy \
  --url-map=consumer-url \
  --ssl-certificates=wwwglobal

gcloud compute forwarding-rules create consumer-url-forwarding-rule \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --network-tier=PREMIUM \
    --address=httpspsclb \
    --target-https-proxy=consumer-url-target-proxy \
    --ports=443 \
    --global

www01.yinghli.demo.altostrat.com에 대한 DNS 레코드를 업데이트하고 외부 HTTPS 부하 분산기 공개 IP 주소를 가리킵니다.

gcloud dns --project=$prodproject record-sets update www01.yinghli.demo.altostrat.com. --type="A" --zone="yinghli-demo" --rrdatas="34.102.178.214" --ttl="300"

14. 유효성 검사

노트북에서 curl을 사용하여 https://www01.yinghli.demo.altostrat.com에 액세스합니다.

curl -v https://www01.yinghli.demo.altostrat.com
*   Trying 34.102.178.214:443...
* Connected to www01.yinghli.demo.altostrat.com (34.102.178.214) port 443 (#0)
* ALPN: offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=www01.yinghli.demo.altostrat.com
*  start date: Jun  4 10:36:43 2023 GMT
*  expire date: Sep  2 10:36:42 2023 GMT
*  subjectAltName: host "www01.yinghli.demo.altostrat.com" matched cert's "www01.yinghli.demo.altostrat.com"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* using HTTP/2
* h2h3 [:method: GET]
* h2h3 [:path: /]
* h2h3 [:scheme: https]
* h2h3 [:authority: www01.yinghli.demo.altostrat.com]
* h2h3 [user-agent: curl/8.0.0]
* h2h3 [accept: */*]
* Using Stream ID: 1 (easy handle 0x149019a00)
> GET / HTTP/2
> Host: www01.yinghli.demo.altostrat.com
> user-agent: curl/8.0.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
< HTTP/2 200
< server: nginx/1.18.0
< date: Mon, 05 Jun 2023 02:48:43 GMT
< content-type: text/html
< content-length: 35
< last-modified: Sun, 04 Jun 2023 09:02:16 GMT
< etag: "647c5318-23"
< accept-ranges: bytes
< via: 1.1 google, 1.1 google
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
Page on www01 in asia-southeast1-b
* Connection #0 to host www01.yinghli.demo.altostrat.com left intact

15. 삭제 단계

생산자 네트워크 정리 단계

참고: 정리 단계에는 부하 분산기 및 PSC 관련 구성만 표시되며 VPC 및 하이브리드 연결은 포함되지 않습니다.

터미널의 단일 Cloud Shell에서 실습 구성요소를 삭제합니다.

gcloud compute forwarding-rules delete consumer-url-forwarding-rule --global
gcloud compute target-https-proxies delete consumer-url-target-proxy
gcloud compute ssl-certificates delete wwwglobal --global
gcloud compute url-maps delete consumer-url
gcloud compute backend-services delete consumer-bs --global
gcloud compute addresses delete httpspsclb --global

gcloud beta compute network-endpoint-groups delete consumerpscneg --region=asia-southeast1

gcloud compute service-attachments delete ilbserviceattach --region=asia-southeast1
gcloud compute networks subnets delete psc-nat-subnet --region=asia-southeast1

gcloud compute forwarding-rules delete https-ilb-psc --region=asia-southeast1
gcloud compute addresses delete ilbaddress --region=asia-southeast1
gcloud compute target-https-proxies delete on-premise-httpsproxy --region=asia-southeast1
gcloud compute ssl-certificates delete www01 --region=asia-southeast1
gcloud compute url-maps delete on-premise-url --region=asia-southeast1
gcloud compute backend-services delete on-premise-service-backend --region=asia-southeast1
gcloud compute health-checks delete on-prem-service-hc --region=asia-southeast1

gcloud compute network-endpoint-groups delete on-prem-service-neg --zone=asia-southeast1-b
gcloud compute networks subnets delete proxy-subnet-asia-southeast1 --region=asia-southeast1

16. 축하합니다.

축하합니다. Codelab을 완료했습니다.

학습한 내용

  • 하이브리드 NEG 및 분산 상태 점검이 있는 내부 HTTPS 부하 분산기
  • 내부 HTTPS 부하 분산기가 있는 PSC 서비스 연결
  • PSC 네트워크 엔드포인트 그룹 설정
  • 외부 HTTPS 부하 분산기로 PSC NEG 노출