具備自動 DNS 設定的 Private Service Connect

1. 簡介

採用自動 DNS 設定的 Private Service Connect 會使用 Service Directory 和 Cloud DNS,自動建立以消費者 Private Service Connect 端點 IP 位址編寫的 DNS 記錄。

建構項目

在本程式碼研究室中,您將會建構全方位的 Private Service Connect 架構,說明自動 DNS 的使用方式 (如圖 1 所示)。

自動 DNS 的運作方式如下:

  1. 生產端服務連結透過提供擁有的公共網域「– 網域名稱」來自動產生 DNS旗標。
  2. 取用端定義端點名稱。
  3. 自動 DNS 除了由消費者端點名稱組成的 Service Directory 項目外,自動 DNS 還會建立「DNS 區域」goog-psc-default-us-central1 和「DNS 名稱」cosmopup.net。

以 (4) 為例,自動 DNS 的優點指出,使用者可以透過 DNS (FQDN stargazer.cosmopup.net) 與消費者端點通訊。

圖 1

5e26a358454d1336.png

課程內容

  • 如何建立內部 HTTP(S) 負載平衡器
  • 如何使用自動 DNS 建立服務連結
  • 如何建立 Private Service Connect Producer 服務
  • 如何使用自動 DNS 存取用戶端點

軟硬體需求

  • Google Cloud 專案
  • 您擁有的公開網域

2. 事前準備

更新專案以支援程式碼研究室

本程式碼研究室會使用 $variables,協助在 Cloud Shell 中實作 gcloud 設定。

在 Cloud Shell 中執行以下操作:

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

3. 生產端設定

建立生產端虛擬私有雲

在 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:

建立區域性 Proxy 子網路

Proxy 分配是在虛擬私有雲網路層級,而非負載平衡器層級。您必須在使用 Envoy 型負載平衡器的虛擬網路 (VPC) 中,為每個區域建立一個僅限 Proxy 的子網路 。假如您在同一個區域和同一個虛擬私有雲網路中部署多個負載平衡器,這兩個負載平衡器會共用相同的 Proxy 專用子網路,以便進行負載平衡。

  1. 用戶端會連線至負載平衡器轉送規則的 IP 位址和通訊埠。
  2. 每個 Proxy 都會監聽根據對應負載平衡器轉送規則指定的 IP 位址和通訊埠。其中一個 Proxy 接收並終止用戶端的網路連線。
  3. Proxy 會根據負載平衡器的網址對應和後端服務,建立連至適當後端 VM 的連線。

無論虛擬私有雲網路是自動模式還是自訂模式,都必須建立僅限 Proxy 的子網路。僅限 Proxy 的子網路必須提供 64 個以上的 IP 位址。對應的前置字串長度為 /26 以下。建議的子網路大小為 /23 (512 個僅限 Proxy 的位址)。

在 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 Proxy 子網路之間的流量。

在 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

為僅限 Proxy 的子網路建立允許輸入的防火牆規則,允許負載平衡器與 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 是用來安裝軟體套件,因為 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 中建立網址對應,將連入要求轉送至後端服務。

gcloud compute url-maps create l7-ilb-map \
    --default-service l7-ilb-backend-service \
    --region=us-central1

建立 HTTP 目標 Proxy。

gcloud compute target-http-proxies create l7-ilb-proxy\
    --url-map=l7-ilb-map \
    --url-map-region=us-central1 \
    --region=us-central1

建立轉送規則,將連入要求轉送至 Proxy。請勿使用僅限 Proxy 的子網路建立轉送規則。

 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 控制台中,依序前往「Network Services」(網路服務) →「Load Balancing」(負載平衡) →「Load Balancers」(負載平衡器)。記下成功的後端服務健康狀態檢查

881567cc11627009.png

選取 'l7-ilb-map' 會產生前端 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.

選用步驟:如果使用共用虛擬私有雲,請在服務專案中建立服務連結。

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 更多詳細資料,包括用戶用來建立私人服務連線的服務連結 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

建立消費者虛擬私有雲網路

在 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. 驗證消費者虛擬私有雲網路的連線

在消費者虛擬私有雲網路中,前往「Network Services」(網路服務) →「Private Service Connect」(Private Service Connect) →「Connected Endpoints」(連線端點),驗證私人服務連線是否成功。請記下我們先前建立的 Stargazer 連線和對應的 IP 位址。

c60812433c3e1676.png

選取 psc-consumer-1 詳細資料時,系統會提供服務連結 URI

14d3e3b1e0aee3c2.png

8. 驗證生產者的虛擬私有雲網路連線

在生產者的虛擬私有雲網路中,依序前往「Network Services」(網路服務) →「Private Service Connect」(Private Service Connect) →「已發布服務」,驗證私人服務連線是否成功。請注意,已發布的服務連線目前代表 1 項轉送規則 (連線端點)。

911dbd7421bcfd3a.png

9. 驗證自動 DNS 設定

接著評估 DNS 和 Service Directory 設定。

Cloud DNS 設定

依序前往「Network Services」(網路服務) →「Cloud DNS」→「Zones」(可用區)。區域 goog-psc-default-us-central & DNS 名稱 cosmopup.net. 會自動產生。

4395e7b33fc42faa.png

查看 DNS 和 Service Directory 設定

選取可用區名稱可讓我們瞭解 Service Directory 與 Cloud DNS 的整合方式。

e4fe44d945b20451.png

Service Directory 設定

前往「Network Services」→「Service Directory」

舊客戶端點名稱是「stargazer」?它會自動在 Service Directory 中編寫,讓我們使用 FQDN stargazer.goog-psc-default–us-central1 連線至用戶端點

602deab65b5ac315.png

10. 驗證消費者能否存取供應商服務

我們會從消費者的虛擬私有雲網路建立 VM,透過存取消費者端點 stargazer.cosmopup.net 來測試已發布服務的連線

在 Cloud Shell 中,在消費者虛擬私有雲中建立測試執行個體。

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 中,對自訂網域執行 curl 指令,例如 stargazer.[custom-domain.com]。在下方的輸出內容中,系統會針對 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 中刪除程式碼研究室元件。

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 連線至地端部署服務。

Cosmopup 認為程式碼研究室真的很棒!

8c2a10eb841f7b01.jpeg

後續步驟

查看一些程式碼研究室…

其他資訊與影片

參考文件