使用 Private Service Connect 和混合式 NEG TCP Proxy,透過混合型網路連線至地端部署服務

1. 簡介

透過具備混合連線功能的內部區域 TCP Proxy 負載平衡器,您可以讓託管於地端部署系統或其他雲端環境的服務,提供給虛擬私有雲網路中的用戶端。

如要在其他虛擬私有雲網路中提供混合型服務,則可以使用 Private Service Connect 發布服務。只要在內部區域性 TCP Proxy 負載平衡器前方放置服務連結,即可讓其他虛擬私有雲網路中的用戶端連線至在地端部署或其他雲端環境執行的混合型服務。

建構項目

在本程式碼研究室中,您會透過網路端點群組,建立採用混合式連線的內部 TCP Proxy 負載平衡器,以連線至地端部署服務。消費者虛擬私有雲將能與地端部署服務通訊。

a4fa0e406e7232fa.png

課程內容

  • 如何建立具備混合型 NEG 後端服務的 TCP Proxy ILB
  • 如何建立 Private Service Connect 生產者 (服務連結) 和用戶端 (轉送規則)
  • 如何測試及驗證消費者與生產端服務通訊

軟硬體需求

  • 已建立的混合式網路,例如高可用性 VPN、互連網路、SW-WAN
  • Google Cloud 專案

建立混合式連線

您的 Google Cloud、地端部署或其他雲端環境必須使用 Cloud Router 的 Cloud Interconnect VLAN 連結或 Cloud VPN 通道,透過混合式連線連線。建議您使用高可用性連線。

啟用全域動態轉送的 Cloud Router 會透過 BGP 取得特定端點,並將其程式編寫到您的 Google Cloud 虛擬私有雲網路。系統不支援區域動態轉送。不支援靜態路徑。

您用來設定 Cloud Interconnect 或 Cloud VPN 的 Google Cloud 虛擬私有雲網路,與用來設定混合型負載平衡部署作業的網路相同。請確認虛擬私有雲網路的子網路 CIDR 範圍與遠端 CIDR 範圍沒有衝突。IP 位址重疊時,系統會優先採用子網路路徑,而非遠端連線。

如需操作說明,請參閱:

自訂路徑通告

下列子網路需要自訂通告從 Cloud Router 傳送至內部部署網路,以確保內部部署防火牆規則已更新。

子網路

說明

172.16.0.0/23

用來直接與內部部署服務通訊的 TCP Proxy 子網路

130.211.0.0/22、35.191.0.0/16

Google Cloud 健康狀態檢查

2. 事前準備

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

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

在 Cloud Shell 中執行下列操作

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

3. 生產端設定

建立生產端虛擬私有雲

在 Cloud Shell 中執行下列操作

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

建立生產端子網路

在 Cloud Shell 中執行下列操作

gcloud compute networks subnets create subnet-201 --project=$psclab --range=10.10.1.0/24 --network=producer-vpc --region=us-central1

建立 TCP Proxy 子網路

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

  1. 用戶端會連線至負載平衡器轉送規則的 IP 位址和通訊埠。
  2. 每個 Proxy 都會監聽根據對應負載平衡器轉送規則指定的 IP 位址和通訊埠。其中一個 Proxy 接收並終止用戶端的網路連線。
  3. Proxy 會根據負載平衡器的網址對應和後端服務,建立連至 NEG 中適當後端 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 --network=producer-vpc --region=us-central1 --range=100.100.10.0/24 --purpose=private-service-connect

建立生產端防火牆規則

設定 防火牆規則,允許 Private Service Connect 端點和服務連結之間的流量。在程式碼研究室中,您建立了輸入防火牆規則,允許 NAT 子網路 100.100.10.0/24 存取 Private Service Connect Service 連結 (內部負載平衡器)。

在 Cloud Shell 中執行下列操作

gcloud compute --project=$psclab 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

建立輸入防火牆規則,允許內部部署服務與通訊埠 80 的 Proxy 子網路進行通訊

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

設定混合式連線 NEG

建立 NEG 時,使用區域可盡量減少 Google Cloud 與地端部署/其他雲端環境之間的地理距離。舉例來說,假設您是在德國法蘭克福的地端部署環境中託管服務,可以在建立 NEG 時指定 europe-west3-a Google Cloud 可用區。

此外,如果您使用的是 Cloud Interconnect,用來建立 NEG 的可用區應位於設定 Cloud Interconnect 連結的區域中。

如要瞭解可用的區域和可用區,請參閱 Compute Engine 說明文件:可用區域和可用區

在 Cloud Shell 中,使用 gcloud compute network-endpoint-groups create 指令建立混合式連線 NEG

gcloud compute network-endpoint-groups create on-prem-service-neg \
    --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
    --zone=us-central1-a \
    --network=producer-vpc

在 Cloud Shell 中,將地端部署 IP:通訊埠端點新增至混合型 NEG。

gcloud compute network-endpoint-groups update on-prem-service-neg \
    --zone=us-central1-a \
    --add-endpoint="ip=192.168.1.5,port=80"

設定負載平衡器

在接下來的步驟中,您將設定負載平衡器 (轉送規則),並與網路端點群組建立關聯

在 Cloud Shell 中,建立傳遞至地端部署服務的區域健康狀態檢查

gcloud compute health-checks create tcp on-prem-service-hc \
    --region=us-central1 \
    --use-serving-port

在 Cloud Shell 中為地端部署後端建立後端服務

gcloud compute backend-services create on-premise-service-backend \
   --load-balancing-scheme=INTERNAL_MANAGED \
   --protocol=TCP \
   --region=us-central1 \
   --health-checks=on-prem-service-hc \
   --health-checks-region=us-central1

在 Cloud Shell 中,將混合式 NEG 後端新增至後端服務。針對 MAX_CONNECTIONS 輸入後端應處理的並行連線數量上限。

gcloud compute backend-services add-backend on-premise-service-backend \
   --network-endpoint-group=on-prem-service-neg \
   --network-endpoint-group-zone=us-central1-a \
   --region=us-central1 \
   --balancing-mode=CONNECTION \
   --max-connections=100

在 Cloud Shell 中建立目標 Proxy

gcloud compute target-tcp-proxies create on-premise-svc-tcpproxy \
   --backend-service=on-premise-service-backend \
   --region=us-central1

在 Cloud Shell 中建立轉送規則 (ILB)

使用 gcloud computeforward-rules create 指令建立轉送規則。

將 FWD_RULE_PORT 替換為介於 1 至 65535 之間的單一通訊埠編號。轉送規則只會轉送目的地通訊埠相符的封包。

gcloud compute forwarding-rules create tcp-ilb-psc \
   --load-balancing-scheme=INTERNAL_MANAGED \
   --network=producer-vpc \
   --subnet=subnet-201 \
   --ports=80 \
   --region=us-central1 \
   --target-tcp-proxy=on-premise-svc-tcpproxy \
   --target-tcp-proxy-region=us-central1

取得內部負載平衡器的 IP 位址

gcloud compute forwarding-rules describe tcp-ilb-psc --region=us-central1 | grep -i IPAddress:

Example output:
gcloud compute forwarding-rules describe tcp-ilb-psc --region=us-central1 | grep -i IPAddress:
IPAddress: 10.10.1.2

4. 驗證負載平衡器

在 Cloud 控制台中,依序前往「網路服務」→「負載平衡」→「負載平衡器」。請注意,1 NEG 為「Green」,表示能成功對地端部署服務執行健康狀態檢查

c16a93d1e185336b.png

選取 ‘on-premise-service-backend' 則會產生前端 IP 位址

26db2d30747fd40a.png

5. 查看從內部部署環境得知的路徑

依序前往「虛擬私有雲網路」→「路徑」。請注意,內部服務子網路 192.168.1.0/27

bae85fdc418f9811.png

6. 驗證連至地端部署服務的連線

在生產端虛擬私有雲中,我們會建立一個 VM 來測試連至地端部署服務的連線,在接著設定服務連結後進行設定。

在 Cloud Shell 中,在生產端 vpc 中建立測試執行個體

gcloud compute instances create test-box-us-central1 \
    --zone=us-central1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --subnet=subnet-201 \
    --no-address

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

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

在 Cloud Shell 中,在生產端 vpc 中建立測試執行個體

gcloud compute firewall-rules create ssh-iap \
    --network producer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

請在 Cloud Shell 中使用 IAP 登入 test-box-us-central1,藉由對負載平衡 IP 位址執行 curl 指令,驗證連至內部部署服務的連線。如果逾時,請重試。

gcloud compute ssh test-box-us-central1 --project=$psclab --zone=us-central1-a --tunnel-through-iap

執行 curl 驗證內部部署服務連線。驗證完成後,系統會從 VM 發出並傳回 Cloud Shell 提示。依據步驟 3 和 4 指定的輸出內容,替換內部負載平衡器 IP。

deepakmichael@test-box-us-central1:~$ curl -v 10.10.1.2
* Expire in 0 ms for 6 (transfer 0x55b9a6b2f0f0)
*   Trying 10.10.1.2...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b9a6b2f0f0)
* Connected to 10.10.1.2 (10.10.1.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.10.1.2
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Accept-Ranges: bytes
< ETag: "3380914763"
< Last-Modified: Mon, 05 Dec 2022 15:10:56 GMT
< Expires: Mon, 05 Dec 2022 15:42:38 GMT
< Cache-Control: max-age=0
< Content-Length: 37
< Date: Mon, 05 Dec 2022 15:42:38 GMT
< Server: lighttpd/1.4.53
< 
Welcome to my on-premise service!!

7. 建立 Private Service Connect 服務連結

在接下來的步驟中,我們會建立服務連結,與用戶端端點存取權配對後,即可使用地端部署服務,不需要透過虛擬私有雲對等互連。

建立服務連結

在 Cloud Shell 中建立服務連結

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=tcp-ilb-psc --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

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

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=tcp-ilb-psc --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/<region>/subnetworks/<natsubnet>

驗證 TCP 服務連結

gcloud compute service-attachments describe service-1 --region us-central1

8. 選用:前往「網路服務」→「Private Service Connect」查看新建立的服務連結

bddc23a10d38d981.png

選取「Service-1」Service-1則能提供更多詳細資料,包括用戶用來建立 Private Service 連線的服務連結 URI。請記下 URI,因為該 URI 將在後續步驟中用到。

5c0a74874536909d.png

服務連結詳細資料:projects/<專案名稱>/regions/us-central1/serviceAttachments/service-1

9. 消費者設定

建立用戶端虛擬私有雲

在 Cloud Shell 中執行下列操作

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

建立用戶子網路

在 Cloud Shell 中建立 GCE 子網路

gcloud compute networks subnets create subnet-101 --project=$psclab --range=10.100.1.0/24 --network=consumer-vpc --region=us-central1

透過 Cloud Shell 建立用戶端點子網路

gcloud compute networks subnets create subnet-102 --project=$psclab --range=10.100.2.0/24 --network=consumer-vpc --region=us-central1

建立用戶端端點 (轉送規則)

在 Cloud Shell 中建立要做為用戶端點的靜態 IP 位址

gcloud compute addresses create psc-consumer-ip-1 --region=us-central1 --subnet=subnet-102 --addresses 10.100.2.10

使用先前產生的服務連結 URI 建立用戶端端點

透過 Cloud Shell 建立用戶端點

gcloud compute forwarding-rules create psc-consumer-1 --region=us-central1 --network=consumer-vpc --address=psc-consumer-ip-1 --target-service-attachment=projects/$psclab/regions/us-central1/serviceAttachments/service-1

10. 驗證消費者 Private Service Connect - 消費者虛擬私有雲

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

629d4cea87293a42.png

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

18b132b458f698b4.png

11. 驗證消費者 Private Service Connect - 生產端虛擬私有雲

在生產端虛擬私有雲中前往網路服務 → Private Service Connect已發布的服務請注意,已發布的 service-1 連線現在代表 1 項轉送規則 (連線端點)。

3387b170742d7d8d.png

12. 建立私人 DNS 區域並A 記錄

建立對應至 PSC 連線端點的私人 DNS 區域,可以從虛擬私有雲內的任何主機順暢存取生產端。

透過 Cloud Shell

gcloud dns --project=$psclab managed-zones create codelab-zone --description="" --dns-name="codelab.net." --visibility="private" --networks="consumer-vpc"

gcloud dns --project=$psclab record-sets create service1.codelab.net. --zone="codelab-zone" --type="A" --ttl="300" --rrdatas="10.100.2.10"

13. 透過 VM 驗證消費者服務的存取權

在消費者虛擬私有雲中,我們會透過存取消費者端點 service1.codelabs.net 來建立 VM,以測試連至地端部署服務的連線

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

gcloud compute instances create consumer-vm \
    --zone=us-central1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --subnet=subnet-101 \
    --no-address

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

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

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

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,以對 dns FQDN service1.codelab.net 執行 curl 指令,驗證連至內部部署服務的連線。如果逾時,請重試。

gcloud compute ssh consumer-vm --project=$psclab --zone=us-central1-a --tunnel-through-iap

執行 curl 驗證內部部署服務連線。驗證完成後,從 VM 傳回 Cloud Shell 提示後

在 Cloud Shell 中執行 curl 指令

$ curl -v service1.codelab.net
*   Trying 10.100.2.10...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5650fc3390f0)
* Connected to service1.codelab.net (10.100.2.10) port 80 (#0)
> GET / HTTP/1.1
> Host: service1.codelab.net
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Accept-Ranges: bytes
< ETag: "3380914763"
< Last-Modified: Mon, 05 Dec 2022 15:10:56 GMT
< Expires: Mon, 05 Dec 2022 15:15:41 GMT
< Cache-Control: max-age=0
< Content-Length: 37
< Date: Mon, 05 Dec 2022 15:15:41 GMT
< Server: lighttpd/1.4.53
< 
Welcome to my on-premise service!!

以下提供從內部部署服務擷取的範例,請注意「來源 IP 位址 172.16.0.2」來自 TCP Proxy 子網路範圍 172.16.0.0/23

6dafe24917c937cb.png

14. 清理工具清理

刪除 Producer 元件

在 Cloud Shell 中刪除生產端元件

gcloud compute instances delete test-box-us-central1 --zone=us-central1-a --quiet

gcloud compute service-attachments delete service-1 --region=us-central1 --quiet 

gcloud compute forwarding-rules delete tcp-ilb-psc --region=us-central1 --quiet

gcloud compute target-tcp-proxies delete on-premise-svc-tcpproxy --region=us-central1 --quiet

gcloud compute backend-services delete on-premise-service-backend --region=us-central1 --quiet

gcloud compute network-endpoint-groups delete on-prem-service-neg --zone=us-central1-a --quiet

gcloud compute networks subnets delete psc-nat-subnet subnet-201 proxy-subnet-us-central --region=us-central1 --quiet

gcloud compute firewall-rules delete ssh-iap fw-allow-proxy-only-subnet allow-to-ingress-nat-subnet fw-allow-health-check --quiet

gcloud compute health-checks delete on-prem-service-hc --region=us-central1 --quiet

gcloud compute networks delete producer-vpc --quiet

15. 消費者清理

刪除消費端元件

在 Cloud Shell 中刪除取用端元件

gcloud compute instances delete consumer-vm --zone=us-central1-a --quiet

gcloud compute forwarding-rules delete psc-consumer-1 --region=us-central1 --quiet

gcloud compute addresses delete psc-consumer-ip-1 --region=us-central1 --quiet

gcloud compute networks subnets delete subnet-101 subnet-102 --region=us-central1 --quiet

gcloud compute firewall-rules delete ssh-iap-consumer --quiet

gcloud dns record-sets delete service1.codelab.net --type=A --zone=codelab-zone --quiet

gcloud dns managed-zones delete codelab-zone --quiet 

gcloud compute networks delete consumer-vpc --quiet 

16. 恭喜

恭喜,您已成功透過 TCP Proxy 設定和驗證 Private Service Connect。

您建立了生產端基礎架構,並在生產端虛擬私有雲中新增一項指向內部部署服務的服務連結。您已瞭解如何在消費者虛擬私有雲中建立消費者端點,讓該端點連線至地端部署服務。

後續步驟

查看一些程式碼研究室…

其他資訊與影片

參考文件