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

程式碼研究室簡介
schedule76 分鐘
subject上次更新時間:2022年12月13日
account_circle作者:Deepak Michael

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

混合型策略是務實的解決方案,可讓您因應瞬息萬變的市場需求並逐步翻新應用程式。這可能是暫時的混合部署,能讓您遷移至現代雲端解決方案,或貴組織的 IT 基礎架構的永久設備。

設定混合型負載平衡機制後,您就能將 Cloud Load Balancing 網路功能的優勢帶入 Google Cloud 以外的現有基礎架構上。

如果您想在其他虛擬私有雲網路中提供混合式服務,可以使用 Private Service Connect 發布服務。將服務連結放在內部區域性 HTTP(S) 負載平衡器前方,其他虛擬私有雲網路中的用戶端就能存取在地端部署或其他雲端環境中運作的 混合型服務

在本程式碼研究室中,您將使用網路端點群組,為內部 HTTP(S) 負載平衡器建構 Hybrid Connectivity 至內部服務,消費者 VPC 將可使用通訊埠 80 與內部服務通訊,通訊埠 443 不在本程式碼研究室的範圍內。

4ad647fa51b3473e.png

課程內容

  • 如何使用混合 NEG 後端建立內部 HTTP(S) 負載平衡器
  • 如何建立 Private Service Connect 供應端 (服務連結) 和用戶端 (轉送規則)

軟硬體需求

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

建立混合式連線

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

啟用全域動態轉送的 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. 製作人設定

建立生產端虛擬私有雲

在 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
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 端點和服務連結之間的流量。在程式碼研究室中,您建立了輸入防火牆規則,允許 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

為僅限 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 時,請使用 ZONE,盡可能縮短 Google Cloud 與地端部署或其他雲端環境之間的地理距離。舉例來說,如果您在德國法蘭克福的地端環境中代管服務,則可以在建立 NEG 時指定 europe-west3-a Google Cloud 區域。

此外,如果您使用的是 Cloud Interconnect,用於建立 NEG 的 ZONE 應位於設定 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' 會產生前端 IP 位址,並識別後端服務。

128a7e85e8069097.png

5. 查看已知路徑的內部部署

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

d1ab51b79aeea9d8.png

6. 驗證與內部部署服務的連線狀態

我們會從 Producers 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

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

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

選用步驟:前往「Network Services」→「Private Service Connect」,查看新建立的服務附件

2f84578c9f2cc361.png

選取「Service-1」可提供更多詳細資料,包括用戶建立私人服務連線時使用的服務連結 URI。請記下 URI,因為後續步驟會用到。

41639cb160231275.png

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

8. 消費者設定

建立用戶端虛擬私有雲

在 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

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

在消費者虛擬私有雲中,前往「Network Services」→「Private Service Connect」→「Connected Endpoints」,即可驗證 Private Service Connect 是否連線成功。請注意已建立的 psc-consumer-1 連線,以及先前建立的對應 IP 位址。

b91ee5d5c854e60b.png

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

1dbc63217819dcd5.png

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

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

951090b812a8d119.png

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

建立與 PSC 連線端點對應的不公開 DNS 區域,以便從 VPC 中的任何主機順暢存取 Producer。

透過 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 驗證消費者對 Producers 服務的存取權

在消費者虛擬私有雲中,我們將建立 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 中,在消費者 VPC 中建立測試執行個體

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 中刪除消費者 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. 恭喜

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

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

後續步驟

查看一些程式碼研究室…

其他參考資料和影片

參考文件