區域性內部 Proxy 網路負載平衡器是以 Proxy 為基礎的區域性第 4 層負載平衡器,可讓您透過內部 IP 位址執行及擴充 TCP 服務流量,且該 IP 位址只能由相同虛擬私有雲網路中的用戶端,或連線至虛擬私有雲網路的用戶端存取。
開始之前,請先參閱「區域性內部 Proxy 網路負載平衡器總覽」。
本指南說明如何設定區域性內部 Proxy 網路負載平衡器,並搭配代管執行個體群組 (MIG) 後端。在本範例中,您將設定下列部署作業:
在本範例中,我們會使用負載平衡器,將 TCP 流量分配到 REGION_A 區域中兩個可用區代管執行個體群組的後端 VM。在本範例中,服務是一組 Apache 伺服器,設定為在通訊埠 110 上回應。許多瀏覽器不允許使用通訊埠 110,因此測試部分會使用 curl。
區域性內部 Proxy 網路負載平衡器是區域性負載平衡器。所有負載平衡器元件都必須與負載平衡器位於相同區域。
權限
如要依照本指南的說明操作,您必須能在專案中建立執行個體與修改網路。您必須是專案擁有者或編輯者,或具備下列所有 Compute Engine IAM 角色:
| 工作 | 必要角色 |
|---|---|
| 建立網路、子網路和負載平衡器元件 | 網路管理員 |
| 新增與移除防火牆規則 | 安全管理員 |
| 建立執行個體 | Compute 執行個體管理員 |
如需詳細資訊,請參閱下列指南:
設定網路和子網路
您需要一個虛擬私有雲網路,當中包含兩個子網路:一個用於負載平衡器的後端,另一個用於負載平衡器的 Proxy。區域性內部 Proxy 網路負載平衡器為區域性。如果流量來源位於與負載平衡器相同區域的子網路,虛擬私有雲網路中的流量就會轉送至負載平衡器。
本範例使用下列虛擬私有雲網路、區域和子網路:
網路:網路是名為
lb-network的自訂模式虛擬私有雲網路。後端子網路。
REGION_A區域中名為backend-subnet的子網路使用10.1.2.0/24做為主要 IP 範圍。Proxy 子網路。
REGION_A區域中名為proxy-only-subnet的子網路使用10.129.0.0/23做為主要 IP 範圍。
為示範全域存取權,本範例也會在不同區域 (REGION_B) 建立第二個測試用戶端 VM,以及主要 IP 位址範圍為 10.3.4.0/24 的子網路。
建立網路和子網路
控制台
前往 Google Cloud 控制台的「VPC Networks」(虛擬私有雲網路) 頁面。
按一下「建立虛擬私有雲網路」。
在「Name」(名稱) 中輸入
lb-network。在「Subnets」(子網路) 區段中,將「Subnet creation mode」(子網路建立模式) 設為「Custom」(自訂)。
為負載平衡器的後端建立子網路。在「New subnet」(新的子網路) 區段中,輸入下列資訊:
- Name (名稱):
backend-subnet - Region (區域):
REGION_A - IP address range (IP 位址範圍):
10.1.2.0/24
- Name (名稱):
按一下「完成」。
按一下 [新增子網路]。
建立子網路,示範全域存取權。在「New subnet」(新增子網路) 區段中,輸入下列資訊:
- Name (名稱):
test-global-access-subnet - Region (區域):
REGION_B - IP address range (IP 位址範圍):
10.3.4.0/24
- Name (名稱):
按一下「完成」。
點選「建立」。
gcloud
使用
gcloud compute networks create指令建立自訂虛擬私有雲網路:gcloud compute networks create lb-network --subnet-mode=custom
使用
gcloud compute networks subnets create指令,在REGION_A區域的lb-network網路中建立子網路:gcloud compute networks subnets create backend-subnet \ --network=lb-network \ --range=10.1.2.0/24 \ --region=REGION_A
將 REGION_A 替換為目標 Google Cloud 區域的名稱。
使用
gcloud compute networks subnets create指令 ,在REGION_B區域的lb-network網路中建立子網路:gcloud compute networks subnets create test-global-access-subnet \ --network=lb-network \ --range=10.3.4.0/24 \ --region=REGION_B
將 REGION_B 替換為要建立第二個子網路來測試全域存取權的 Google Cloud 區域。
建立僅限 Proxy 的子網路
Proxy 專用子網路提供一組 IP 位址,Google 會使用這些位址代您執行 Envoy Proxy。Proxy 會終止用戶端連線,並建立連至後端的新連線。
lb-network 虛擬私有雲網路 REGION_A 區域中的所有 Envoy 型負載平衡器都會使用這個僅限 Proxy 子網路。
控制台
如果您使用的是 Google Cloud 控制台,可以稍後再前往「Load balancing」(負載平衡) 頁面建立僅限 Proxy 子網路。
如要立即建立僅限 Proxy 的子網路,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「VPC networks」(虛擬私有雲網路) 頁面。
前往「VPC networks」(虛擬私有雲網路) - 按一下共用虛擬私有雲網路的名稱:
lb-network。 - 按一下 [新增子網路]。
- 在「Name」(名稱) 中輸入
proxy-only-subnet。 - 在「Region」(區域) 中選取
REGION_A。 - 將「用途」設為「區域性代管 Proxy」。
- 在「IP address range」(IP 位址範圍) 中,輸入
10.129.0.0/23。 - 按一下「新增」。
gcloud
使用 gcloud compute networks subnets
create 指令建立僅限 Proxy 的子網路。
gcloud compute networks subnets create proxy-only-subnet \
--purpose=REGIONAL_MANAGED_PROXY \
--role=ACTIVE \
--region=REGION_A \
--network=lb-network \
--range=10.129.0.0/23
建立防火牆規則
這個範例需要下列防火牆規則:
fw-allow-ssh:輸入規則,適用於進行負載平衡的執行個體,允許來自任何位址的 TCP 通訊埠22傳入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 範圍。本範例使用目標標記allow-ssh。fw-allow-health-check:輸入規則,適用於負載平衡的執行個體,允許來自Google Cloud 健康狀態檢查探測範圍的所有 TCP 流量。本範例使用目標標記allow-health-check。fw-allow-proxy-only-subnet:允許從僅限 Proxy 的子網路連線至後端的輸入規則。
如果沒有這些防火牆規則,預設拒絕輸入規則將會封鎖傳入至後端執行個體的流量。
目標標記會定義後端執行個體。如果沒有目標標記,防火牆規則會套用至虛擬私有雲網路中的所有後端執行個體。建立後端 VM 時,請務必加入指定的目標標記,如「建立代管執行個體群組」一節所示。
控制台
- 前往 Google Cloud 控制台的「Firewall policies」(防火牆政策) 頁面。
前往「Firewall policies」(防火牆政策) 頁面 - 按一下「Create firewall rule」(建立防火牆規則),建立允許連入 SSH 連線的規則:
- Name (名稱):
fw-allow-ssh - Network (網路):
lb-network - Direction of traffic (流量方向):「Ingress」(輸入)
- Action on match (相符時執行的動作):Allow (允許)
- 目標:指定的目標標記
- 「Target tags」(目標標記):
allow-ssh - 來源篩選器:「IPv4 範圍」
- Source IPv4 ranges (來源 IPv4 範圍):
0.0.0.0/0 - 「通訊協定和通訊埠」:
- 選擇「指定的通訊協定和通訊埠」。
- 勾選「TCP」核取方塊,然後輸入
22做為「Port number」(通訊埠編號)。
- Name (名稱):
- 點選「建立」。
- 第二次點選「Create firewall rule」(建立防火牆規則),建立允許Google Cloud 健康狀態檢查的規則:
- Name (名稱):
fw-allow-health-check - Network (網路):
lb-network - Direction of traffic (流量方向):「Ingress」(輸入)
- Action on match (相符時執行的動作):Allow (允許)
- 目標:指定的目標標記
- 「Target tags」(目標標記):
allow-health-check - 來源篩選器:「IPv4 範圍」
- 來源 IPv4 範圍:
35.191.0.0/16 - 「通訊協定和通訊埠」:
- 選擇「指定的通訊協定和通訊埠」。
- 勾選「TCP」TCP核取方塊,然後輸入
80做為通訊埠編號。
最佳做法是將這項規則限制在與健康狀態檢查所用通訊協定和通訊埠相符的範圍內。如果通訊協定和通訊埠使用tcp:80, Google Cloud 可以使用通訊埠80上的 HTTP 與 VM 聯絡,但無法使用通訊埠443上的 HTTPS 與 VM 聯絡。
- Name (名稱):
- 點選「建立」。
- 第三次按一下「Create firewall rule」(建立防火牆規則),建立規則,允許負載平衡器的 Proxy 伺服器連線至後端:
- Name (名稱):
fw-allow-proxy-only-subnet - Network (網路):
lb-network - Direction of traffic (流量方向):「Ingress」(輸入)
- Action on match (相符時執行的動作):Allow (允許)
- 目標:指定的目標標記
- 「Target tags」(目標標記):
allow-proxy-only-subnet - 來源篩選器:「IPv4 範圍」
- Source IPv4 ranges (來源 IPv4 範圍):
10.129.0.0/23 - 「通訊協定和通訊埠」:
- 選擇「指定的通訊協定和通訊埠」。
- 勾選「TCP」TCP核取方塊,然後輸入
80做為通訊埠編號。
- Name (名稱):
- 點選「建立」。
gcloud
建立
fw-allow-ssh防火牆規則,允許 SSH 連線至具有網路標記allow-ssh的 VM。如果省略source-ranges,Google Cloud 會將規則解讀為任何來源。gcloud compute firewall-rules create fw-allow-ssh \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
建立
fw-allow-health-check規則,允許 Google Cloud健康狀態檢查。這個範例可允許來自健康狀態檢查探測器的所有 TCP 流量,但您可以根據自己的需求設定一組較少的通訊埠。gcloud compute firewall-rules create fw-allow-health-check \ --network=lb-network \ --action=allow \ --direction=ingress \ --source-ranges=
35.191.0.0/16\ --target-tags=allow-health-check \ --rules=tcp:80建立
fw-allow-proxy-only-subnet規則,允許區域的 Envoy Proxy 連線至後端。將--source-ranges設為 Proxy 專用子網路的分配範圍,在本範例中為10.129.0.0/23。gcloud compute firewall-rules create fw-allow-proxy-only-subnet \ --network=lb-network \ --action=allow \ --direction=ingress \ --source-ranges=10.129.0.0/23 \ --target-tags=allow-proxy-only-subnet \ --rules=tcp:80
保留負載平衡器的 IP 位址
如要為負載平衡器保留靜態內部 IP 位址,請參閱「保留新的靜態內部 IPv4 或 IPv6 位址」。
建立代管執行個體群組
本節說明如何在 REGION_A 區域中,為負載平衡器建立兩個代管執行個體群組 (MIG) 後端。MIG 提供的 VM 執行個體會執行後端 Apache 伺服器,用於這個範例區域性內部 Proxy 網路負載平衡器。一般來說,區域性內部 Proxy 網路負載平衡器不會用於 HTTP 流量,但 Apache 軟體通常用於測試。
控制台
建立執行個體範本。前往 Google Cloud 控制台的「Instance templates」(執行個體範本) 頁面。
前往「Instance templates」(執行個體範本)
- 按一下「Create instance template」(建立執行個體範本)。
- 在「Name」(名稱) 中輸入
int-tcp-proxy-backend-template。 - 確認「開機磁碟」設為 Debian 映像檔,例如「Debian GNU/Linux 12 (bookworm)」。這些操作說明中的指令僅適用於 Debian,例如
apt-get。 - 點選「進階選項」。
- 按一下「Networking」(網路),設定下列欄位:
- 在「Network tags」(網路標記) 部分,輸入
allow-ssh、allow-health-check和allow-proxy-only-subnet。 - 在「網路介面」部分,選取下列項目:
- Network (網路):
lb-network - Subnet (子網路):
backend-subnet
- Network (網路):
- 在「Network tags」(網路標記) 部分,輸入
按一下 [Management] (管理)。在「Startup script」(開機指令碼) 欄位中輸入下列指令碼。
#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2
點選「建立」。
建立代管執行個體群組。前往 Google Cloud 控制台的「Instance groups」(執行個體群組) 頁面。
- 點選「建立執行個體群組」。
- 選取「New managed instance group (stateless)」(新增代管執行個體群組 (無狀態))。詳情請參閱「無狀態或有狀態的 MIG」。
- 在「Name」(名稱) 中輸入
mig-a。 - 選取「Location」(位置) 下方的「Single zone」(單一可用區)。
- 在「Region」(區域) 中選取
REGION_A。 - 在「Zone」(可用區) 中選取
ZONE_A1。 - 在「Instance template」(執行個體範本) 下,選取
int-tcp-proxy-backend-template。 指定要在群組中建立的執行個體數量。
在本範例中,請在「Autoscaling」(自動調度資源) 下方指定下列選項:
- 在「Autoscaling mode」(自動調度資源模式),選取「
Off:do not autoscale」。 - 在「Maximum number of instances」(執行個體數量上限) 中輸入
2。
- 在「Autoscaling mode」(自動調度資源模式),選取「
在「Port mapping」(通訊埠對應) 部分,按一下「Add port」(新增通訊埠)。
- 在「Port name」(通訊埠名稱) 輸入
tcp80。 - 在「Port number」(通訊埠編號) 輸入
80。
- 在「Port name」(通訊埠名稱) 輸入
點選「建立」。
重複步驟 2,建立第二個代管執行個體群組,並採用下列設定:
- Name (名稱):
mig-c - 可用區:
ZONE_A2其他設定則維持不變。
- Name (名稱):
gcloud
本指南中的 gcloud 操作說明假設您使用的是 Cloud Shell 或其他已安裝 bash 的環境。
使用
gcloud compute instance-templates create指令,建立含有 HTTP 伺服器的 VM 執行個體範本。gcloud compute instance-templates create int-tcp-proxy-backend-template \ --region=REGION_A \ --network=lb-network \ --subnet=backend-subnet \ --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'在
ZONE_A1可用區建立代管執行個體群組。gcloud compute instance-groups managed create mig-a \ --zone=ZONE_A1 \ --size=2 \ --template=int-tcp-proxy-backend-template
將 ZONE_A1 替換為目標 Google Cloud 區域中的可用區名稱。
在
ZONE_A2可用區建立代管執行個體群組。gcloud compute instance-groups managed create mig-c \ --zone=ZONE_A2 \ --size=2 \ --template=int-tcp-proxy-backend-template
將 ZONE_A2 替換為目標 Google Cloud 區域中其他可用區的名稱。
設定負載平衡器
控制台
開始設定
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 點選「建立負載平衡器」。
- 在「Type of load balancer」(負載平衡器類型) 部分,選取「Network Load Balancer (TCP/UDP/SSL)」(網路負載平衡器 (TCP/UDP/SSL)),然後點選「Next」(下一步)。
- 在「Proxy or passthrough」(直通或使用 Proxy) 部分,選取「Proxy load balancer」(Proxy 負載平衡器),然後點選「Next」(下一步)。
- 在「Public facing or internal」(公開或內部) 部分,選取「Internal」(內部),然後點選「Next」(下一步)。
- 在「Cross-region or single region deployment」(跨區域或單一區域部署) 部分,選取「Best for regional workloads」(最適合區域性工作負載),然後點選「Next」(下一步)。
- 按一下 [設定]。
基本設定
- 在「Name」(名稱) 中輸入
my-int-tcp-lb。 - 在「Region」(區域) 中選取
REGION_A。 - 在「Network」(網路) 中選取
lb-network。
保留僅限 Proxy 子網路
如要預留僅限 Proxy 的子網路,請按照下列步驟操作:
- 按一下「保留子網路」。
- 在「Name」(名稱) 中輸入
proxy-only-subnet。 - 在「IP address range」(IP 位址範圍) 中,輸入
10.129.0.0/23。 - 按一下「新增」。
後端設定
- 按一下「後端設定」。
- 在「Backend type」(後端類型) 部分,選取「Instance group」(執行個體群組)。
- 在「通訊協定」部分選取「TCP」。
- 在「Named port」(已命名通訊埠) 輸入
tcp80。 - 在「Health check」(健康狀態檢查) 清單中,按一下「Create a health check」(建立健康狀態檢查),然後輸入下列資訊:
- Name (名稱):
tcp-health-check - 通訊協定:TCP
- Port (通訊埠):
80
- Name (名稱):
- 點選「建立」。
- 設定第一個後端:
- 在「New backend」(新增後端) 下方,選取執行個體群組
mig-a。 - 在「Port numbers」(通訊埠編號) 的部分,輸入
80。 - 保留其餘預設值,然後點選「完成」。
- 在「New backend」(新增後端) 下方,選取執行個體群組
- 設定第二個後端:
- 點選「新增後端」。
- 在「New backend」(新增後端) 下方,選取執行個體群組
mig-c。 - 在「Port numbers」(通訊埠編號) 的部分,輸入
80。 - 保留其餘預設值,然後點選「完成」。
- 在 Google Cloud 控制台中,確認「Backend configuration」(後端設定) 旁有勾號。如未顯示,請重新檢查一遍,確認已完成所有步驟。
前端設定
- 點選「前端設定」。
- 在「Name」(名稱) 中輸入
int-tcp-forwarding-rule。 - 在「子網路」部分,選取「backend-subnet」。
- 在「IP address」(IP 位址) 部分,選取先前預留的 IP 位址:LB_IP_ADDRESS
- 在「Port number」(通訊埠編號) 部分,輸入
110。轉送規則只會轉送目的地通訊埠相符的封包。 - 在本範例中,請勿啟用「Proxy Protocol」,因為該通訊協定不適用於 Apache HTTP Server 伺服器軟體。詳情請參閱「Proxy 通訊協定」。
- 按一下「完成」。
- 在 Google Cloud 控制台中,確認「Frontend configuration」(前端設定) 旁有勾號。如未顯示,請重新檢查一遍,確認已完成上述所有步驟。
檢查並完成
- 點選「檢查並完成」。
- 查看負載平衡器設定。
- 選用:按一下「Equivalent code」(對等程式碼),即可查看用於建立負載平衡器的 REST API 要求。
- 點選「建立」。
gcloud
建立區域性健康狀態檢查。
gcloud compute health-checks create tcp tcp-health-check \ --region=REGION_A \ --use-serving-port
建立後端服務。
gcloud compute backend-services create internal-tcp-proxy-bs \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=TCP \ --region=REGION_A \ --health-checks=tcp-health-check \ --health-checks-region=REGION_A
將執行個體群組新增至後端服務。
gcloud compute backend-services add-backend internal-tcp-proxy-bs \ --region=REGION_A \ --instance-group=mig-a \ --instance-group-zone=ZONE_A1 \ --balancing-mode=UTILIZATION \ --max-utilization=0.8
gcloud compute backend-services add-backend internal-tcp-proxy-bs \ --region=REGION_A \ --instance-group=mig-c \ --instance-group-zone=ZONE_A2 \ --balancing-mode=UTILIZATION \ --max-utilization=0.8
建立內部目標 TCP Proxy。
gcloud compute target-tcp-proxies create int-tcp-target-proxy \ --backend-service=internal-tcp-proxy-bs \ --proxy-header=NONE \ --region=REGION_A
如要開啟Proxy 標頭,請將其設為
PROXY_V1,而非NONE。在本範例中,請勿啟用 Proxy 通訊協定,因為該通訊協定不適用於 Apache HTTP Server 伺服器軟體。詳情請參閱「Proxy 通訊協定」。建立轉送規則。在
--ports中,指定 1 到 65535 之間的單一通訊埠編號。本範例使用通訊埠110。轉送規則只會轉送目的地通訊埠相符的封包。gcloud compute forwarding-rules create int-tcp-forwarding-rule \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=backend-subnet \ --region=REGION_A \ --target-tcp-proxy=int-tcp-target-proxy \ --target-tcp-proxy-region=REGION_A \ --address=int-tcp-ip-address \ --ports=110
測試負載平衡器
如要測試負載平衡器,請在負載平衡器所在的區域建立用戶端 VM。接著,將流量從用戶端傳送至負載平衡器。
建立用戶端 VM
在負載平衡器所在的區域建立用戶端 VM (client-vm)。
控制台
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
點選「建立執行個體」。
將「Name」(名稱) 設定為
client-vm。將「可用區」設為
ZONE_A1。點選「進階選項」。
按一下「Networking」(網路),設定下列欄位:
- 在「Network tags」(網路標記) 部分,輸入
allow-ssh。 - 在「網路介面」部分,選取下列項目:
- Network (網路):
lb-network - Subnet (子網路):
backend-subnet
- Network (網路):
- 在「Network tags」(網路標記) 部分,輸入
點選「建立」。
gcloud
用戶端 VM 必須與負載平衡器位於相同的虛擬私有雲網路和區域。不一定要位於相同子網路或可用區。用戶端與後端 VM 使用相同的子網路。
gcloud compute instances create client-vm \
--zone=ZONE_A1 \
--image-family=debian-12 \
--image-project=debian-cloud \
--tags=allow-ssh \
--subnet=backend-subnet
將流量傳送至負載平衡器
負載平衡器設定完成後,即可測試將流量傳送至負載平衡器的 IP 位址。
使用 SSH 連線至用戶端執行個體。
gcloud compute ssh client-vm \ --zone=ZONE_A1
確認負載平衡器是否正常提供後端主機名稱。
使用
compute addresses describe指令查看負載平衡器的 IP 位址:gcloud compute addresses describe int-tcp-ip-address \ --region=REGION_A
記下 IP 位址。
將流量傳送至負載平衡器。請將 IP_ADDRESS 替換為負載平衡器的 IP 位址。
curl IP_ADDRESS:110
額外設定選項
本節將進一步說明設定範例,提供其他設定選項。所有工作皆為選填。這些步驟的執行順序不拘。
建立具備 TLS 路由的負載平衡器
本節說明如何建立可使用 SNI 轉送功能的負載平衡器。Proxy 網路負載平衡器可根據 TLS 握手期間提供的伺服器名稱指示 (SNI) 主機名稱,將流量轉送至特定後端服務。
如要建立這個負載平衡器,請使用先前在本頁建立的網路、子網路和防火牆規則。您設定了下圖所示的部署作業:
建立代管執行個體群組後端
本節說明如何為負載平衡器建立代管執行個體群組 (MIG) 後端。MIG 會提供 VM 執行個體,用於執行本範例的後端伺服器。
本指南中的 Google Cloud CLI 操作說明假設您使用的是 Cloud Shell,或其他已安裝 bash 的環境。
建立執行個體範本,並在通訊埠 443 公開「echo」HTTPS 服務。
gcloud compute instance-templates create INSTANCE_TEMPLATE_NAME \ --region=REGION_A \ --network=NETWORK \ --subnet=SUBNET_A \ --stack-type=IPv4_ONLY \ --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \ --image-family=debian-12 \ --image-project=debian-cloud \ --metadata=startup-script='#! /bin/bash sudo sed -i "s/^#DNS=.*/DNS=8.8.8.8 8.8.4.4/" /etc/systemd/resolved.conf sudo systemctl restart systemd-resolved sudo rm -rf /var/lib/apt/lists/* sudo apt-get -y clean sudo apt-get -y update sudo apt-get -y install ca-certificates curl gnupg software-properties-common sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" sudo apt-get -y update sudo apt-get -y install docker-ce sudo which docker echo "{ \"registry-mirrors\": [\"https://mirror.gcr.io\"] }" | sudo tee -a /etc/docker/daemon.json sudo service docker restart sudo docker run -e HTTPS_PORT=9999 -p 443:9999 --rm -dt mendhak/http-https-echo:22'更改下列內容:
INSTANCE_TEMPLATE_NAME:執行個體範本的名稱。REGION_A:執行個體範本的區域。NETWORK:網路名稱。SUBNET_A:子網路名稱。
依據執行個體範本建立代管執行個體群組:
gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \ --zone=ZONE_A \ --size=2 \ --template=INSTANCE_TEMPLATE_NAME
將
ZONE_A替換為執行個體群組的可用區。設定代管執行個體群組的服務通訊埠名稱:
gcloud compute instance-groups managed set-named-ports INSTANCE_GROUP_NAME \ --named-ports=PORT_NAME:PORT_NUMBER \ --zone=ZONE_A
更改下列內容:
PORT_NAME:服務通訊埠的名稱,例如tcp443。PORT_NUMBER:服務通訊埠的通訊埠編號,例如443。
設定防火牆
設定防火牆規則,允許從負載平衡器和健康狀態檢查探測傳送至後端執行個體的流量。
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
--network=NETWORK \
--action=allow \
--direction=ingress \
--source-ranges=35.191.0.0/16 \
--target-tags=allow-health-check \
--rules=tcp:443
將 FIREWALL_RULE_NAME 替換為防火牆規則名稱。
設定負載平衡器
建立 HTTPS 健康狀態檢查:
gcloud compute health-checks create https HTTPS_HEALTH_CHECK_NAME \ --region=REGION_A \ --port=HC_PORT更改下列內容:
HTTPS_HEALTH_CHECK_NAME:健康狀態檢查的名稱。HC_PORT:健康狀態檢查的通訊埠,例如443。REGION_A:健康狀態檢查的區域。
建立後端服務:
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=TCP \ --port-name=PORT_NAME \ --health-checks=tcp-health-check \ --health-checks-region=REGION_A \ --enable-logging \ --logging-sample-rate=1.0 \ --logging-optional=INCLUDE_ALL_OPTIONAL \ --region=REGION_A更改下列內容:
BACKEND_SERVICE_NAME:後端服務的名稱。PORT_NAME:後端服務的通訊埠名稱。使用在執行個體群組上設定的相同具名通訊埠,例如tcp443。HTTPS_HEALTH_CHECK_NAME:HTTPS 健康狀態檢查的名稱。
將後端執行個體群組新增至後端服務:
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --instance-group=INSTANCE_GROUP_NAME \ --instance-group-zone=ZONE_A \ --region=REGION_A更改下列內容:
INSTANCE_GROUP_NAME:後端執行個體群組的名稱。ZONE_A:執行個體群組的可用區。
建立目標 TCP Proxy。
gcloud beta compute target-tcp-proxies create TARGET_TCP_PROXY_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --proxy-header=NONE \ --region=REGION_A將
TARGET_TCP_PROXY_NAME替換為目標 TCP Proxy 的名稱。建立 TLS 路由規格,並儲存至 YAML 檔案。
cat <<EOF | tee YAML_FILE_NAME name: TLS_ROUTE_NAME targetProxies: - projects/PROJECT_NUMBER/locations/REGION_A/targetTcpProxies/TARGET_TCP_PROXY_NAME rules: - matches: - sniHost: - example.com action: destinations: - serviceName: projects/PROJECT_NUMBER/locations/REGION_A/backendServices/BACKEND_SERVICE_NAME EOF更改下列內容:
YAML_FILE_NAME:YAML 檔案的名稱,例如tls-route.yaml。TLS_ROUTE_NAME:TLS 路由的名稱。PROJECT_NUMBER:專案編號。
使用 YAML 規格檔案建立 TLS 路由資源。
gcloud network-services tls-routes import TLS_ROUTE_NAME \ --source=YAML_FILE_NAME \ --location=REGION_A
建立轉送規則。
gcloud compute forwarding-rules create FORWARDING_RULE_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET_A \ --region=REGION_A \ --target-tcp-proxy=TARGET_TCP_PROXY_NAME \ --target-tcp-proxy-region=REGION_A \ --address=IP_ADDRESS \ --ports=PORT_NUMBER
更改下列內容:
FORWARDING_RULE_NAME:轉送規則的名稱。NETWORK:網路名稱。SUBNET_A:子網路名稱,須與負載平衡器位於相同區域。IP_ADDRESS:負載平衡器的 IP 位址。PORT_NUMBER:轉送規則使用的通訊埠,例如443。
測試負載平衡器
負載平衡器設定完成後,即可測試將流量傳送至負載平衡器的 IP 位址。
確認您可以透過負載平衡器存取 HTTPS 服務。
curl https://example.com --resolve example.com:443:IP_ADDRESS -k
您會看到指令傳回代管執行個體群組中其中一個 VM 的回應,並在控制台輸出下列內容。
"path": "/", "headers": { "host": "example.com", "user-agent": "curl/7.81.0", "accept": "*/*" }, "method": "GET", "body": "", "fresh": false, "hostname": "example.com", "ip": "::ffff:10.142.0.2", "ips": [], "protocol": "https", "query": {}, "subdomains": [], "xhr": false, "os": { "hostname": "0cd3aec9b351" }, "connection": { "servername": "example.com" }您可以進一步驗證,如果提供的 SNI 主機名稱與 TLS 路由不符,或根本未提供 SNI 主機名稱,系統就會捨棄要求。
- 使用與 example.com 不符的 SNI 主機名稱執行測試,確保連線遭到拒絕。
curl https://unknown.com --resolve unknown.com:443:IP_ADDRESS -k
- 使用不含 TLS 的純文字連線執行測試,確保連線遭到拒絕。
curl example.com:443 --resolve example.com:443:IP_ADDRESS -k
這些指令會傳回下列錯誤。
curl: (35) OpenSSL SSL_connect: Connection reset by peer in connection
當負載平衡器拒絕這類無效連線時,您會在
proxyStatus記錄中看到connection_refused錯誤代碼。
啟用全域存取權
您可以為負載平衡器啟用全域存取權,讓所有區域的用戶端都能存取。範例負載平衡器的後端仍須位於單一區域 (REGION_A)。
您無法修改現有的區域轉送規則來啟用全域存取權。您必須為此建立新的轉送規則。此外,建立啟用全域存取權的轉送規則後,即無法修改。如要停用全域存取權,您必須建立新的區域存取權轉送規則,並刪除先前的全域存取權轉送規則。
如要設定全域存取權,請進行下列設定變更。
控制台
為負載平衡器建立新的轉送規則:
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
在「Name」(名稱) 欄中,按一下負載平衡器。
點選「前端設定」。
按一下 [Add frontend IP and port] (新增前端 IP 和通訊埠)。
輸入新轉送規則的名稱和子網路詳細資料。
在「子網路」部分,選取「backend-subnet」。
在「IP address」(IP 位址) 部分,您可以選取與現有轉送規則相同的 IP 位址、保留新的 IP 位址,或使用臨時 IP 位址。如要在多個轉送規則中共用同一個 IP 位址,您必須在建立 IP 位址時,將 IP 位址
--purpose旗標設為SHARED_LOADBALANCER_VIP。在「Port number」(通訊埠編號) 輸入
110。在「全域存取權」部分,選取「啟用」。
按一下「完成」。
按一下「Update」。
gcloud
使用
--allow-global-access旗標,為負載平衡器建立新的轉送規則。gcloud compute forwarding-rules create int-tcp-forwarding-rule-global-access \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=backend-subnet \ --region=REGION_A \ --target-tcp-proxy=int-tcp-target-proxy \ --target-tcp-proxy-region=REGION_A \ --address=int-tcp-ip-address \ --ports=110 \ --allow-global-access
您可以使用
gcloud compute forwarding-rules describe指令,判斷轉送規則是否已啟用全域存取權。例如:gcloud compute forwarding-rules describe int-tcp-forwarding-rule-global-access \ --region=REGION_A \ --format="get(name,region,allowGlobalAccess)"
啟用全域存取權後,輸出內容中轉送規則的名稱和區域後方會顯示
True。
建立用戶端 VM 以測試全域存取權
控制台
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
點選「建立執行個體」。
將「Name」(名稱) 設定為
test-global-access-vm。將「可用區」設為
ZONE_B1。點選「進階選項」。
按一下「Networking」(網路),設定下列欄位:
- 在「Network tags」(網路標記) 部分,輸入
allow-ssh。 - 在「網路介面」部分,選取下列項目:
- Network (網路):
lb-network - Subnet (子網路):
test-global-access-subnet
- Network (網路):
- 在「Network tags」(網路標記) 部分,輸入
點選「建立」。
gcloud
在 ZONE_B1 可用區建立用戶端 VM。
gcloud compute instances create test-global-access-vm \
--zone=ZONE_B1 \
--image-family=debian-12 \
--image-project=debian-cloud \
--tags=allow-ssh \
--subnet=test-global-access-subnet
將 ZONE_B1 替換為 REGION_B 區域中的可用區名稱。
連線至用戶端 VM 並測試連線能力
使用
ssh連線至用戶端執行個體:gcloud compute ssh test-global-access-vm \ --zone=ZONE_B1使用
gcloud compute addresses describe指令取得負載平衡器的 IP 位址:gcloud compute addresses describe int-tcp-ip-address \ --region=REGION_A記下 IP 位址。
將流量傳送至負載平衡器;請將 IP_ADDRESS 替換為負載平衡器的 IP 位址:
curl IP_ADDRESS:110
保留用戶端連線資訊的 Proxy 通訊協定
Proxy 網路負載平衡器會終止來自用戶端的 TCP 連線,並建立連至執行個體的新連線。根據預設,系統不會保留原本的用戶端 IP 和通訊埠資訊。
如要保留原始連線資訊並傳送至執行個體,請啟用 PROXY 通訊協定第 1 版。這個通訊協定會將另一個標頭 (當中包含來源 IP 位址、目的地 IP 位址和通訊埠編號) 做為要求的一部分傳送給執行個體。
請確認 Proxy 網路負載平衡器的後端執行個體,執行的伺服器支援 PROXY 通訊協定標頭。如果伺服器未設為支援 PROXY 通訊協定標頭,後端執行個體會傳回空白回應。
如果您為使用者流量設定 PROXY 通訊協定,也可以為健康狀態檢查設定該通訊協定。如果您在同一個通訊埠上檢查健康狀態並提供內容,請將健康狀態檢查的 --proxy-header 設為與負載平衡器設定相符。
PROXY 通訊協定標頭通常是單行使用者可讀取的文字,格式如下:
PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n
以下範例顯示 PROXY 通訊協定:
PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n
在上述範例中,用戶端 IP 為 192.0.2.1、負載平衡 IP 為 198.51.100.1、用戶端通訊埠為 15221,目的地通訊埠則為 110。
如果用戶端 IP 不明,負載平衡器會以下列格式產生 PROXY 通訊協定標頭:
PROXY UNKNOWN\r\n
更新目標 Proxy 的 PROXY 通訊協定標頭
您無法更新現有目標 Proxy 中的 PROXY 通訊協定標頭。您必須建立新的目標 Proxy,並為 PROXY 通訊協定標頭套用必要設定。請按照下列步驟,建立具有必要設定的新前端:
控制台
前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
- 按一下要編輯的負載平衡器名稱。
- 按一下負載平衡器的「Edit」(編輯)。
- 點選「前端設定」。
- 刪除舊的前端 IP 和通訊埠。
- 按一下「Add frontend IP and port」(新增前端 IP 和通訊埠)。
- 在「Name」(名稱) 中輸入
int-tcp-forwarding-rule。 - 在「子網路」部分,選取「backend-subnet」。
- 在「IP address」(IP 位址) 部分,選取先前預留的 IP 位址:LB_IP_ADDRESS
- 在「Port number」(通訊埠編號) 部分,輸入
110。轉送規則只會轉送目的地通訊埠相符的封包。 - 將「Proxy protocol」(Proxy 通訊協定) 欄位的值變更為「On」(啟用)。
- 按一下「完成」。
- 在「Name」(名稱) 中輸入
- 按一下 [Update] (更新),儲存您所做的變更。
gcloud
在下列指令中,編輯
--proxy-header欄位,並依據需求設為NONE或PROXY_V1。gcloud compute target-tcp-proxies create TARGET_PROXY_NAME \ --backend-service=BACKEND_SERVICE \ --proxy-header=[NONE | PROXY_V1] \ --region=REGION刪除現有的轉送規則。
gcloud compute forwarding-rules delete int-tcp-forwarding-rule \ --region=REGION建立新的轉送規則,並與目標 Proxy 建立關聯。
gcloud compute forwarding-rules create int-tcp-forwarding-rule \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=lb-network \ --subnet=backend-subnet \ --region=REGION \ --target-tcp-proxy=TARGET_PROXY_NAME \ --target-tcp-proxy-region=REGION \ --address=LB_IP_ADDRESS \ --ports=110
啟用工作階段相依性
範例設定會建立不含工作階段相依性的後端服務。
下列程序說明如何更新區域性內部 Proxy 網路負載平衡器範例的後端服務,讓後端服務使用用戶端 IP 相依性或已產生 Cookie 的相依性。
啟用用戶端 IP 相依性後,負載平衡器會根據用戶端 IP 位址和負載平衡器 IP 位址 (內部轉送規則的內部 IP 位址) 建立的雜湊,將特定用戶端的要求導向相同的後端 VM。
控制台
如要啟用用戶端 IP 工作階段相依性,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。
前往「Load balancing」(負載平衡) - 點選「後端」。
- 按一下「internal-tcp-proxy-bs」(您為本範例建立的後端服務名稱),然後按一下「Edit」(編輯)。
- 在「Backend service details」(後端服務詳細資料) 頁面中,按一下「Advanced configuration」(進階設定)。
- 在「工作階段相依性」下方,選取選單中的「用戶端 IP」。
- 按一下「Update」。
gcloud
使用下列 Google Cloud CLI 指令更新 internal-tcp-proxy-bs 後端服務,並指定用戶端 IP 工作階段相依性:
gcloud compute backend-services update internal-tcp-proxy-bs \
--region=REGION_A \
--session-affinity=CLIENT_IP
啟用連線排除
您可以啟用後端服務的連線排除功能,確保提供流量的執行個體在停止運作、遭到手動移除或由自動配置器移除時,使用者經歷的干擾可降至最低程度。如要進一步瞭解連線排除,請參閱「啟用連線排除」說明文件。