Private Service Connect - 使用 PSC 後端存取供應端服務

1. 簡介

服務供應商可透過 Private Service Connect,從一個虛擬私有雲網路以私密方式公開服務,供其他虛擬私有雲網路使用。消費者可以透過 PSC 端點或 PSC 後端存取生產者服務。

本程式碼研究室的重點是 PSC 後端。PSC 後端會與 Google Cloud Proxy 負載平衡器 (應用程式或網路) 搭配使用。使用 PSC 後端可提供更精細的消費者端控制選項,例如:

  • 更深入的觀測和記錄
  • 整合 Cloud Armor
  • 自訂網址
  • 進階流量管理
  • 自訂傳輸層安全標準 (TLS) 憑證

在本程式碼研究室中,您將瞭解如何使用全域外部應用程式負載平衡器建立 Private Service Connect 後端,以私下存取其他網路中的生產端服務。

課程內容

  • 建立及設定與全域外部應用程式負載平衡器相關聯的 PSC 後端
  • 設定 Apache 受管理網路服務,並透過服務附件將其公開為 PSC 服務
  • 建立 SSL 憑證,在內部和外部應用程式負載平衡器上終止 SSL
  • 設定 Cloud DNS 公開區域,以便存取 PSC 服務

軟硬體需求

  • 具備擁有者權限的 Google Cloud 專案

2. 測試環境

您建立的環境會包含消費者虛擬私有雲和生產者虛擬私有雲。在 Producer VPC 中,您將從執行個體範本部署代管執行個體群組,建立開放原始碼的 Apache 網路服務。您也會部署測試 VM,確保服務在本機正常運作。您將透過服務連結,將 Apache 服務公開為 PSC 供應商服務。

您會在 Consumer VPC 中部署全域外部應用程式負載平衡器,並使用指向 Apache 服務的 PSC 後端服務。接著,您將設定公開 DNS 區域,以便在公開網路上存取 PSC 服務。

31e7497bf3d9035c.png

3. 設定和需求

自修實驗室環境設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試使用自己的名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間會維持不變。
  • 請注意,有些 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成這個程式碼研究室的費用不高,甚至可能完全免費。如要關閉資源,避免在本教學課程結束後繼續產生費用,請刪除您建立的資源或專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

啟動 Cloud Shell

雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。

Google Cloud 控制台中,點選右上工具列的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業需要一些時間才能完成。完成後,您應該會看到如下的內容:

7ffe5cbb04455448.png

這部虛擬機器搭載各種您需要的開發工具,並提供永久的 5GB 主目錄,而且可在 Google Cloud 運作,大幅提升網路效能並強化驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有作業。您不需要安裝任何軟體。

4. 事前準備

啟用 API

在 Cloud Shell 中,確認專案 ID 已設定完畢

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export project=YOUR-PROJECT-NAME
export region=us-central1
echo $project
echo $region

啟用所有必要服務

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com

5. 供應商虛擬私有雲設定

建立虛擬私有雲網路

透過 Cloud Shell

gcloud compute networks create producer-vpc --subnet-mode custom

建立子網路

兩個一般用途子網路會部署在 producer-vpc 中。服務子網路將用於部署 Apache 網路服務 VM,以及負載平衡器轉送規則。test-client-subnet 位於不同區域,可用於部署 VM,並測試已啟用全域存取的 Apache 服務。

透過 Cloud Shell

gcloud compute networks subnets create service-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/28 \
    --region=$region

透過 Cloud Shell

gcloud compute networks subnets create test-client-subnet \
    --network=producer-vpc \
    --range=10.0.1.0/28 \
    --region=us-east4

我們也必須部署僅限 Proxy 的子網路,以搭配區域性內部應用程式負載平衡器使用。

透過 Cloud Shell

gcloud compute networks subnets create central-proxy-subnet \
    --network=producer-vpc \
    --range=10.100.101.0/24 \
    --region=$region \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE

部署 PSC 服務時,每個不重複的服務都需要有對應的 PSC NAT 子網路,才能與服務附件建立關聯。這個子網路的大小應視預期連線端點數量而定。

透過 Cloud Shell

gcloud compute networks subnets create psc-nat-subnet \
    --network=producer-vpc \
    --region=$region \
    --range=10.100.100.0/24 \
    --purpose=PRIVATE_SERVICE_CONNECT

建立 Cloud NAT

您必須使用 Cloud NAT,才能為製作人服務安裝適當的套件。

透過 Cloud Shell

gcloud compute routers create central-cr \
    --network=producer-vpc \
    --region=$region

透過 Cloud Shell

gcloud compute routers nats create central-nat \
    --router=central-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

建立網路防火牆政策和規則

透過 Cloud Shell

gcloud compute network-firewall-policies create producer-vpc-policy --global

gcloud compute network-firewall-policies associations create \
    --firewall-policy producer-vpc-policy \
    --network producer-vpc \
    --name network-producer-vpc \
    --global-firewall-policy

如要允許 IAP 連線至您的 VM 執行個體,請根據以下條件建立防火牆規則:

  • 套用至所有您希望能透過 IAP 存取的 VM 執行個體。
  • 允許來自 IP 範圍 35.235.240.0/20 的輸入流量。這個範圍包含 IAP 用於 TCP 轉送的所有 IP 位址。

透過 Cloud Shell

gcloud compute network-firewall-policies rules create 1000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "SSH with IAP" \
    --direction INGRESS \
    --src-ip-ranges 35.235.240.0/20 \
    --layer4-configs tcp:22  \
    --global-firewall-policy

您還需要兩項防火牆規則,允許來自負載平衡器 Proxy 專用子網路 (2000) 的輸入流量傳送至負載平衡器後端,以及允許對後端執行個體進行負載平衡器健康檢查的規則 (2001)。

透過 Cloud Shell

gcloud compute network-firewall-policies rules create 2000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow traffic from load balancer proxy subnet" \
    --direction INGRESS \
    --src-ip-ranges 10.100.101.0/24 \
    --layer4-configs tcp:443 \
    --global-firewall-policy


gcloud compute network-firewall-policies rules create 2001 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow load balancer health checks" \
    --direction INGRESS \
    --src-ip-ranges 130.211.0.0/22,35.191.0.0/16 \
    --layer4-configs tcp:443 \
    --global-firewall-policy

6. 建立 Apache 網路服務

我們將建立簡單的 Apache Web 服務,顯示「PSC Service」。

建立執行個體範本

透過 Cloud Shell

gcloud compute instance-templates create apache-service-template \
    --network producer-vpc \
    --subnet service-subnet \
    --region $region \
    --no-address \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "PSC Service" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

為 MIG 建立健康狀態檢查

透過 Cloud Shell

gcloud compute health-checks create https service-mig-healthcheck \
    --port=443 \
    --global

建立代管執行個體群組

透過 Cloud Shell

gcloud compute instance-groups managed create psc-service-mig \
    --region $region \
    --size=2 \
    --template=apache-service-template \
    --health-check=service-mig-healthcheck

gcloud compute instance-groups managed set-named-ports psc-service-mig \
    --named-ports=https:443 \
    --region=$region

7. 建立自行簽署的憑證

請按照這裡的步驟 1 操作,建立自行簽署的憑證。您可以在 Cloud Shell 中執行所有指令。完成步驟 1 後,請返回這個頁面。您的通用名稱必須設定為 example.com。

建立要與負載平衡器建立關聯的憑證資源。將憑證和私密金鑰參數換成您的特定檔案名稱。

透過 Cloud Shell

gcloud compute ssl-certificates create producer-service-cert \
    --certificate=<your-producer-certfile.cert> \
    --private-key=<your-producer-keyfile.pem> \
    --region=$region

8. 建立內部區域應用程式負載平衡器

接下來,我們要為服務建立負載平衡器元件。我們使用的是內部區域應用程式負載平衡器,但您可以選擇使用任何 Google Cloud 內部負載平衡器。請參閱適當的負載平衡器說明文件,瞭解如何處理 TLS。

建立將用於負載平衡器轉送規則的內部 IP 位址,並記下該 IP,稍後對服務進行測試呼叫時會用到。

透過 Cloud Shell

gcloud compute addresses create apache-service-ip \
 --region=$region \
 --subnet=service-subnet

gcloud compute addresses describe apache-service-ip \
   --format="get(address)" \
   --region=$region

建立負載平衡器健康狀態檢查。

透過 Cloud Shell

gcloud compute health-checks create https lb-apache-service-hc \
    --region=$region \
    --port-name=https

建立後端服務。

透過 Cloud Shell

gcloud compute backend-services create apache-bes\
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTPS \
  --port-name=https \
  --health-checks=lb-apache-service-hc \
  --health-checks-region=$region \
  --region=$region


gcloud compute backend-services add-backend apache-bes \
  --balancing-mode=UTILIZATION \
  --instance-group=psc-service-mig \
  --region=$region

建立網址對應。

透過 Cloud Shell

gcloud compute url-maps create producer-url-map \
  --default-service=apache-bes \
  --region=$region

建立目標 HTTPS Proxy。

透過 Cloud Shell

gcloud compute target-https-proxies create https-proxy \
  --url-map=producer-url-map \
  --region=$region \
  --ssl-certificates=producer-service-cert

建立轉送規則。

透過 Cloud Shell

gcloud compute forwarding-rules create apache-fr \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=producer-vpc \
  --subnet=service-subnet \
  --address=apache-service-ip \
  --ports=443 \
  --region=$region \
  --target-https-proxy=https-proxy \
  --target-https-proxy-region=$region \
  --allow-global-access

9. 建立測試 VM 並在本機測試服務

建立服務連結前,請先在不同區域建立測試用戶端 VM,確認負載平衡器已正確設定全域存取權和 TLS。

透過 Cloud Shell

gcloud compute instances create vm-client \
    --zone=us-east4-a \
    --subnet=test-client-subnet \
    --no-address

等待佈建作業完成 (約一分鐘),然後透過 SSH 連線至執行個體。

透過 Cloud Shell

gcloud compute ssh \
    --zone "us-east4-a" "vm-client" \
    --tunnel-through-iap \
    --project $project

透過負載平衡器,經由 443 連線測試 Apache 服務。內部 IP 位址是您先前保留並記下的位址。

curl https://example.com:443 -k --connect-to example.com:443:<YOUR-INTERNAL-IP>:443

預期結果

PSC Service

退出 VM。

從 vm-client

exit

10. 建立服務連結

在本範例中,我們將服務連結設定為只允許來自這個專案的 PSC 連線。您可以設定接受一或多個特定專案或網路,但無法同時接受兩者。我們已將連線數量上限設為 5 個。每個專案或網路都必須設定限制。

透過 Cloud Shell

gcloud compute service-attachments create apache-service-attachment \
    --region=$region \
    --producer-forwarding-rule=apache-fr \
    --connection-preference=ACCEPT_MANUAL \
    --consumer-accept-list=$project=5 \
    --nat-subnets=psc-nat-subnet

請記下服務附件 URI (selfLink),因為您會在下一個步驟中用到,進行 PSC 後端設定。您可以在 Cloud Shell 中執行下列指令來取得這項資訊。

透過 Cloud Shell

gcloud compute service-attachments describe apache-service-attachment \
    --region $region

複製以「projects」開頭的 URI

範例:projects/$project/regions/$region/serviceAttachments/apache-service-attachment

11. 設定消費者虛擬私有雲

建立虛擬私有雲網路

透過 Cloud Shell

gcloud compute networks create consumer-vpc --subnet-mode custom

建立子網路

您需要在用戶端部署 Private Service Connect 網路端點群組 (NEG) 的子網路。

透過 Cloud Shell

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-vpc \
    --region=$region \
    --range=10.0.0.0/28

12. 保留外部 IP 並建立消費者端自行簽署的憑證

外部 IP

建立外部靜態 IP 位址,稍後將用於負載平衡器轉送規則,並在 Cloud Shell 變數中擷取 IP 位址。

透過 Cloud Shell

gcloud compute addresses create external-psc-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

export externalip=$(gcloud compute addresses describe external-psc-ip \
    --format="get(address)" \
    --global)

echo $externalip

消費者自行簽署的憑證

再次按照這裡的步驟 1 操作,建立自行簽署的憑證。您可以在 Cloud Shell 中執行所有指令。完成步驟 1 後,請返回這個頁面。我們會使用名為 nip.io 的開放原始碼公開萬用字元 DNS 服務,取代我們自己的公開 DNS 區域。PSC 服務的公開網址會使用您剛設定的外部 IP 位址。您的通用名稱必須設定為 <YOUR-EXTERNAL-IP.nip.io>

建立憑證資源,以便與外部負載平衡器建立關聯。將憑證和私密金鑰參數換成您的特定檔案名稱。

透過 Cloud Shell

gcloud compute ssl-certificates create consumer-service-cert \
    --certificate=<your-consumer-certfile.cert> \
    --private-key=<your-consumer-keyfile.pem> \
    --global

13. 建立負載平衡器元件

我們會建立全域外部應用程式負載平衡器,並將 PSC NEG 指向新建立的服務連結,做為後端服務。

請準備好上一步記下的服務連結 URI。將下方的 psc-target-service 換成您的 URI。

透過 Cloud Shell

gcloud compute network-endpoint-groups create apache-psc-neg \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/$project/regions/$region/serviceAttachments/apache-service-attachment \
--region=$region \
--network=consumer-vpc \
--subnet=consumer-subnet

建立後端服務。

透過 Cloud Shell

gcloud compute backend-services create apache-pscneg-bes \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTPS \
    --global

gcloud compute backend-services add-backend apache-pscneg-bes \
    --network-endpoint-group=apache-psc-neg \
    --network-endpoint-group-region=$region \
    --global

建立網址對應

透過 Cloud Shell

gcloud compute url-maps create consumer-url-map \
    --default-service=apache-pscneg-bes \
    --global

建立目標 HTTPS Proxy。

透過 Cloud Shell

gcloud compute target-https-proxies create psc-https-proxy \
    --url-map=consumer-url-map \
    --ssl-certificates=consumer-service-cert

建立轉送規則

透過 Cloud Shell

gcloud compute forwarding-rules create external-fr \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --network-tier=PREMIUM \
  --address=external-psc-ip \
  --global \
  --target-https-proxy=psc-https-proxy \
  --ports=443

14. 建立公開 DNS 區域

透過 Cloud Shell

gcloud dns managed-zones create "psc-service" \
    --dns-name=$externalip.nip.io. \
    --description="public dns for psc service" \
    --visibility=public

透過 Cloud Shell

gcloud dns record-sets transaction start \
   --zone="psc-service"

gcloud dns record-sets transaction add $externalip \
   --name=$externalip.nip.io \
   --ttl=300 \
   --type=A \
   --zone="psc-service"

gcloud dns record-sets transaction execute \
   --zone="psc-service"

15. 測試消費者 PSC 連線

請等待 7 到 10 分鐘,讓公開 DNS 生效,再進行測試。

透過 Cloud Shell

curl https://$externalip.nip.io -k

您也可以在瀏覽器或電腦終端機中輸入 https://<YOUR-EXTERNAL-IP>.nip.io,透過瀏覽器進行測試。

預期結果

PSC Service

16. 清除步驟

從單一 Cloud Shell 終端機刪除實驗室元件

gcloud dns record-sets delete $externalip.nip.io --zone="psc-service" --type=A -q

gcloud dns managed-zones delete "psc-service" -q

gcloud compute forwarding-rules delete external-fr --global -q 

gcloud compute target-https-proxies delete psc-https-proxy -q

gcloud compute url-maps delete consumer-url-map --global -q

gcloud compute backend-services delete apache-pscneg-bes --global -q

gcloud compute network-endpoint-groups delete apache-psc-neg --region=$region -q

gcloud compute ssl-certificates delete consumer-service-cert --global -q

gcloud compute addresses delete external-psc-ip --global -q

gcloud compute networks subnets delete consumer-subnet --region $region -q

gcloud compute networks delete consumer-vpc -q

gcloud compute instances delete vm-client --zone=us-east4-a -q

gcloud compute service-attachments delete apache-service-attachment --region $region -q

gcloud compute forwarding-rules delete apache-fr --region $region -q

gcloud compute target-https-proxies delete https-proxy --region $region -q

gcloud compute url-maps delete producer-url-map --region $region -q

gcloud compute backend-services delete apache-bes --region $region -q

gcloud compute health-checks delete lb-apache-service-hc --region $region -q

gcloud compute addresses delete apache-service-ip --region $region -q

gcloud compute ssl-certificates delete producer-service-cert --region $region -q

gcloud compute instance-groups managed delete psc-service-mig --region $region -q

gcloud compute health-checks delete service-mig-healthcheck --global -q

gcloud compute instance-templates delete apache-service-template -q

gcloud compute network-firewall-policies rules delete 2001 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 2000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy  --name=network-producer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete producer-vpc-policy --global -q

gcloud compute routers nats delete central-nat --router=central-cr --region $region -q

gcloud compute routers delete central-cr --region $region -q

gcloud compute networks subnets delete psc-nat-subnet --region $region -q

gcloud compute networks subnets delete service-subnet --region $region -q

gcloud compute networks subnets delete test-client-subnet --region us-east4 -q 

gcloud compute networks subnets delete central-proxy-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

17. 恭喜!

恭喜您完成本程式碼研究室。

涵蓋內容

  • 建立及設定與全域外部應用程式負載平衡器相關聯的 PSC 後端
  • 設定 Apache 受管理網路服務,並透過服務附件將其公開為 PSC 服務
  • 建立 SSL 憑證,在內部和外部應用程式負載平衡器上終止 SSL
  • 設定 Cloud DNS 公開可用區,以便存取 PSC 服務