使用 Private Service Connect 和混合式 NEG 搭配內部 HTTP(s) 負載平衡器,透過混合型網路連線至地端部署服務

1. 簡介

Cloud Load Balancing 支援將流量負載平衡至 Google Cloud 以外的端點,例如地端部署資料中心和其他公有雲,您可以使用混合式連線能力連線至這些端點。

混合策略是務實的解決方案,可協助您因應不斷變化的市場需求,並逐步將應用程式現代化。這可能是暫時的混合式部署,可讓您遷移至現代化雲端式解決方案,也可能是貴機構 IT 基礎架構的永久配置。

設定混合式負載平衡後,您還能將 Cloud Load Balancing 的網路功能優勢,帶給在 Google Cloud 以外現有基礎架構上執行的服務。

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

建構項目

在本程式碼研究室中,您將使用網路端點群組,透過混合式連線能力建立內部 HTTP(S) 負載平衡器,連線至地端部署服務。消費者虛擬私有雲將能使用通訊埠 80 與地端部署服務通訊,通訊埠 443 不在本程式碼研究室的範圍內。

4ad647fa51b3473e.png

課程內容

  • 如何建立以混合式 NEG 後端為基礎的內部 HTTP(S) 負載平衡器
  • 如何建立 Private Service Connect 生產端 (服務連結) 和消費者 (轉送規則)

軟硬體需求

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

建立混合式連線

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

啟用全域動態轉送的 Cloud Router 會透過 BGP 瞭解特定端點,並將其程式化到 Google Cloud 虛擬私有雲網路中。不支援區域動態轉送。也不支援靜態路徑。

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

如需操作說明,請參閱:

自訂路徑通告

下列子網路需要 Cloud Router 向地端部署網路通告自訂路徑,確保地端部署防火牆規則已更新。

子網路

說明

172.16.0.0/23

用來直接與內部部署服務通訊的 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. 設定 Producer

建立生產端虛擬私有雲

在 Cloud Shell 中執行下列操作:

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

建立 Producer 子網路

在 Cloud Shell 中執行下列操作:

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

為內部負載平衡器預留 IP 位址

在 Cloud Shell 中執行下列操作,使用 Private Service Connect 時不支援 SHARED_VIP,請改用 GCE_ENDPOINT

gcloud compute addresses create lb-ip \
    --region=us-central1 \
    --subnet=subnet-202 \
    --purpose=GCE_ENDPOINT

使用 compute addresses describe 指令查看已分配的 IP 位址

gcloud compute addresses describe lb-ip  --region=us-central1 | grep address:

建立區域 Proxy 子網路

Proxy 分配是在 VPC 層級,而非負載平衡器層級。您必須在使用 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

建立 Producer 防火牆規則

設定 防火牆規則,允許 Private Service Connect 端點與服務附件之間的流量。在程式碼實驗室中,建立 Ingress 防火牆規則,允許網路位址轉譯 (NAT) 子網路 100.100.10.0/24 存取 Private Service Connect 服務連結 (內部負載平衡器)。

在 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

為僅限 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

設定混合式連線 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:Port 端點新增至混合式 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 http http-health-check \
    --region=us-central1 \
    --use-serving-port

在 Cloud Shell 中,為利用混合式 NEG 的地端後端建立後端服務

 gcloud compute backend-services create on-premise-service-backend \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --health-checks=http-health-check \
      --health-checks-region=us-central1 \
      --region=us-central1

在 Cloud Shell 中,將混合式 NEG 後端新增至後端服務。如果是 RATE,請輸入後端應處理的最高 RATE。

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

在 Cloud Shell 中建立網址對應,將傳入要求轉送至後端服務

gcloud compute url-maps create on-prem-svc-url-map \
    --default-service on-premise-service-backend \
    --region=us-central1

建立 HTTP 目標 Proxy

gcloud compute target-http-proxies create proxy-subnet-us-central\
    --url-map=on-prem-svc-url-map \
    --url-map-region=us-central1 \
    --region=us-central1

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

 gcloud compute forwarding-rules create http-hybrid-neg-fwd-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=producer-vpc \
      --subnet=subnet-202 \
      --address=lb-ip \
      --ports=80 \
      --region=us-central1 \
      --target-http-proxy=proxy-subnet-us-central \
      --target-http-proxy-region=us-central1

4. 驗證負載平衡器

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

bb5d117dee3b8b04.png

選取「on-premise-svc-url-map」‘on-premise-svc-url-map'會產生前端 IP 位址,並識別後端服務

128a7e85e8069097.png

5. 查看從內部部署環境學到的路徑

前往「VPC Network」→「Routes」(虛擬私有雲網路 → 路徑)。請注意,系統已瞭解地端部署服務子網路 192.168.1.0/27

d1ab51b79aeea9d8.png

6. 驗證與地端服務的連線

我們將從 Producer VPC 建立 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 提示。根據步驟 4 中識別的輸出內容,替換內部負載平衡器 IP。

user@test-box-us-central1:~$ curl -v 10.20.1.2
* Expire in 0 ms for 6 (transfer 0x55b7725c10f0)
*   Trying 10.20.1.2...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b7725c10f0)
* Connected to 10.20.1.2 (10.20.1.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.20.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, 12 Dec 2022 03:17:20 GMT
< cache-control: max-age=0
< content-length: 37
< date: Mon, 12 Dec 2022 03:17:20 GMT
< server: lighttpd/1.4.53
< via: 1.1 google
< 
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=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

選用:如果使用共用 VPC,請在服務專案中建立服務附件

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/<region>/subnetworks/<natsubnet>

驗證 TCP 服務連結

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

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

2f84578c9f2cc361.png

選取「Service-1」Service-1可查看更多詳細資料,包括消費者用來建立 Private Service Connect 的服務連結 URI。請記下 URI,因為後續步驟會用到。

41639cb160231275.png

服務附件詳細資料:projects/<projectname>/regions/us-central1/serviceAttachments/service-1

8. 消費者設定

建立 Consumer VPC

在 Cloud Shell 中執行下列操作:

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

建立 Consumer 子網路

在 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 中建立 Consumer Endpoint 子網路

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

建立消費者端點 (轉送規則)

在 Cloud Shell 中建立靜態 IP 位址,做為 Consumer 端點

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

9. 驗證消費者 Private Service Connect - 消費者 VPC

在消費者虛擬私有雲中,前往「網路服務」→「Private Service Connect」→「已連線的端點」,確認 Private Service Connect 連線是否成功。請注意先前建立的 psc-consumer-1 連線和對應的 IP 位址。

b91ee5d5c854e60b.png

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

1dbc63217819dcd5.png

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

從供應商虛擬私有雲前往「網路服務」→「Private Service Connect」→「已發布的服務」,確認 Private Service Connect 連線是否成功。請注意,已發布的 service-1 連線現在會顯示 1 項轉送規則 (連線端點)。

951090b812a8d119.png

11. 建立私人 DNS 區域和 A 記錄

建立對應至 PSC 連線端點的私人 DNS 區域,允許從 VPC 內的任何主機無縫存取生產者。

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

12. 使用 VM 驗證消費者對生產者服務的存取權

我們將從消費者虛擬私有雲建立 VM,存取消費者端點 service1.codelabs.net,測試與地端服務的連線。

在 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.13 來自 Proxy 子網路範圍 172.16.0.0/23

30802152f51ff751.png

13. 清理 Producer

刪除製作人元件

在 Cloud Shell 中,刪除生產端 VPC 中的測試執行個體

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 http-hybrid-neg-fwd-rule --region=us-central1 --quiet

gcloud compute target-http-proxies delete proxy-subnet-us-central --region=us-central1 --quiet

gcloud compute url-maps delete on-prem-svc-url-map --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 addresses delete lb-ip --region=us-central1 --quiet

gcloud compute networks subnets delete psc-nat-subnet subnet-201 subnet-202 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 http-health-check --region=us-central1 --quiet

gcloud compute networks delete producer-vpc --quiet

14. 清理消費者資料

刪除 Consumer 元件

在 Cloud Shell 中,刪除 Consumer VPC 中的測試執行個體

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 

15. 恭喜

恭喜!您已成功設定並驗證 Private Service Connect 搭配內部 HTTP(S) 負載平衡器。

您已建立生產端基礎架構,並在指向內部部署服務的生產端 VPC 中新增服務附件。您已瞭解如何在消費者虛擬私有雲中建立消費者端點,以便連線至地端服務。

後續步驟

查看一些程式碼研究室…

延伸閱讀和影片

參考文件