服務供應商的 Private Service Connect 通訊埠對應

1. 簡介

透過 Private Service Connect,服務供應商可以透過服務連結,在虛擬私有雲環境中公開服務,並允許其他虛擬私有雲環境中的使用者透過 Private Service Connect 端點存取這些服務。有時,這些生產端服務會設計為 VM 叢集,每個 VM 都會在相同的通訊埠編號上公開相同的服務。先前,這類服務設計需要在用戶端部署多個 Private Service Connect 端點,或是在供應端使用 IP 轉送功能,以確保指定正確的供應端 VM。

Private Service Connect 現在可以使用通訊埠對應功能,針對正確的目的端進行原生指定。在本實驗室中,您將瞭解需要這項功能的用途,以及如何將 Port Mapping NEG 部署至 Private Service Connect 工作負載。

課程內容

  • Private Service Connect 連接埠對應用途
  • PSC 連接埠對應的主要優點
  • 網路需求
  • 使用連接埠對應建立 Private Service Connect 供應端服務。
  • 建立 Private Service Connect 端點
  • 透過 Private Service Connect 端點向供應端服務發出呼叫

軟硬體需求

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

2. Private Service Connect 連接埠對應用途

通訊埠對應功能會使用專屬於 PSC 用途的通訊埠對應 NEG (網路端點群組)。

最常見的產生器類型,可從使用 Port Mapping 獲益,包括 NoSQL 資料庫產生器和 Kafka 產生器。不過,任何需要 VM 叢集在相同的連接埠上公開相同服務,且具有特定 VM 對應需求的內容供應者,都可以使用這項功能。

供應者定義用戶端通訊埠與供應者 VM + 目的地通訊埠之間的對應關係。接著,生產者需要將這項資訊提供給消費者。消費者會使用預先定義的通訊埠,以便唯一識別需要存取的產生者 VM 和目的地通訊埠。消費者使用的端口與生產者使用的端口不同。

PSC 通訊埠對應的主要優點

  • 簡單:供應端會透過連接埠對應部署 PSC 元件,而用戶端會部署 PSC 端點。PSC 會自動處理網路位址轉譯。
  • 省錢:不需要額外的 PSC 資源或生產者 VM CPU 週期。定價與其他類型的 PSC 部署相同
  • 高效能:連接埠對應可提供與其他 PSC 模式相同的線路速率處理量和低延遲時間
  • 可擴充且 IP 效率高:消費者 VPC 中的一個 IP 位址最多可存取 1000 個產生者 VM 和 1000 個通訊埠對應

3. 網路需求

  • 使用通訊埠對應功能時,必須使用內部網路直通式負載平衡器做為產生者負載平衡器。
  • 只有 PSC 端點可搭配通訊埠對應功能使用 (PSC 後端或 PSC 介面不適用)。
  • 通訊埠對應 NEG 是區域性結構。
  • 通訊埠對應 NEG 只能用於 PSC 連線。如果用戶端 VM 直接呼叫產生者負載平衡器轉送規則,這些規則就無法運作。這一點反映在本程式碼研究室中測試內容供應者服務的方式。
  • PSC 端點和供應者服務堆疊必須位於不同的 VPC。

4. 程式碼研究室拓樸圖

ad37cfc003475b7c.png

在生產端虛擬私有雲中,系統會建立兩個 VM,每個 VM 都會執行兩個網路伺服器,一個在 1000 號通道上執行,另一個在 2000 號通道上執行。我們會先測試各項服務,再設定 Portmap NEG、內部網路直通式負載平衡器和服務附件。

在消費者虛擬私有雲網路中,我們會設定 PSC 端點,並測試從用戶端 VM 連線至供應商服務。

5. 設定和需求

自助式環境設定

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 「Project name」是這個專案參與者的顯示名稱。這是 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

這個虛擬機器會載入您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提升網路效能和驗證功能。您可以在瀏覽器中完成本程式碼研究室的所有工作。您不需要安裝任何東西。

6. 事前準備

啟用 API

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

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

啟用所有必要的服務

gcloud services enable compute.googleapis.com

7. 建立供應商虛擬私有雲網路

虛擬私有雲網路

透過 Cloud Shell

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

建立子網路

透過 Cloud Shell

gcloud compute networks subnets create producer-service-subnet --network producer-vpc --range 10.0.0.0/24 --region $region --enable-private-ip-google-access

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

PSC 子網路會與 PSC 服務連結,以便進行網路位址轉譯。對於實際工作環境的用途,您需要適當調整這個子網路的大小,以支援所有已連結 PSC 端點的入站流量。詳情請參閱 PSC NAT 子網路大小的說明文件

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

透過 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

下列防火牆規則允許從 PSC 子網路傳送至網路中所有執行個體的 TCP 通訊埠 1000-2000 流量。在實際工作環境中,這項防火牆規則應僅限於與特定供應端服務相關聯的執行個體。

透過 Cloud Shell

gcloud compute network-firewall-policies rules create 2000 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic from PSC NAT subnet" --direction INGRESS --src-ip-ranges 10.100.100.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

下列防火牆規則會允許服務子網路中的所有流量,透過 TCP 通訊埠 1000-2000。這個規則可用於測試我們的供應者服務是否正常運作。

透過 Cloud Shell

gcloud compute network-firewall-policies rules create 2001 --action ALLOW --firewall-policy producer-vpc-policy --description "allow traffic within the service subnet" --direction INGRESS --src-ip-ranges 10.0.0.0/24 --layer4-configs tcp:1000-2000 --global-firewall-policy

建立及設定製作者 VM

建立 VM

透過 Cloud Shell

gcloud compute instances create portmap-vm1 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create portmap-vm2 --zone=$zone --subnet=producer-service-subnet --no-address

gcloud compute instances create test-client-vm --zone=$zone --subnet=producer-service-subnet --no-address

在下一個章節中,我們會在每個 Producer VM 的 1000 和 2000 通訊埠上啟動 HTTP 伺服器。

設定 VM

透過 Cloud Shell

gcloud compute ssh --zone $zone "portmap-vm1" --tunnel-through-iap --project $project

在 portmap-vm1 工作階段的 Cloud Shell 中

mkdir 1000
cd 1000
echo "portmap-vm1 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm1 2000">index.html
sudo python3 -m http.server 2000 &

開啟新的 Cloud Shell 視窗

請先重設變數。在 Cloud Shell 中

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute ssh --zone $zone "portmap-vm2" --tunnel-through-iap --project $project

在 portmap-vm2 工作階段的 Cloud Shell 中

mkdir 1000
cd 1000
echo "portmap-vm2 1000">index.html
sudo python3 -m http.server 1000 &
cd ..
mkdir 2000
cd 2000
echo "portmap-vm2 2000">index.html
sudo python3 -m http.server 2000 &

8. 測試製作端服務

首先,我們需要取得 portmap 執行個體的 IP 位址。請記下這兩個 IP 位址。

開啟新的 Cloud Shell 視窗

請先重設變數。在 Cloud Shell 中

project=[YOUR-PROJECT-ID]
region=us-central1
zone=us-central1-a
echo $project
echo $region
echo $zone

gcloud compute instances describe portmap-vm1 \
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

gcloud compute instances describe portmap-vm2\
  --format='get(networkInterfaces[0].networkIP)' --zone $zone

登入測試執行個體。在 Cloud Shell 中

gcloud compute ssh --zone $zone "test-client-vm" --tunnel-through-iap --project $project

curl [portmap-vm1 IP]:1000

預期的輸出內容:

portmap-vm1 1000

在 Cloud Shell 中

curl [portmap-vm1 IP]:2000

預期的輸出內容:

portmap-vm1 2000

在 Cloud Shell 中

curl [portmap-vm2 IP]:1000

預期的輸出內容:

portmap-vm2 1000

在 Cloud Shell 中

curl [portmap-vm2 IP]:2000

預期的輸出內容:

portmap-vm2 2000

結束 test-client-vm

9. 使用 Portmap NEG 建立 Producer 服務

建立負載平衡器元件

透過 Cloud Shell

gcloud compute network-endpoint-groups create portmap-neg --region=$region --network=producer-vpc --subnet=producer-service-subnet --network-endpoint-type=GCE_VM_IP_PORTMAP

將端點新增至 Portmap NEG,建立從用戶端通訊埠到產生者通訊埠的對應項目。製作者會建立這項對應,並提供專屬方法,將這項資訊傳達給消費者。特定的連接埠對應不會透過 PSC 共用。

在 Cloud Shell 中

gcloud compute network-endpoint-groups update portmap-neg --region=$region --add-endpoint=client-destination-port=1001,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=1000 --add-endpoint=client-destination-port=1002,instance=projects/$project/zones/$zone/instances/portmap-vm1,port=2000 --add-endpoint=client-destination-port=1003,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=1000 --add-endpoint=client-destination-port=1004,instance=projects/$project/zones/$zone/instances/portmap-vm2,port=2000

完成負載平衡器建構作業。

在 Cloud Shell 中

gcloud compute backend-services create portmap-bes --load-balancing-scheme=internal --region=$region --network=producer-vpc

gcloud compute backend-services add-backend portmap-bes --network-endpoint-group=portmap-neg --network-endpoint-group-region=$region

gcloud compute forwarding-rules create portmap-fr --load-balancing-scheme=INTERNAL --network=producer-vpc --subnet=producer-service-subnet --ports=ALL --region=$region --backend-service=portmap-bes

建立服務附件

透過 Cloud Shell

gcloud compute service-attachments create portmap-service-attachment --region=$region --producer-forwarding-rule=portmap-fr --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

接著,請擷取並記下服務連結 URI,以便在消費者環境中設定 PSC 端點。

在 Cloud Shell 中

gcloud compute service-attachments describe portmap-service-attachment --region=$region

預期的輸出內容示例

connectionPreference: ACCEPT_AUTOMATIC
creationTimestamp: '2024-07-19T10:02:29.432-07:00'
description: ''
enableProxyProtocol: false
fingerprint: LI8D6JNQsLA=
id: '6207474793859982026'
kind: compute#serviceAttachment
name: portmap-service-attachment
natSubnets:
- https://www.googleapis.com/compute/v1/projects/$project/regions/$zone/subnetworks/psc-nat-subnet
pscServiceAttachmentId:
  high: '94288091358954472'
  low: '6207474793859982026'
reconcileConnections: false
region: https://www.googleapis.com/compute/v1/projects/$project/regions/$region
selfLink: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/serviceAttachments/portmap-service-attachment
targetService: https://www.googleapis.com/compute/v1/projects/$project/regions/$region/forwardingRules/portmap-fr

10. 建立用戶虛擬私有雲網路

虛擬私有雲網路

透過 Cloud Shell

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

建立子網路

透過 Cloud Shell

gcloud compute networks subnets create consumer-client-subnet --network consumer-vpc --range=10.0.0.0/24 --region $region --enable-private-ip-google-access

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

透過 Cloud Shell

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

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

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

消費端網路只需要透過 IAP 存取權存取 SSH。

11. 建立 VM、PSC 端點及測試連線能力

此時應該會開啟三個 Cloud Shell 視窗。其中一個工作階段應與 portmap-vm1 建立連線。其中一個工作階段應使用 portmap-vm2,另一個則應為工作階段。

建立測試 VM

透過 Cloud Shell

gcloud compute instances create consumer-client-vm --zone $zone --subnet=consumer-client-subnet --no-address

建立 PSC 端點

透過 Cloud Shell

gcloud compute addresses create psc-endpoint-ip --region=$region --subnet=consumer-client-subnet --addresses 10.0.0.10

gcloud compute forwarding-rules create psc-portmap-endpoint --region=$region --network=consumer-vpc --address=psc-endpoint-ip --target-service-attachment=[SERVICE ATTACHMENT URI]

測試連線能力

透過 Cloud Shell

gcloud compute ssh --zone $zone "consumer-client-vm" --tunnel-through-iap --project $project

curl 10.0.0.10:1001

預期輸出

portmap-vm1 1000

透過 Cloud Shell

curl 10.0.0.10:1002

預期輸出

portmap-vm1 2000

透過 Cloud Shell

curl 10.0.0.10:1003

預期輸出

portmap-vm2 1000

透過 Cloud Shell

curl 10.0.0.10:1004

預期輸出

portmap-vm2 2000

12. 清理步驟

退出 VM 執行個體 (所有視窗)

exit

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

gcloud compute forwarding-rules delete psc-portmap-endpoint --region=$region -q

gcloud compute addresses delete psc-endpoint-ip --region=$region -q

gcloud compute instances delete consumer-client-vm --zone=$zone -q

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

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

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

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

gcloud compute networks delete consumer-vpc -q

gcloud compute service-attachments delete portmap-service-attachment --region=$region -q

gcloud compute forwarding-rules delete portmap-fr --region=$region -q

gcloud compute backend-services delete portmap-bes --region=$region -q

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

gcloud compute instances delete test-client-vm --zone=$zone -q

gcloud compute instances delete portmap-vm2 --zone=$zone -q

gcloud compute instances delete portmap-vm1 --zone=$zone -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 networks subnets delete psc-nat-subnet --region $region -q

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

gcloud compute networks delete producer-vpc -q

13. 恭喜!

恭喜您完成程式碼研究室!

涵蓋內容

  • Private Service Connect 連接埠對應用途
  • PSC 連接埠對應的主要優點
  • 網路需求
  • 使用連接埠對應建立 Private Service Connect 供應端服務。
  • 建立 Private Service Connect 端點
  • 透過 Private Service Connect 端點向供應端服務發出呼叫