本頁說明如何部署跨區域內部應用程式負載平衡器,將流量平衡至位於地端或其他公有雲端,且可透過混合式連線存取的網路端點。
如果您尚未這樣做,請參閱混合式連線 NEG 簡介,瞭解設定混合式負載平衡所需的網路需求。
設定總覽
這個範例會為混合區域和混合連線 NEG 後端設定跨區域內部應用程式負載平衡器,如下圖所示:
您必須先設定混合式連線,才能設定混合式負載平衡部署作業。請根據您選擇的混合式連線產品,使用 Cloud VPN 或 Cloud Interconnect (專屬或合作夥伴)。
設定 SSL 憑證資源
請按照下列說明建立 Certificate Manager SSL 憑證資源:
建議使用 Google 代管的憑證。
權限
如要設定混合式負載平衡,您必須具備下列權限:
開啟 Google Cloud
- 權限:在 Google Cloud 與您的地端部署環境或其他雲端環境之間建立混合式連線。如需所需權限清單,請參閱相關的網路連線產品說明文件。
- 具備建立混合式連線 NEG 和負載平衡器的權限。Compute 負載平衡器管理員角色 (
roles/compute.loadBalancerAdmin
) 包含執行本指南所述任務所需的權限。
在地端部署環境或其他非雲端環境中Google Cloud
- 權限可設定網路端點,讓內部部署環境或其他雲端環境中的服務可透過Google Cloud 使用
IP:Port
組合存取。如需更多資訊,請與環境的網路管理員聯絡。 - 在內部部署環境或其他雲端環境中建立防火牆規則的權限,以便 Google 健康狀態檢查探測器存取端點。
- 權限可設定網路端點,讓內部部署環境或其他雲端環境中的服務可透過Google Cloud 使用
此外,如要完成本頁的操作說明,您必須建立混合式連線 NEG、負載平衡器和區域 NEG (及其端點),以便做為負載平衡器的 Google Cloud後端。
因此您必須是專案擁有者或編輯者,或是應具有以下 Compute Engine 身分與存取權管理角色。
工作 | 必要角色 |
---|---|
建立網路、子網路和負載平衡器元件 | Compute 網路管理員 (roles/compute.networkAdmin ) |
新增與移除防火牆規則 | Compute 安全管理員 (roles/compute.securityAdmin ) |
建立執行個體 | Compute 執行個體管理員 (roles/compute.instanceAdmin ) |
建立混合式連線
您 Google Cloud 和內部部署環境或其他雲端環境必須透過混合式連線連線,方法是使用 Cloud Router 或路由器設備 VM 搭配 Cloud Interconnect VLAN 連結或 Cloud VPN 通道。建議您使用高可用性連線。
啟用全域動態轉送功能的 Cloud Router 會透過邊界閘道通訊協定 (BGP) 瞭解特定端點,並將其編入 Google Cloud VPC 網路。不支援區域動態路由。也不支援靜態路徑。
您可以使用相同的網路或同一個專案中的不同虛擬私有雲網路,設定混合式網路 (Cloud Interconnect 或 Cloud VPN 或 Router 應用程式 VM) 和負載平衡器。請注意以下事項:
如果您使用不同的 VPC 網路,則這兩個網路必須透過 VPC 網路對等互連連線,或是必須是位於同一個 Network Connectivity Center 中樞的 VPC 輻條。
如果您使用相同的虛擬私有雲網路,請確認虛擬私有雲網路的子網路 CIDR 範圍不會與遠端 CIDR 範圍衝突。如果 IP 位址重疊,系統會優先使用子網路路徑,而不是遠端連線。
如需操作說明,請參閱下列文件:
設定外部環境 Google Cloud
請按照下列步驟設定混合式負載平衡的內部部署環境或其他雲端環境:
- 設定網路端點,將內部部署服務公開給Google Cloud (
IP:Port
)。 - 在內部部署環境或其他雲端環境中設定防火牆規則。
- 設定 Cloud Router 向私人環境通告特定必要路徑。
設定網路端點
設定混合式連線後,您可以在內部部署環境或其他雲端環境中,使用 IP:port
組合設定一或多個網路端點,以便透過 Cloud Interconnect 或 Cloud VPN 或 Router 應用程式存取。這個 IP:port
組合會設為混合式連線 NEG 的一或多個端點, Google Cloud 稍後會在這個程序中建立。
如果 IP 端點有多個路徑,路由會遵循 Cloud Router 簡介中所述的行為。
設定防火牆規則
您必須在內部部署環境或其他雲端環境中建立下列防火牆規則:
- 在內部部署或其他雲端環境中建立防火牆允許輸入規則,允許來自該區域僅限 Proxy 的子網路的流量連上端點。
混合型 NEG 不需要允許來自 Google 健康狀態檢查探測範圍的流量。不過,如果您在單一後端服務中同時使用混合式和區域性 NEG,則必須允許區域性 NEG 從 Google 健康狀態檢查探針範圍接收流量。
宣傳路線
設定 Cloud Router 向內部部署環境或其他雲端環境通告下列自訂 IP 範圍:
- 區域的僅限 Proxy 子網路範圍。
設定 Google Cloud 環境
在下列步驟中,請務必使用用於設定兩個環境之間混合式連線的相同虛擬私有雲網路 (在本程序中稱為 NETWORK
)。
此外,請確認使用的區域 (在此程序中稱為 REGION_A
和 REGION_B
) 與用於建立 Cloud VPN 通道或 Cloud Interconnect VLAN 連結的區域相同。
GEO
,以便在區域停機期間,將用戶端流量轉送至離用戶端最近的區域中的負載平衡器 VIP。設定後端子網路
使用這個子網路建立負載平衡器的區域 NEG 後端:
主控台
在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。
前往用於設定環境間混合式連線的網路。
在「Subnets」(子網路) 區段中:
- 將「Subnet creation mode」(子網路建立模式) 設為 [Custom] (自訂)。
- 在「New subnet」(新的子網路) 區段中,輸入以下資訊:
- 提供這個子網路的 [Name] (名稱)。
- 選取「區域」:REGION_A
- 輸入 IP 位址範圍。
- 按一下 [完成]。
按一下 [建立]。
如要在其他區域新增更多子網路,請按一下「Add subnet」,然後重複執行 REGION_B 的上述步驟。
gcloud
在用於設定環境間混合式連線的網路中建立子網路。
gcloud compute networks subnets create SUBNET_A \ --network=NETWORK \ --range=LB_SUBNET_RANGE1 \ --region=REGION_A
gcloud compute networks subnets create SUBNET_B \ --network=NETWORK \ --range=LB_SUBNET_RANGE2 \ --region=REGION_B
API
對 subnetworks.insert
方法提出 POST
要求。將 PROJECT_ID
替換為您的專案 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks { "name": "SUBNET_A", "network": "projects/PROJECT_ID/global/networks/NETWORK", "ipCidrRange": "LB_SUBNET_RANGE1", "region": "projects/PROJECT_ID/regions/REGION_A", }
對 subnetworks.insert
方法提出 POST
要求。將 PROJECT_ID
替換為您的專案 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks { "name": "SUBNET_B", "network": "projects/PROJECT_ID/global/networks/NETWORK", "ipCidrRange": "LB_SUBNET_RANGE2", "region": "projects/PROJECT_ID/regions/REGION_B", }
更改下列內容:
SUBNET_A
和SUBNET_B
:子網路名稱LB_SUBNET_RANGE1
和LB_SUBNET_RANGE2
:子網路的 IP 位址範圍REGION_A
和REGION_B
:您設定負載平衡器的區域
設定僅限 Proxy 的子網路
僅限 Proxy 子網路會提供一組 IP 位址,供 Google 代表您執行 Envoy Proxy。Proxy 會終止來自用戶端的連線,並建立連至後端的新連線。
這個僅限 Proxy 的子網路會由虛擬私有雲網路中同個地區的所有Envoy 型區域負載平衡器使用。每個地區和每個網路只能有一個用於特定用途的活動的僅限 Proxy 子網路。
控制台
如果您使用的是 Google Cloud 主控台,可以等之後再於「負載平衡」頁面中建立僅限 Proxy 的子網路。
如果您現在想建立僅限 Proxy 的子網路,請按照下列步驟操作:
在 Google Cloud 控制台中,前往「VPC Networks」(虛擬私有雲網路) 頁面。
- 按一下虛擬私有雲網路的名稱。
- 在「子網路」分頁中,按一下「新增子網路」。
- 提供僅限 Proxy 子網路的「名稱」。
- 在「Region」(區域) 清單中選取「REGION_A」。
- 在「用途」清單中,選取「跨區域的 Managed Proxy」。
- 在「IP address range」欄位中輸入
10.129.0.0/23
。 - 按一下「新增」。
在 REGION_B 中建立僅限 Proxy 的子網路
- 按一下 [新增子網路]。
- 提供僅限 Proxy 子網路的「名稱」。
- 在「Region」(區域) 清單中選取「REGION_B」。
- 在「用途」清單中,選取「跨區域的 Managed Proxy」。
- 在「IP address range」欄位中輸入
10.130.0.0/23
。 - 按一下「新增」。
gcloud
使用
gcloud compute networks subnets create
指令建立僅限 Proxy 的子網路。
gcloud compute networks subnets create PROXY_SN_A \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=REGION_A \ --network=NETWORK \ --range=PROXY_ONLY_SUBNET_RANGE1
gcloud compute networks subnets create PROXY_SN_B \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=REGION_B \ --network=NETWORK \ --range=PROXY_ONLY_SUBNET_RANGE2
更改下列內容:
PROXY_SN_A
和PROXY_SN_B
:僅限 Proxy 子網路的名稱PROXY_ONLY_SUBNET_RANGE1
和PROXY_ONLY_SUBNET_RANGE2
:Proxy 專用子網路的 IP 位址範圍REGION_A
和REGION_B
:您設定負載平衡器的區域
API
使用
subnetworks.insert
方法建立僅限 Proxy 的子網路,並將 PROJECT_ID
替換為您的專案 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks { "name": "PROXY_SN_A", "ipCidrRange": "PROXY_ONLY_SUBNET_RANGE1", "network": "projects/PROJECT_ID/global/networks/NETWORK", "region": "projects/PROJECT_ID/regions/REGION_A", "purpose": "GLOBAL_MANAGED_PROXY", "role": "ACTIVE" }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks { "name": " PROXY_SN_B", "ipCidrRange": "PROXY_ONLY_SUBNET_RANGE2", "network": "projects/PROJECT_ID/global/networks/NETWORK", "region": "projects/PROJECT_ID/regions/REGION_B", "purpose": "GLOBAL_MANAGED_PROXY", "role": "ACTIVE" }
建立防火牆規則
在本範例中,您會為 Google Cloud上的區域 NEG 後端建立下列防火牆規則:
fw-allow-health-check
:輸入規則,適用於要進行負載平衡的執行個體,可允許來自Google Cloud 健康檢查系統 (130.211.0.0/22
和35.191.0.0/16
) 的流量。本範例會使用目標標記allow-health-check
來辨識應套用的區域 NEG。fw-allow-ssh
:輸入規則,可在 TCP 通訊埠 22 上允許來自任何位址的連入 SSH 連線。您可以為這項規則選擇較嚴格的來源 IP 範圍;例如,您可以僅指定要從其中啟動 SSH 工作階段之系統的 IP 範圍。這個範例會使用目標標記allow-ssh
來辨識應套用這項規則的虛擬機器 (VM) 執行個體。fw-allow-proxy-only-subnet
:允許來自僅限 Proxy 子網路的連線,連線至區域 NEG 後端的輸入規則。
主控台
在 Google Cloud 控制台中,前往「Firewall policies」(防火牆政策) 頁面。
按一下「Create firewall rule」(建立防火牆規則),建立允許健康狀態檢查探測器流量的規則:
- 輸入
fw-allow-health-check
的「Name」。 - 在「Network」(網路) 中選取 NETWORK。
- 在「Targets」(目標) 中選取 Specified target tags。
- 在「Target tags」(目標標記) 欄位填入
allow-health-check
。 - 將「Source filter」(來源篩選器) 設為「IPv4 ranges」(IPv4 範圍)。
- 將「Source IPv4 ranges」(來源 IPv4 範圍) 設為
130.211.0.0/22
和35.191.0.0/16
。 - 在「Protocols and ports」(通訊協定和通訊埠) 中選取「Specified protocols and ports」(指定的通訊協定和通訊埠)。
- 選取「TCP」TCP,然後輸入
80
做為「Port number」(通訊埠編號)。 - 按一下 [建立]。
- 輸入
再次按一下「Create firewall rule」(建立防火牆規則),以建立允許連入 SSH 連線的規則:
- Name (名稱):
fw-allow-ssh
- Network (網路):NETWORK
- Priority (優先順序):
1000
- 「Direction of traffic」(流量方向):[ingress] (輸入)
- 「Action on match」(相符時執行的動作):[allow] (允許)
- 「Target」(目標):指定的目標標記
- 「Target tags」(目標標記):
allow-ssh
- 來源篩選器:IPv4 範圍
- Source IPv4 ranges (來源 IPv4 範圍):
0.0.0.0/0
- Protocols and ports:選擇「Specified protocols and ports」。
- 選取「TCP」TCP,然後輸入
22
做為「Port number」(通訊埠編號)。 - 按一下 [建立]。
- Name (名稱):
再次按一下「Create firewall rule」(建立防火牆規則),以建立允許來自僅限 Proxy 子網路的連線規則:
- Name (名稱):
fw-allow-proxy-only-subnet
- Network (網路):NETWORK
- Priority (優先順序):
1000
- 「Direction of traffic」(流量方向):[ingress] (輸入)
- 「Action on match」(相符時執行的動作):[allow] (允許)
- 「Target」(目標):指定的目標標記
- 「Target tags」(目標標記):
allow-proxy-only-subnet
- 來源篩選器:IPv4 範圍
- 來源 IPv4 範圍:PROXY_ONLY_SUBNET_RANGE1 和 PROXY_ONLY_SUBNET_RANGE2
- Protocols and ports (通訊協定和通訊埠):選擇「Specified protocols and ports」(指定的通訊協定和通訊埠)
- 選取「TCP」TCP,然後輸入
80
做為「Port number」(通訊埠編號)。 - 按一下 [建立]。
- Name (名稱):
gcloud
建立
fw-allow-health-check-and-proxy
規則,允許 Google Cloud 健康檢查在 TCP 通訊埠80
上存取後端執行個體:gcloud compute firewall-rules create fw-allow-health-check \ --network=NETWORK \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --rules=tcp:80
建立
fw-allow-ssh
防火牆規則,允許與具有allow-ssh
網路標記的 VM 建立 SSH 連線。若省略source-ranges
,Google Cloud 會將規則解讀為任何來源。gcloud compute firewall-rules create fw-allow-ssh \ --network=NETWORK \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
為僅限 Proxy 的子網路建立允許輸入的防火牆規則,以便負載平衡器與 TCP 通訊埠
80
上的後端執行個體通訊:gcloud compute firewall-rules create fw-allow-proxy-only-subnet \ --network=NETWORK \ --action=allow \ --direction=ingress \ --target-tags=allow-proxy-only-subnet \ --source-ranges=PROXY_ONLY_SUBNET_RANGE1,PROXY_ONLY_SUBNET_RANGE2 \ --rules=tcp:80
設定可用區 NEG
針對以 Google Cloud為基礎的後端,建議您在設定混合式連線的相同區域中,設定多個區域 NEG。
在本例中,我們會在 REGION_A
地區中設定區域性 NEG (含 GCE_VM_IP_PORT
類型端點)。首先,請在 ZONE_A
區域中建立 VM。接著,請在 ZONE_A
可用區中建立區域性 NEG,然後將 VM 的網路端點新增至 NEG。如要支援高可用性,請在 REGION_B
區域中設定類似的可用區 NEG。如果某個地區的後端服務發生故障,流量就會移轉至其他地區。
建立 VM
主控台
前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。
使用下列名稱和區域組合,針對每個 VM 重複執行步驟 3 至 8。
- 名稱:
vm-a1
- 區域:REGION_A 中的 ZONE_A
- 子網路:SUBNET_A
- 名稱:
vm-b1
的- 區域:REGION_B 中的 ZONE_B
- 子網路:SUBNET_B
- 名稱:
點選「建立執行個體」。
按照前一個步驟指定的名稱設定。
在「Region」(區域) 中,選擇先前步驟指定的選項。
在「Zone」(可用區) 中,選擇先前步驟中指定的選項。
在「Boot disk」(開機磁碟) 專區中,確認已為開機磁碟選項選取「Debian GNU/Linux 12 (bookworm)」。如有需要,請按一下「Choose」(選擇),以變更圖片。
在「Advanced options」專區中,展開「Networking」,然後執行下列操作:
- 新增下列「Network tags」(網路標記):
allow-ssh
、allow-health-check
和allow-proxy-only-subnet
。 - 在「Network interfaces」(網路介面) 專區中,按一下「Add a network interface」(新增網路介面) 進行下列變更,然後按一下「Done」(完成):
- Network (網路):NETWORK
- 子網路:如先前步驟所示。
- 「Primary internal IP」(主要內部 IP):臨時 (自動)
- External IP (外部 IP):臨時
展開「管理」。在「Automation」欄位中,複製並貼上下列指令碼內容。所有 VM 的指令碼內容皆相同:
#! /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
- 新增下列「Network tags」(網路標記):
按一下 [建立]。
gcloud
請執行下列指令來建立 VM,並使用下列組合做為 VM 名稱和區域的名稱。兩個 VM 的指令碼內容皆相同。
gcloud compute instances create VM_NAME \ --zone=GCP_NEG_ZONE \ --image-family=debian-12 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \ --subnet=LB_SUBNET_NAME \ --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'
vm-a1
的VM_NAME
- 區域
REGION_A
中的區域GCP_NEG_ZONE
為ZONE_A
- 子網路
LB_SUBNET_NAME
為SUBNET_A
- 區域
vm-b1
的VM_NAME
- 區域
REGION_B
中的區域GCP_NEG_ZONE
為ZONE_B
- 子網路
LB_SUBNET_NAME
為SUBNET_B
- 區域
建立可用區 NEG
主控台
如何建立可用區網路端點群組:
在 Google Cloud 控制台中,前往「Network Endpoint Groups」(網路端點群組) 頁面。
針對每個區域 NEG,使用下列名稱和區域組合重複執行步驟 3 至 8:
- 名稱:
neg-1
- 區域:REGION_A 區域中的 ZONE_A
- 子網路:SUBNET_A
- 名稱:
neg-2
- 區域:REGION_B 區域中的 ZONE_B
- 子網路:SUBNET_B
- 名稱:
按一下「建立網路端點群組」。
按照前一個步驟指定的名稱設定。
選取「網路端點群組類型」:「網路端點群組 (區域性)」。
選取「網路」:NETWORK
選取先前步驟所示的「子網路」。
選取先前步驟所示的「Zone」(可用區)。
輸入「預設通訊埠」:
80
。按一下 [建立]。
將端點新增至區域性 NEG:
在 Google Cloud 控制台中,前往「Network Endpoint Groups」(網路端點群組) 頁面。
按一下先前步驟建立的網路端點群組「名稱」。畫面上即會顯示「Network endpoint group details」(網路端點群組詳細資料) 頁面。
在「Network endpoints in this group」(這個群組中的網路端點) 區段中,按一下 [Add network endpoint] (新增網路端點]。畫面上即會出現「Add network endpoint」(新增網路端點) 頁面。
選取某個 VM 執行個體,將其內部 IP 位址新增為網路端點。在「Network interface」部分,系統會顯示 VM 的名稱、區域和子網路。
輸入新網路端點的「IP 位址」。
選擇「Port type」(通訊埠類型)。
- 如果您選取「預設」,則端點會使用網路端點群組中所有端點的預設通訊埠
80
。這對我們的範例來說已足夠,因為 Apache 伺服器會透過通訊埠80
提供要求。 - 如果您選取「Custom」(自訂),請輸入端點要使用的「Port number」(通訊埠編號)。
- 如果您選取「預設」,則端點會使用網路端點群組中所有端點的預設通訊埠
如要新增更多端點,請按一下「Add network endpoint」(新增網路端點),然後重複執行上述步驟。
新增所有端點後,按一下「建立」。
gcloud
使用名稱、區域和子網路組合,建立可用區 NEG (含
GCE_VM_IP_PORT
端點)。使用gcloud compute network-endpoint-groups create
指令。gcloud compute network-endpoint-groups create GCP_NEG_NAME \ --network-endpoint-type=GCE_VM_IP_PORT \ --zone=GCP_NEG_ZONE \ --network=NETWORK \ --subnet=LB_SUBNET_NAME
- 名稱:
neg-1
- 區域
GCP_NEG_ZONE
:區域REGION_A
中的ZONE_A
- 子網路
LB_SUBNET_NAME
:SUBNET_A
- 區域
- 名稱:
neg-2
- 區域
GCP_NEG_ZONE
:區域REGION_B
中的ZONE_B
- 子網路
LB_SUBNET_NAME
:SUBNET_B
- 區域
您可以在建立 NEG 時使用
--default-port
選項指定通訊埠,也可以為每個端點指定通訊埠號碼,如下一個步驟所示。- 名稱:
將端點新增至
neg1
和neg2
。gcloud compute network-endpoint-groups update neg1 \ --zone=ZONE_A \ --add-endpoint='instance=vm-a1,port=80'
gcloud compute network-endpoint-groups update neg2 \ --zone=ZONE_B \ --add-endpoint='instance=vm-b1,port=80'
設定混合式連線 NEG
建立 NEG 時,請使用區域,以盡量縮短 Google Cloud 與地端部署或其他雲端環境之間的地理距離。舉例來說,如果您在德國法蘭克福的內部環境中代管服務,則可以在建立 NEG 時指定 europe-west3-a
Google Cloud 區域。
如果您使用的是 Cloud Interconnect,用於建立 NEG 的可用區,會位於設定 Cloud Interconnect 連結的可用區所在的區域。
Hybrid NEG 僅支援分散式 Envoy 健康檢查。
主控台
如何建立混合式連線網路端點群組:
在 Google Cloud 控制台中,前往「Network Endpoint Groups」(網路端點群組) 頁面。
按一下「建立網路端點群組」。
使用下列名稱和區域組合,針對每個混合型 NEG 重複執行步驟 4 至 9。
- 名稱 ON_PREM_NEG_NAME:
hybrid-1
- 可用區:ON_PREM_NEG_ZONE1
- 子網路:SUBNET_A
- 名稱 ON_PREM_NEG_NAME:
hybrid-2
- 可用區:ON_PREM_NEG_ZONE2
- 子網路:SUBNET_B
- 名稱 ON_PREM_NEG_NAME:
按照上一個步驟的說明設定名稱。
選取網路端點群組類型:混合式連線網路端點群組 (可用區)。
選取「網路」:NETWORK
在「Subnet」(子網路) 中,選擇上一個步驟所示的值。
在「Zone」(可用區) 中,選擇上一個步驟指定的選項。
輸入「預設通訊埠」。
按一下 [建立]。
將端點新增至混合式連線 NEG:
在 Google Cloud 控制台中,前往「Network Endpoint Groups」(網路端點群組) 頁面。
按一下先前步驟建立的網路端點群組「名稱」。畫面上即會顯示「Network endpoint group detail」(網路端點群組詳細資料) 頁面。
在「Network endpoints in this group」(這個群組中的網路端點) 區段中,按一下 [Add network endpoint] (新增網路端點]。畫面上即會出現「Add network endpoint」(新增網路端點) 頁面。
輸入新網路端點的「IP 位址」。
選擇「Port type」(通訊埠類型)。
- 如果您選取「預設」,則端點會使用網路端點群組中所有端點的預設通訊埠。
- 如果您選取「Custom」(自訂),可以輸入端點要使用的不同「Port number」(通訊埠編號)。
如要新增更多端點,請按一下「Add network endpoint」(新增網路端點),然後重複執行上述步驟。
新增所有非Google Cloud 端點後,請按一下「建立」。
gcloud
建立使用下列名稱組合的混合式連線 NEG。使用
gcloud compute network-endpoint-groups create
指令。gcloud compute network-endpoint-groups create ON_PREM_NEG_NAME \ --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \ --zone=ON_PREM_NEG_ZONE \ --network=NETWORK
- 名稱
ON_PREM_NEG_NAME
:hybrid-1
- 可用區
ON_PREM_NEG_ZONE
:ON_PREM_NEG_ZONE1
- 可用區
- 名稱
ON_PREM_NEG_NAME
:hybrid-2
- 可用區
GCP_NEG_ZONE
:ON_PREM_NEG_ZONE2
- 可用區
- 名稱
將內部部署後端 VM 端點新增至
ON_PREM_NEG_NAME
:gcloud compute network-endpoint-groups update ON_PREM_NEG_NAME \ --zone=ON_PREM_NEG_ZONE \ --add-endpoint="ip=ON_PREM_IP_ADDRESS_1,port=PORT_1" \ --add-endpoint="ip=ON_PREM_IP_ADDRESS_2,port=PORT_2"
您可以使用這個指令新增先前在內部或雲端環境中設定的網路端點。視需要重複執行 --add-endpoint
。
設定負載平衡器
主控台
gcloud
使用
gcloud compute health-checks create http
指令定義 HTTP 健康狀態檢查。gcloud compute health-checks create http gil7-basic-check \ --use-serving-port \ --global
使用
gcloud compute backend-services create
指令建立後端服務,並啟用記錄功能。gcloud compute backend-services create BACKEND_SERVICE \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=HTTP \ --enable-logging \ --logging-sample-rate=1.0 \ --health-checks=gil7-basic-check \ --global-health-checks \ --global
使用
gcloud compute backend-services add-backend
指令,將後端新增到後端服務。gcloud compute backend-services add-backend BACKEND_SERVICE \ --global \ --balancing-mode=RATE \ --max-rate-per-endpoint=MAX_REQUEST_RATE_PER_ENDPOINT \ --network-endpoint-group=neg1 \ --network-endpoint-group-zone=ZONE_A \ --network-endpoint-group=neg2 \ --network-endpoint-group-zone=ZONE_B
如要進一步瞭解如何設定平衡模式,請參閱 gcloud CLI 說明文件中的
--max-rate-per-endpoint
標記。將混合 NEG 新增至後端服務,做為後端使用。
gcloud compute backend-services add-backend BACKEND_SERVICE \ --global \ --balancing-mode=RATE \ --max-rate-per-endpoint=MAX_REQUEST_RATE_PER_ENDPOINT \ --network-endpoint-group=hybrid1 \ --network-endpoint-group-zone=ON_PREM_NEG_ZONE1 \ --network-endpoint-group=hybrid2 \ --network-endpoint-group-zone=ON_PREM_NEG_ZONE2 \
如要進一步瞭解如何設定平衡模式,請參閱 gcloud CLI 說明文件中的
--max-rate-per-endpoint
參數。使用
gcloud compute url-maps create
指令建立網址對應。gcloud compute url-maps create gil7-map \ --default-service=BACKEND_SERVICE \ --global
建立目標 Proxy。
HTTP:
使用
gcloud compute target-http-proxies create
指令建立目標 Proxy。gcloud compute target-http-proxies create gil7-http-proxy \ --url-map=gil7-map \ --global
適用於 HTTPS:
如要建立 Google 代管的憑證,請參閱下列說明文件:
建立 Google 代管憑證後,請將憑證附加至目標 Proxy。跨區域內部應用程式負載平衡器不支援憑證對應項目。
如要建立自行管理的憑證,請參閱下列說明文件:
將檔案路徑指派給變數名稱。
export LB_CERT=PATH_TO_PEM_FORMATTED_FILE
export LB_PRIVATE_KEY=PATH_TO_PEM_LB_PRIVATE_FILE
使用
gcloud certificate-manager certificates create
指令建立全區域 SSL 憑證。gcloud certificate-manager certificates create gilb-certificate \ --private-key-file=$LB_CERT \ --certificate-file=$LB_PRIVATE_KEY \ --scope=all-regions
使用 SSL 憑證,透過
gcloud compute target-https-proxies create
指令建立目標 Proxygcloud compute target-https-proxies create gil7-https-proxy \ --url-map=gil7-map \ --certificate-manager-certificates=gilb-certificate \ --global
建立兩個轉送規則,一個在
REGION_A
區域中使用 VIPIP_ADDRESS1
,另一個在REGION_B
區域中使用 VIPIP_ADDRESS2
。針對轉送規則的 IP 位址,請使用LB_SUBNET_RANGE1
或LB_SUBNET_RANGE2
IP 位址範圍。如果您嘗試使用僅限 Proxy 的子網路,轉送規則建立作業將會失敗。如果是自訂網路,您必須參照轉送規則中的子網路。請注意,這是 VM 子網路,而不是 Proxy 子網路。
HTTP:
使用
gcloud compute forwarding-rules create
指令,並加上正確的旗標。gcloud compute forwarding-rules create FWRULE_A \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET_A \ --subnet-region=REGION_A \ --address=IP_ADDRESS1 \ --ports=80 \ --target-http-proxy=gil7-http-proxy \ --global
gcloud compute forwarding-rules create FWRULE_B \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET_B \ --subnet-region=REGION_B \ --address=IP_ADDRESS2 \ --ports=80 \ --target-http-proxy=gil7-http-proxy \ --global
適用於 HTTPS:
使用
gcloud compute forwarding-rules create
指令搭配正確的旗標建立轉送規則。gcloud compute forwarding-rules create FWRULE_A \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET_A \ --subnet-region=REGION_A \ --address=IP_ADDRESS1 \ --ports=443 \ --target-https-proxy=gil7-https-proxy \ --global
gcloud compute forwarding-rules create FWRULE_B \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET_B \ --subnet-region=REGION_B \ --address=IP_ADDRESS2 \ --ports=443 \ --target-https-proxy=gil7-https-proxy \ --global
將網域連結至負載平衡器
建立負載平衡器後,請記下與負載平衡器相關聯的 IP 位址,例如 IP_ADDRESS1
和 IP_ADDRESS2
。如要將網域指向負載平衡器,請使用 Cloud DNS 或網域註冊服務建立 A
記錄。如果您在 SSL 憑證中新增了多個網域,則必須為每個網域新增 A
記錄,並全部指向負載平衡器的 IP 位址。
測試負載平衡器
建立 VM 執行個體來測試連線能力
建立用戶端 VM:
gcloud compute instances create l7-ilb-client-a \ --image-family=debian-12 \ --image-project=debian-cloud \ --network=NETWORK \ --subnet=SUBNET_A \ --zone=ZONE_A \ --tags=allow-ssh
gcloud compute instances create l7-ilb-client-b \ --image-family=debian-12 \ --image-project=debian-cloud \ --network=NETWORK \ --subnet=SUBNET_B \ --zone=ZONE_B \ --tags=allow-ssh
使用 SSH 連線至每個用戶端執行個體。
gcloud compute ssh l7-ilb-client-a \ --zone=ZONE_A
gcloud compute ssh l7-ilb-client-b \ --zone=ZONE_B
確認 IP 位址是否提供主機名稱。
確認用戶端 VM 可連上這兩個 IP 位址。指令應成功執行,並傳回處理要求的後端 VM 名稱:
HTTP 測試:
curl IP_ADDRESS1
curl IP_ADDRESS2
HTTPS 測試:
curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS1:443
curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS2:443
將 DOMAIN_NAME 替換為應用程式網域名稱,例如
test.example.com
。-k
標記會讓 curl 略過憑證驗證。選用:使用已設定的 DNS 記錄,解析離用戶端 VM 最近的 IP 位址。例如,DNS_ENTRY 可以是
service.example.com
。curl DNS_ENTRY
執行 100 個要求
執行 100 個 curl 要求,並透過回應確認這些要求可達到負載平衡。
HTTP:
確認用戶端 VM 可連上這兩個 IP 位址。指令應成功執行,並傳回處理要求的後端 VM 名稱:
{ RESULTS= for i in {1..100} do RESULTS="$RESULTS:$(curl --silent IP_ADDRESS1)" done echo "***" echo "*** Results of load-balancing to IP_ADDRESS1: " echo "***" echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c echo }
{ RESULTS= for i in {1..100} do RESULTS="$RESULTS:$(curl --silent IP_ADDRESS2)" done echo "***" echo "*** Results of load-balancing to IP_ADDRESS2: " echo "***" echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c echo }
適用於 HTTPS:
確認用戶端 VM 可連上這兩個 IP 位址。指令應成功執行,並傳回處理要求的後端 VM 名稱。
將 DOMAIN_NAME 替換為應用程式網域名稱,例如
test.example.com
。{ RESULTS= for i in {1..100} do RESULTS="$RESULTS:$(curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS1:443)" done echo "***" echo "*** Results of load-balancing to IP_ADDRESS1: " echo "***" echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c echo }
{ RESULTS= for i in {1..100} do RESULTS="$RESULTS:$(curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS2:443)" done echo "***" echo "*** Results of load-balancing to IP_ADDRESS2: " echo "***" echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c echo }
測試容錯移轉
當
REGION_B
中的後端處於不良狀態或無法連線時,請確認是否會將後端移轉至REGION_A
區域。我們模擬這個情況,移除REGION_B
中的所有後端:gcloud compute backend-services remove-backend BACKEND_SERVICE \ --balancing-mode=RATE \ --network-endpoint-group=neg2 \ --network-endpoint-group-zone=ZONE_B
使用 SSH 連線至
REGION_B
中的用戶端 VM。gcloud compute ssh l7-ilb-client-b \ --zone=ZONE_B
將要求傳送至
REGION_B
區域中的負載平衡 IP 位址。輸出結果會與下列內容相似:{ RESULTS= for i in {1..100} do RESULTS="$RESULTS:$(curl -k -s 'https://DOMAIN_NAME:443' --connect-to DOMAIN_NAME:443:IP_ADDRESS2:443)" done echo "***" echo "*** Results of load-balancing to IP_ADDRESS2: " echo "***" echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c echo }
額外設定選項
本節會延伸說明設定範例,並提供替代和其他設定選項。所有工作都是選填項目。您可以按任何順序執行這些工作。
設定 DNS 轉送政策
如果您的用戶端位於多個區域,建議您使用這些區域中的 VIP,讓跨區域內部應用程式負載平衡器可供存取。這種多區域設定可盡量減少延遲時間和網路傳輸費用。此外,您還可以設定以 DNS 為基礎的全域負載平衡解決方案,以便在地區性服務中斷時提供復原能力。詳情請參閱「管理 DNS 轉送政策和健康狀態檢查」。
gcloud
如要建立 TTL 為 30 秒的 DNS 項目,請使用 gcloud dns record-sets create
指令。
gcloud dns record-sets create DNS_ENTRY --ttl="30" \ --type="A" --zone="service-zone" \ --routing-policy-type="GEO" \ --routing-policy-data="REGION_A=gil7-forwarding-rule-a@global;REGION_B=gil7-forwarding-rule-b@global" \ --enable-health-checking
更改下列內容:
DNS_ENTRY
:記錄組的 DNS 或網域名稱例如
service.example.com
。REGION_A
和REGION_B
:您設定負載平衡器的區域
API
對 ResourceRecordSets.create
方法發出 POST
要求,即可建立 DNS 記錄。將 PROJECT_ID 替換為您的專案 ID。
POST https://www.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/SERVICE_ZONE/rrsets { "name": "DNS_ENTRY", "type": "A", "ttl": 30, "routingPolicy": { "geo": { "items": [ { "location": "REGION_A", "healthCheckedTargets": { "internalLoadBalancers": [ { "loadBalancerType": "globalL7ilb", "ipAddress": "IP_ADDRESS", "port": "80", "ipProtocol": "tcp", "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "project": "PROJECT_ID" } ] } }, { "location": "REGION_B", "healthCheckedTargets": { "internalLoadBalancers": [ { "loadBalancerType": "globalL7ilb", "ipAddress": "IP_ADDRESS_B", "port": "80", "ipProtocol": "tcp", "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "project": "PROJECT_ID" } ] } } ] } } }
更新用戶端 HTTP 保持運作逾時時間
在先前步驟中建立的負載平衡器已設定 用戶端 HTTP keepalive 逾時 的預設值。如要更新用戶端 HTTP keepalive 逾時值,請按照下列操作說明操作。
控制台
前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。
- 按一下要修改的負載平衡器名稱。
- 按一下「編輯」圖示 。
- 按一下「前端設定」。
- 展開「進階功能」。在「HTTP 保持運作逾時」中,輸入逾時值。
- 按一下「更新」。
- 如要查看變更內容,請依序按一下「Review and finalize」和「Update」。
gcloud
針對 HTTP 負載平衡器,請使用 gcloud compute target-http-proxies update
指令更新目標 HTTP Proxy:
gcloud compute target-http-proxies update TARGET_HTTP_PROXY_NAME \ --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \ --global
針對 HTTPS 負載平衡器,請使用 gcloud compute target-https-proxies update
指令更新目標 HTTPS Proxy:
gcloud compute target-https-proxies update TARGET_HTTPS_PROXY_NAME \ --http-keep-alive-timeout-sec=HTTP_KEEP_ALIVE_TIMEOUT_SEC \ --global
更改下列內容:
TARGET_HTTP_PROXY_NAME
:目標 HTTP Proxy 的名稱。TARGET_HTTPS_PROXY_NAME
:目標 HTTPS Proxy 的名稱。HTTP_KEEP_ALIVE_TIMEOUT_SEC
:HTTP 保持運作逾時值,介於 5 到 600 秒。
啟用離群值偵測
您可以在全球後端服務上啟用異常值偵測功能,以便找出無伺服器 NEG 異常情形,並減少傳送至無伺服器 NEG 異常值的請求數量。
您可以使用下列任一方法,在後端服務中啟用異常值偵測功能:
consecutiveErrors
方法 (outlierDetection.consecutiveErrors
),其中5xx
系列 HTTP 狀態碼視為錯誤。consecutiveGatewayFailure
方法 (outlierDetection.consecutiveGatewayFailure
),其中只有502
、503
和504
HTTP 狀態碼可視為錯誤。
請按照下列步驟,為現有後端服務啟用異常值偵測功能。請注意,即使啟用異常值偵測功能,某些要求仍可能會傳送至不健康的服務,並傳回 5xx
狀態碼給用戶端。如要進一步降低錯誤率,您可以為異常值偵測參數設定更積極的值。詳情請參閱 outlierDetection
欄位。
主控台
前往 Google Cloud 控制台的「Load balancing」(負載平衡)頁面。
按一下您要編輯後端服務的負載平衡器名稱。
在「Load balancer details」(負載平衡器詳細資料) 頁面中,按一下
「Edit」(編輯)。在「Edit cross-region internal Application Load Balancer」(編輯跨區域內部應用程式負載平衡器) 頁面上,按一下「Backend configuration」(後端設定)。
在「Backend configuration」(後端設定) 頁面上,針對要修改的後端服務,按一下
「Edit」(編輯)。向下捲動並展開「進階設定」部分。
在「異常值偵測」部分,勾選「啟用」核取方塊。
按一下
「Edit」 來設定異常值偵測功能。確認下列選項已設為指定的值:
屬性 值 連續錯誤 5 間隔 1000 基礎排除時間 30000 排除百分比上限 50 強制執行連續錯誤 100 在本範例中,系統每秒執行一次異常值偵測分析。如果 Envoy Proxy 收到的連續 HTTP
5xx
狀態碼數量達到五個以上,後端端點就會從該 Envoy Proxy 的負載平衡集區中移除 30 秒。當強制百分比設為 100% 時,後端服務會在每次執行異常情況偵測分析時,強制從特定 Envoy Proxy 的負載平衡集區中,將不健康的端點彈出。如果符合排除條件,最多可從負載平衡集區中排除 50% 的後端端點。按一下 [儲存]。
如要更新後端服務,請按一下「更新」。
如要更新負載平衡器,請在「Edit cross-region internal Application Load Balancer」(編輯跨區域內部應用程式負載平衡器) 頁面上,按一下「Update」(更新)。
gcloud
將後端服務匯出為 YAML 檔案。
gcloud compute backend-services export BACKEND_SERVICE_NAME \ --destination=BACKEND_SERVICE_NAME.yaml --global
將
BACKEND_SERVICE_NAME
替換為後端服務名稱。編輯後端服務的 YAML 設定,新增異常值偵測欄位,如下列 YAML 設定中
outlierDetection
部分所示:在本範例中,系統每秒執行一次異常值偵測分析。如果 Envoy Proxy 收到的連續 HTTP
5xx
狀態碼數量達到五個以上,後端端點就會從該 Envoy Proxy 的負載平衡集區中移除 30 秒。當強制百分比設為 100% 時,後端服務會在每次執行異常情況偵測分析時,強制從特定 Envoy Proxy 的負載平衡集區中,將不健康的端點彈出。如果符合排除條件,最多可從負載平衡集區中排除 50% 的後端端點。name: BACKEND_SERVICE_NAME backends: - balancingMode: UTILIZATION capacityScaler: 1.0 group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/networkEndpointGroups/SERVERLESS_NEG_NAME - balancingMode: UTILIZATION capacityScaler: 1.0 group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/networkEndpointGroups/SERVERLESS_NEG_NAME_2 outlierDetection: baseEjectionTime: nanos: 0 seconds: 30 consecutiveErrors: 5 enforcingConsecutiveErrors: 100 interval: nanos: 0 seconds: 1 maxEjectionPercent: 50 port: 80 selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME sessionAffinity: NONE timeoutSec: 30 ...
更改下列內容:
BACKEND_SERVICE_NAME
:後端服務名稱PROJECT_ID
:專案 IDREGION_A
和REGION_B
:負載平衡器已設定的區域。SERVERLESS_NEG_NAME
:第一個無伺服器 NEG 的名稱SERVERLESS_NEG_NAME_2
:第二個無伺服器 NEG 的名稱
匯入最新設定,更新後端服務。
gcloud compute backend-services import BACKEND_SERVICE_NAME \ --source=BACKEND_SERVICE_NAME.yaml --global
後端服務現在已啟用離群值偵測功能。