1. 簡介
Cloud Load Balancing 支援以負載平衡的方式,將流量轉送至延伸到 Google Cloud 以外的端點,例如可使用混合式連線連線的地端部署資料中心和其他公有雲。
混合型策略是務實的解決方案,可讓您因應瞬息萬變的市場需求並逐步翻新應用程式。這可能是暫時的混合部署,能讓您遷移至現代雲端解決方案,或貴組織的 IT 基礎架構的永久設備。
設定混合型負載平衡機制後,您就能將 Cloud Load Balancing 網路功能的優勢帶入 Google Cloud 以外的現有基礎架構上。
如要在其他虛擬私有雲網路中提供混合型服務,則可以使用 Private Service Connect 發布服務。將服務連結放在內部區域性 HTTP(S) 負載平衡器前方,其他虛擬私有雲網路中的用戶端就能存取在地端部署或其他雲端環境中運作的 混合型服務。
建構項目
在本程式碼研究室中,您會使用網路端點群組,建立具備混合式連線能力與地端部署服務的內部 HTTP(S) 負載平衡器。在這個程式碼研究室中,用戶端虛擬私有雲可以使用通訊埠 80 (通訊埠 443) 與地端部署服務進行通訊。
課程內容
- 如何建立採用混合型 NEG 後端的內部 HTTP(S) 負載平衡器
- 如何建立 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 | 用來與內部部署服務直接通訊的 Proxy 子網路 |
130.211.0.0/22、35.191.0.0/16 |
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 分配作業位於虛擬私有雲層級,而非負載平衡器層級。您必須在使用 Envoy 型負載平衡器的虛擬網路 (VPC) 中,為每個區域建立一個僅限 Proxy 的子網路 。假如您在同一個區域和同一個虛擬私有雲網路中部署多個負載平衡器,這兩個負載平衡器會共用相同的 Proxy 專用子網路,以便進行負載平衡。
- 用戶端會連線至負載平衡器轉送規則的 IP 位址和通訊埠。
- 每個 Proxy 都會監聽根據對應負載平衡器轉送規則指定的 IP 位址和通訊埠。其中一個 Proxy 接收並終止用戶端的網路連線。
- 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
為僅限 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:通訊埠端點新增至混合型 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 控制台中,依序前往「Network Services」(網路服務) →「Load Balancing」(負載平衡) →「Load Balancers」(負載平衡器)。請注意,1 個 NEG 是「Green」表示成功對地端部署服務執行健康狀態檢查
選取 ‘on-premise-svc-url-map' 會產生前端 IP 位址,並識別後端服務。
5. 查看從內部部署環境得知的路徑
依序前往「虛擬私有雲網路」→「路徑」。請注意,內部服務子網路 192.168.1.0/27
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 提示。依據步驟 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」查看剛剛建立的服務連結
選取「Service-1」Service-1則能提供更多詳細資料,包括用戶用來建立 Private Service 連線的服務連結 URI。請記下 URI,因為該 URI 將在後續步驟中用到。
服務連結詳細資料:projects/<專案名稱>/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 - 消費者虛擬私有雲
在消費者虛擬私有雲中,前往「Network Services」(網路服務) →「Private Service Connect」(Private Service Connect) →「Connected Endpoints」(連線端點),驗證私人服務連線是否成功。請記下我們先前建立的 psc-consumer-1 連線和對應的 IP 位址。
選取 psc-consumer-1 詳細資料時,系統會提供服務連結 URI
10. 驗證消費者 Private Service Connect - 生產端虛擬私有雲
在生產端虛擬私有雲中依序前往「Network Services」(網路服務) →「Private Service Connect」(Private Service Connect) →「Published Service」(已發布服務),確認私人服務連線是否成功。請注意,已發布的 service-1 連線現在代表 1 項轉送規則 (連線端點)。
11. 建立私人 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"
12. 透過 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.13 來自 Proxy 子網路範圍 172.16.0.0/23
13. 清理工具清理
刪除 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 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. 消費者清理
刪除消費端元件
在 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
15. 恭喜
恭喜!您已成功使用內部 HTTP(S) 負載平衡器設定和驗證 Private Service Connect。
您建立了生產端基礎架構,並在生產端虛擬私有雲中新增一項指向內部部署服務的服務連結。您已瞭解如何在消費者虛擬私有雲中建立消費者端點,以便連線至地端部署服務。
後續步驟
查看一些程式碼研究室…
- 透過私人服務發布及使用 GKE 服務
- 使用 Private Service Connect 發布及使用服務
- 使用 Private Service Connect 和內部 TCP Proxy 負載平衡器,透過混合型網路連線至地端部署服務