排解內部直通式網路負載平衡器的問題

本指南說明如何排解 Google Cloud 內部直通式網路負載平衡器的設定問題。請先熟讀下列頁面內容後,再研究問題。

排解網路分析器的常見問題

網路分析器會自動監控虛擬私有雲網路設定,並偵測不盡理想的設定和錯誤設定。它會找出網路故障、提供根本原因資訊,並建議可能的解決方法。如要瞭解 Network Analyzer 自動偵測到的各種錯誤設定情況,請參閱 Network Analyzer 說明文件中的「負載平衡器深入分析」。

Google Cloud 控制台提供 Network Intelligence Center 中的 Network Analyzer。

前往網路分析器

後端有不相容的平衡模式

建立負載平衡器時,您可能會看到以下錯誤訊息:

Validation failed for instance group INSTANCE_GROUP:

backend services 1 and 2 point to the same instance group
but the backends have incompatible balancing_mode. Values should be the same.

當您嘗試在兩個不同的負載平衡器中使用相同的後端,且後端沒有相容的平衡模式時,就會發生這種情況。

如要瞭解詳情,請參考下列資源:

排解一般連線問題

如果您無法連線至內部直通式網路負載平衡器,請檢查以下常見問題。

確認防火牆規則

  • 確認您已將允許輸入防火牆規則定義成允許對後端 VM 執行健康狀態檢查。
  • 確認允許輸入防火牆規則會讓來自用戶端的流量傳送到後端 VM。
  • 確認相關防火牆規則已存在,讓流量可透過負載平衡器使用的通訊埠,傳送至後端 VM。
  • 如果您使用防火牆規則的目標標記,請確認負載平衡器的後端 VM 已適當標記。

如要瞭解如何設定內部直通網路負載平衡器所需的防火牆規則,請參閱「設定防火牆規則」。

確認訪客環境是否在後端 VM 上執行

如果您可以連線至運作正常的後端 VM,但無法連線至負載平衡器,可能是 VM 上的訪客環境 (舊稱 Windows 訪客環境或 Linux 訪客環境) 未執行,或無法與中繼資料伺服器 (metadata.google.internal169.254.169.254) 通訊。

請檢查以下事項:

確認後端 VM 接受傳送至負載平衡器的封包

每個後端 VM 都必須設定為接受傳送至負載平衡器的封包。也就是說,傳送至後端 VM 的封包目的地是負載平衡器的 IP 位址。在大多數情況下,這項作業會透過本機路由完成。

如果是從 Google Cloud 映像檔建立的 VM,Guest 代理程式會為負載平衡器的 IP 位址安裝本機路由。以 Container-Optimized OS 為基礎的 Google Kubernetes Engine 執行個體會改為使用 iptables 實作這項功能。

在 Linux 後端 VM 上,您可以執行下列指令,確認本機路徑是否存在。將 LOAD_BALANCER_IP 替換為負載平衡器的 IP 位址:

sudo ip route list table local | grep LOAD_BALANCER_IP

驗證後端 VM 上的服務 IP 位址和通訊埠繫結

傳送至內部直通式網路負載平衡器的封包會連同負載平衡器本身的目的地 IP 位址抵達後端 VM。這類負載平衡器不是 Proxy,因此這是預期的行為。

在後端 VM 上執行的軟體必須執行下列操作:

  • 監聽 (繫結至) 負載平衡器的 IP 位址或任何 IP 位址 (0.0.0.0::)
  • 在負載平衡器轉送規則中列出的通訊埠上聽取 (繫結)

如要測試這項功能,請使用 SSH 或 RDP 連線至後端 VM。接著,請使用 curltelnet 或類似工具執行下列測試:

  • 嘗試使用後端 VM 本身的內部 IP 位址、127.0.0.1 或 localhost 與服務連線。
  • 嘗試使用負載平衡器轉送規則的 IP 位址與服務連線。

檢查用戶端 VM 是否與負載平衡器位於相同的地區

如果連線到負載平衡器的用戶端位於其他區域,請務必啟用全域存取權

確認健康狀態檢查流量可傳送至後端 VM

如要確認健康狀態檢查流量傳送至後端 VM,請啟用健康狀態檢查記錄功能,並搜尋成功的記錄項目。

您也可以查看後端的「健康」狀態,確認負載平衡器功能是否正常運作。

如果後端沒有健康的執行個體,請確認是否已設定適當的健康狀態檢查,且後端中的每個 VM 都會監聽已設定的健康狀態檢查通訊埠。

從位於相同虛擬私有雲網路的用戶端執行下列指令,確認後端 VM 是否正在特定 TCP 連接埠上偵聽:

telnet SERVER_IP_ADDRESS PORT

更改下列內容:

  • SERVER_IP_ADDRESS:後端 VM 的 IP 位址。
  • PORT:您為健康狀態檢查所設定的通訊埠。根據預設,健康狀態檢查通訊埠為 80

或者,您也可以使用 SSH 連線至後端 VM,然後執行下列指令:

curl localhost:PORT

再次將 PORT 替換為您為健康檢查設定的通訊埠。

您也可以執行下列指令來執行這項測試:

netstat -npal | grep LISTEN

在輸出內容中,檢查以下項目:

  • <var>LB_IP_ADDRESS</var>:<var>PORT</var>
  • 0.0.0.0:<var>PORT</var>
  • :::<var>PORT</var>

這不會判斷路由是否正確設定,以便回應負載平衡器的 IP 位址。這是另一個有類似症狀的問題。如要進行路由,請執行 ip route list table local 指令,並確認負載平衡器的 IP 位址是否列出,如「驗證後端 VM 是否接受傳送至負載平衡器的封包」一文所述。

排解效能問題

如果您發現效能問題和延遲時間增加,請檢查下列常見問題。

驗證伺服器功能

如果所有後端伺服器都回應健康檢查,請確認直接在伺服器上發出的用戶端要求是否正常運作。舉例來說,如果用戶端透過負載平衡器向伺服器傳送 HTTP 要求,但沒有收到回應,或是回應速度明顯慢於正常速度,請在每個後端伺服器上發出相同的 HTTP 要求,並觀察行為。

如果在伺服器內部發出要求時,任何個別的後端伺服器都無法正常運作,您可以判斷伺服器應用程式堆疊無法正常運作。您可以進一步針對應用程式本身進行疑難排解。如果所有伺服器都正常運作,下一個步驟就是查看用戶端和網路。

驗證網路連線和延遲

如果所有後端伺服器都能正確回應要求,請確認網路延遲時間。從用戶端 VM 發出持續 ping 指令至每個伺服器,如下所示:

ping SERVER_IP_ADDRESS

這項測試會顯示內建網路延遲時間,以及網路是否會捨棄封包。在某些情況下,防火牆規則可能會封鎖 ICMP 流量。如果是,則這項測試無法產生任何結果。請向防火牆規則管理員確認是否為此情形。

如果 ping 指令顯示的延遲時間明顯高於正常值,或封包遺失率明顯偏高,請開啟 Google Cloud 支援案件,進一步調查。

找出有問題的用戶端伺服器組合

如果網路 ping 測試顯示低延遲且沒有封包遺失,下一步就是找出哪些特定用戶端-伺服器組合會產生有問題的結果。方法是將後端伺服器數量減半,直到伺服器數量達到 1 為止,同時重現有問題的行為 (例如高延遲或沒有回應)。

如果您發現一或多個有問題的用戶端-伺服器組合,請執行流量擷取和分析

如果找不到有問題的用戶端-伺服器組合,請直接進行效能測試

擷取及分析流量

如果您發現特定的用戶端-伺服器組合有問題,可以使用封包擷取功能,找出導致通訊延遲或中斷的部分。您可以使用 tcpdump 執行封包擷取作業,方法如下:

  1. 在伺服器上安裝 tcpdump。
  2. 在伺服器上啟動 tcpdump 擷取作業。
  3. 從用戶端發出範例要求,例如:

    curl URL
    
  4. 分析 tcpdump 輸出內容,找出問題。

進行效能測試

如果您找不到任何有問題的用戶端-伺服器組合,且所有用戶端和伺服器的總體效能低於預期,請考慮進行下列測試:

  1. 一個用戶端和一個伺服器,不進行負載平衡。
  2. 一個用戶端和一個伺服器,並提供負載平衡功能。

    結果:將測試 [1] 和 [2] 的結果組合起來,即可判斷問題是否由負載平衡器造成。

  3. 一個用戶端和多個伺服器,並提供負載平衡功能。

    結果:找出單一客戶的成效限制。

  4. 多個用戶端和一台伺服器,並具備負載平衡功能。

    結果:找出單一伺服器的效能限制。

  5. 多個用戶端和多個伺服器,且未進行負載平衡。

    結果:找出聯播網的成效限制。

使用多個用戶端和伺服器執行壓力測試時,用戶端或伺服器資源 (CPU、記憶體、I/O) 可能會成為瓶頸,並降低總和結果。即使每個用戶端和伺服器都正常運作,仍可能發生匯總結果降級的情形。

排解共用虛擬私有雲問題

如果您在使用共用虛擬私有雲,且無法在特定子網路中建立新的內部轉送網路負載平衡器,原因可能在於組織政策。請在組織策略中,將該子網路新增到允許的子網路清單中,或是與您的機構組織管理員聯絡。詳情請參閱 constraints/compute.restrictSharedVpcSubnetworks 限制。

排解容錯移轉問題

如果您已為內部直通式網路負載平衡器設定容錯移轉功能,下列幾個小節將會說明可能會發生的問題。

連線能力

  • 確認您至少指定了一個容錯移轉後端。
  • 確認容錯移轉政策設定是否正確:
    • 容錯移轉率
    • 在所有後端 VM 的健康狀態都不良時會捨棄流量
    • 停用會在容錯移轉時排除連線的功能

代管執行個體群組和容錯移轉的問題

  • 發生的情況:使用中的集區來回在主要後端和容錯移轉後端之間切換。
  • 可能的原因:使用有自動調度資源和容錯移轉功能的代管執行個體群組,可能會導致使用中集區在容錯移轉和容錯回復後端之間來回地容錯移轉及容錯回復。 Google Cloud 不會阻止您為代管執行個體群組設定容錯移轉,因為部署作業可能受惠於這項設定。

停用容錯移轉群組的連線排除限制

只有在後端服務使用通訊協定 TCP 時,停用連線排除才會發生作用。

如果您在連線排除功能停用時建立使用 UDP 的後端服務,就會看到以下錯誤訊息:

gcloud compute backend-services create my-failover-bs \
    --global-health-checks \
    --load-balancing-scheme=internal \
    --health-checks=my-tcp-health-check \
    --region=us-central1 \
    --no-connection-drain-on-failover \
    --drop-traffic-if-unhealthy \
    --failover-ratio=0.5 \
    --protocol=UDP
ERROR: (gcloud.compute.backend-services.create) Invalid value for
[--protocol]: can only specify --connection-drain-on-failover if the protocol is
TCP.

流量會傳送到非預期的後端 VM

請先檢查下列事項:如果用戶端 VM「也是」負載平衡器的後端 VM,則傳送至負載平衡器轉送規則 IP 位址的連線,一定會是由該後端 VM 來回應。詳情請參閱「測試來自單一用戶端的連線」和「從達到負載平衡的 VM 傳送要求」。

如果用戶端 VM「不是」負載平衡器的後端 VM:

  • 針對來自單一用戶端的要求,請參閱測試來自單一用戶端的連線,以便瞭解這種方法的限制。

  • 確認您已經把允許輸入防火牆規則設定成會允許執行健康狀態檢查

  • 針對容錯移轉設定,請確保您瞭解成員資格在使用中集區中的運作方式,以及Google Cloud 何時會執行容錯移轉和容錯回復。請檢查您負載平衡器的設定:

    • 使用 Google Cloud 控制台,查看每個後端執行個體群組中,健康狀態良好的後端 VM 數量。 Google Cloud 控制台也會顯示有哪些 VM 在使用中集區中。

    • 確認負載平衡器的容錯移轉比例已正確設定。舉例來說,如果您有 10 個主要 VM,且將容錯移轉比例設定為 0.2,則 Google Cloud 會在健康狀態良好的主要 VM 數量「少於」兩個 (10 × 0.2 = 2) 時執行容錯移轉。0.0 的容錯移轉比例是有特殊意義的,這代表 Google Cloud 會在所有主要 VM 的健康狀態都不佳時執行容錯移轉。

現有的連線在容錯移轉或容錯回復期間遭到終止

編輯您後端服務的容錯移轉政策,確認在容錯移轉時排除連線的功能已停用。

排解以負載平衡器做為下一個躍點的問題

當您將內部直通式網路負載平衡器設定為自訂靜態路徑的下一個躍點時,可能會發生以下問題:

連線問題

  • 如果您無法連線偵測 (ping) 路徑目的地範圍內的 IP 位址,且下一個躍點是內部直通式網路負載平衡器的轉送規則,請注意,使用這類下一個躍點的路徑可能不會處理 ICMP 流量,具體取決於路徑建立的時間。如果路徑是在 2021 年 5 月 15 日前建立,則只會在 2021 年 8 月 16 日前處理 TCP 和 UDP 流量。自 2021 年 8 月 16 日起,所有路徑都會自動轉送所有通訊協定流量 (TCP、UDP 和 ICMP),不論路徑建立時間為何。如果不想等到那時,您可以立即啟用 ping 功能,方法是建立新的路徑並刪除舊路徑。

  • 無論負載平衡器的內部後端服務設定了哪種通訊協定,也無論負載平衡器的內部轉送規則設定了哪個/哪些通訊埠,只要您使用內部直通式網路負載平衡器做為自訂靜態路徑的下一個躍點,所有流量都會傳送至負載平衡器的健康後端 VM。

  • 確認您建立的允許輸入防火牆規則會正確地找出應該要透過自訂靜態路徑的下一個躍點傳送到後端 VM 的流量來源。就算封包是透過自訂靜態路徑來傳送的,抵達後端 VM 的封包也會保留自己的來源 IP 位址。

目的地範圍的值無效

自訂靜態路徑的目的地範圍,不能比虛擬私人雲端網路中的任何子網路路徑更明確。如果您在建立自訂靜態路徑時收到以下錯誤訊息:

Invalid value for field 'resource.destRange': [ROUTE_DESTINATION].
[ROUTE_DESTINATION] hides the address space of the network .... Cannot change
the routing of packets destined for the network.
  • 當您建立自訂靜態路徑時,無法建立其目的地與某個子網路路徑完全相同或更明確 (遮蓋更長) 的自訂靜態路徑。詳情請參閱適用範圍與順序

  • 如果系統將封包傳送到非預期的目的地,請移除虛擬私人雲端中目的地更明確的其他路徑。請參閱轉送順序,瞭解 Google Cloud 路徑選取方式。

排解記錄問題

如果您為內部直通式網路負載平衡器設定記錄功能,可能會發生下列問題:

  • 如果取樣封包數不足以擷取 RTT,部分記錄檔可能就不會顯示 RTT 測量結果,例如位元組值。低流量連線較常發生這種情況。
  • RTT 值僅適用於 TCP 流程。
  • 部分封包會在沒有酬載的情況下傳送。如果系統取樣到內容只有標頭的封包,位元組的值會顯示 0

後續步驟