練習 - 識別並解決輸入網路連線問題

已完成

在我們的案例中,已對網路設定進行了變更。 您收到警示,表示後端集區中的虛擬機器對健康情況探查沒有回應。 現在您需要診斷這些失敗的原因,並加以修正。

在本練習中,您會使用指令碼來重新設定環境,並使健康狀態探查失敗。 您會使用本課程模組中學到的技能,讓負載平衡的 HTTP 服務能夠再度全面運作。

重新設定負載平衡器並重新測試

  1. 在 Azure Cloud Shell 中,設定資源群組名稱。

    export RESOURCEGROUP=learn-ts-loadbalancer-rg
    
  2. 前往 src/scripts 資料夾。

    cd ~/load-balancer/src/scripts
    
  3. 執行下列命令來重新設定負載平衡器、網路和虛擬機器。 此指令碼會介紹一些您將診斷並修正的問題。

    bash reconfigure.sh
    
  4. 執行下列命令,移動到 src/stresstest 資料夾。

    cd ~/load-balancer/src/stresstest
    
  5. 再次執行壓力測試,並將 <ip address>替換成負載平衡器的 IP 位址。 如果您不記得此位址,請再次執行 src/scripts/findip.sh 指令碼。

    dotnet run <ip address>
    

    這次,應用程式不會產生任何輸出,且最後可能逾時並顯示「將要求傳送至 Load Balancer 時發生錯誤: 作業已取消」訊息。請按 Enter 鍵停止應用程式。

  6. 在 Azure 入口網站中,選取 [儀表板]>[dashboard-learn-ts-loadbalancer]

  7. 檢閱顯示健康狀態探查狀態和資料路徑可用性的儀表板。 您可能需要將時間範圍變更為過去 30 分鐘。 儀表板看起來應該如下圖,且這兩個計量都已降至零。

    此螢幕擷取畫面顯示健全狀態探查狀態和資料路徑可用性處於狀況不良狀態。

    此圖表顯示虛擬機器未回應來自負載平衡器的健康狀態探查要求。 因此,這些虛擬機器已標示為狀況不良。 用戶端與這些虛擬機器上執行的應用程式之間沒有可用資料路徑。

診斷並修正問題

第一步是要檢查虛擬機器是否正在執行。 讓我們一次解決一部虛擬機器的問題。 因此先看一下 appretailvm1。 稍後再檢查 appretailvm2

測試 appretailvm1 虛擬機器

您無法直接 ping appretailvm1appretailvm2 虛擬機器,因為這些虛擬機器的私人位址僅供相同子網路上其他虛擬機器使用。 首先,請連線到具有公用 IP 位址,且位於相同子網路中的跳躍方塊。 然後您可從該處 ping 虛擬機器。

  1. 返回 Cloud Shell。

  2. 執行下列命令,取得跳躍方塊虛擬機器的 IP 位址。

    bash ~/load-balancer/src/scripts/jumpboxip.sh
    
  3. 執行下列命令,取得在執行初始安裝指令碼時所建立的密碼。 複製此密碼以供下一個步驟使用。

    cd ~/load-balancer/src/scripts
    cat passwd.txt
    
  4. 使用上一個命令輸出中的 IP 位址和密碼登入跳躍方塊。 如果使用了不同的使用者名稱,請使用該名稱取代 azureuser

    ssh azureuser@<jump box ip address>
    
  5. 在跳躍方塊中,執行下列命令來測試 retailappvm1 虛擬機器是否正在執行。

    ping retailappvm1 -c 10
    

    retailappvm1 虛擬機器應該會回應,指出該虛擬機器正在執行。 下一步是要確認 Web 應用程式是否正在這部虛擬機器上執行。

  6. 執行下列命令,將 HTTP GET 要求傳送至 retailappvm1 虛擬機器。

    curl -v http://retailappvm1
    

    同樣地,此命令應該會成功。

檢查健康狀態探查和路由規則

retailappvm1 虛擬機器已啟動,且應用程式正在該虛擬機器上執行。 負載平衡器與後端集區中的虛擬機器之間一定存在問題。

  1. Azure 入口網站中搜尋監視器。

  2. 在 [監視器 - 概觀] 頁面上,選取 [服務健康狀態]

    此螢幕擷取畫面顯示從左側功能表中選取 [服務健康狀態] 選項。

  3. 選取 [資源健康狀態]

  4. 在 [資源類型] 方塊中,選取 [負載平衡器]。 在資源清單中,選取 [retailapplb]

    [服務健康狀態 - 資源健康情況] 頁面的螢幕擷取畫面,顯示已選取 retailapplb。

  5. 等候幾分鐘,以便評估負載平衡器的健康狀態。

  6. 在 [健康狀態歷程記錄] 中,展開最上方事件,並檢閱建議的步驟。 這些步驟建議檢查負載平衡器中的 VIP (路由規則) 和 DIP (健康狀態探查) 端點。

    [資源健康情況] 頁面的螢幕擷取畫面顯示健康情況記錄,包括日期、健康情況事件數目、狀態、描述和建議步驟。

  7. 移至資源群組 learn-ts-loadbalancer-rg,然後選取 [retailapplb]

  8. 選取 [負載平衡規則]>[retailapprule]。 此規則會在前端 IP 位址的連接埠 80 上接收 TCP 流量,並將其傳送至後端集區中所選虛擬機器上的連接埠 80。 雖然健康狀態探查所使用的連接埠看起來很可疑,但此設定似乎是正確的。 目前設定為連接埠 85。

    [Retailapprule] 頁面的螢幕擷取畫面,其中顯示健全狀態探查正在使用通訊埠 85。

  9. 關閉 [retailapprule] 頁面。

  10. 選取 [健康狀態探查]>[retailapphealthprobe]

  11. 將 [連接埠] 從 85 改回 80,然後選取 [儲存]

    [Retailapphealthprobe] 頁面的螢幕擷取畫面,其中顯示更新為 80 的連接埠號碼。

  12. 請等待數分鐘。

  13. 在 Azure 入口網站左側的功能表中,選取 [儀表板]

  14. 在儀表板上,選取顯示 [健康狀態探查狀態] 和 [資料路徑可用性] 計量的圖表。 [資料路徑可用性] 計量應該上升到 100,但 [健康狀態探查狀態] 計量會停留在 50 左右。 現在有一個從負載平衡器到至少一部虛擬機器的路徑可用,但只有 50% 的虛擬機器會顯示為狀況良好。

    健全狀態探查狀態和資料路徑可用性圖表的螢幕擷取畫面,其中資料路徑可用性是 100,但健全狀態探查狀態停留在 50 左右。

    選取圖表以移至 Load Balancer 的 [計量] 頁面。 您可在此頁面重新整理圖表,並放大特定的時間週期。

  15. 在 Cloud Shell 中,執行下列命令以離開跳躍方塊。

    exit
    
  16. 使用負載平衡器的 IP 位址再次執行壓力測試應用程式。

    cd ~/load-balancer/src/stresstest
    dotnet run <ip address>
    

    和之前一樣,測試仍然會失敗。 現在有一個從負載平衡器到至少一部虛擬機器的路徑,但此路徑無法從虛擬網路外部執行的用戶端運作。 按 Enter 停止壓力測試應用程式。

檢查子網路的 NSG 規則

此問題可能是因為網路安全性規則封鎖了外部流量所造成。

  1. 在 Azure 入口網站中,前往資源群組 learn-ts-loadbalancer-rg

  2. 選取 [retailappnsg] 網路安全性群組。 此安全性群組會決定允許通過虛擬網路的流量。

  3. 選取 [輸入安全性規則]。 雖然有一項規則允許來自負載平衡器 (在虛擬網路中執行) 的傳入流量,但並沒有任何規則允許源自虛擬網路外部的流量通過連接埠 80。

  4. 選取新增。 [新增輸入安全性規則] 窗格隨即出現。

  5. 輸入下列設定,然後選取 [新增]

    屬性 數值
    來源 任何
    來源連接埠範圍 *
    Destination 任意
    服務 自訂
    目的地連接埠範圍 80
    通訊協定 TCP
    動作 允許
    優先順序 100
    名稱 Port_80
    描述 HTTP 連接埠
  6. 在 Cloud Shell 中,使用負載平衡器的 IP 位址再次執行壓力測試應用程式。

    cd ~/load-balancer/src/stresstest
    dotnet run <ip address>
    

    應用程式開始執行,但您只會收到來自 retailappvm1 虛擬機器的回應。 允許應用程式執行二或三分鐘。 按 Enter 以停止。

  7. 在 Azure 入口網站中,前往儀表板。

  8. 選取 [平均封包計數] 計量的圖表。 請注意最新執行的壓力測試應用程式尖峰值。 此值至少應是稍早兩部虛擬機器都可使用時的記錄值兩倍。 雖然現在有可運作的系統,但工作虛擬機器仍有多載的危險。

測試 appretailvm2 虛擬機器

appretailvm2 虛擬機器似乎無法正確處理要求。 您需要檢查這部虛擬機器是否已啟動,以及負載平衡器是否可以連線到此虛擬機器。

  1. 在 Cloud Shell 中,使用上一個命令輸出中的 IP 位址和密碼登入跳躍方塊

    ssh azureuser@<jump box ip address>
    
  2. 嘗試 ping appretailvm2 虛擬機器。

    ping retailappvm2 -c 10
    

    虛擬機器無法回應,且 ping 命令報告 100% 的封包遺失。 retailappvm2 虛擬機器未執行,或發生網路問題。

  3. 在 Azure 入口網站中,前往資源群組 learn-ts-loadbalancer-rg

  4. 選取 retailappvm2 虛擬機器。

  5. [概觀] 頁面會顯示虛擬機器已停止。 選取 [開始],然後等待機器開始執行。

    顯示 [retailappvm2] 虛擬機器的 [總覽] 頁面的螢幕擷取畫面,其中反白顯示 [開始] 按鈕。

  6. 返回連線到跳躍方塊的 Cloud Shell,並重複執行 ping 命令。

    ping retailappvm2 -c 10
    

    ping 作業這次應該會成功。

  7. 測試在 retailappvm2 虛擬機器上執行的應用程式是否回應。

    wget retailappvm2
    

    此命令逾時。可能是應用程式未執行,或網路發生問題。 選取 Ctrl+C 來停止命令。

  8. 在跳躍方塊上,登入 retailappvm2 虛擬機器。 出現提示時,請輸入稍早指定的相同密碼。

    ssh azureuser@retailappvm2
    
  9. 執行下列命令,測試此虛擬機器上的應用程式。

    wget retailappvm2
    

    此命令應會成功,並建立包含回應的檔案 index.html

  10. 檢查此 index.html 檔案。

    cat index.html
    

    此檔案應包含訊息 retailappvm2,並顯示此虛擬機器如預期回應。

  11. 關閉 retailappvm2 虛擬機器的連線。

    exit
    
  12. 關閉跳躍方塊的連線。

    exit
    

    retailappvm2 虛擬機器已啟動,且應用程式正在執行,卻無法從虛擬機器外部連線至應用程式。 此狀況表示網路發生問題。

  13. 在 Azure 入口網站中,前往資源群組 learn-ts-loadbalancer-rg

  14. 選取 retailappnicvm2nsg 網路安全性群組。

  15. 選取 [輸入安全性規則]

    網路安全性群組的輸入規則會封鎖所有使用 TCP 通訊協定的外部流量。 此規則的優先順序在開啟連接埠 80 的規則之前,所以會優先執行。

    此螢幕擷取畫面顯示 NSG 的輸入安全性規則。

  16. 選取 retailappvnetnsgrulevm2denyall 規則,將優先順序變更為 300,然後選取 [儲存]

    此螢幕擷取畫面顯示輸入規則的編輯頁面。

  17. 等候兩分鐘,然後前往 [儀表板]

  18. 選取顯示 [健康狀態探查狀態] 計量的圖表。 此計量的值應該增加到 100。 您可能需要重新整理圖表數次。

    此螢幕擷取畫面顯示負載平衡器的健全狀態探查狀態。

  19. 切換至 Cloud Shell,使用負載平衡器的 IP 位址再次執行 stresstest 應用程式。

    cd ~/load-balancer/src/stresstest
    dotnet run <ip address>
    

    您現在應該會看到來自 retailappvm1retailappvm2 的訊息。 您已還原系統的完整連線。

  20. Enter 以停止應用程式。

摘要

在本練習開始時,您看到虛擬機器未回應來自負載平衡器的健康狀態探查要求。 您發現並解決了探查和資料路徑的混合問題:

  • 在負載平衡器規則 retailapprule 中,健康狀態探查使用的連接埠誤設為連接埠 85,而不是 80。 您將規則更新為使用連接埠 80。
  • 網路安全性群組 retailappnsg 沒有允許連接埠 80 流量的輸入安全性規則。 所以網路安全性群組封鎖了健康狀態探查。 您新增了輸入安全性規則,以允許連接埠 80 的流量。
  • 您檢查了 VM retailappvm2,發現其已停止。 所以重新開機 VM。
  • 啟動 VM retailappvm2 並看到應用程式開始執行後,還是無法連線到應用程式。 網路安全性群組的輸入規則封鎖了所有使用 TCP 通訊協定的網路流量。 此「全部拒絕」規則優先於允許連接埠 80 流量的輸入安全性規則。 您變更了「全部拒絕」規則的優先順序,使其位於連接埠 80 規則之後。 此變更允許連接埠 80 的 TCP 輸入網路流量。

您傳回了負載平衡的 HTTP 服務以完整作業。