idou老師教你學Istio11 : 如何用Istio實現流量熔斷

在之前的最佳實踐中,已經帶大家通過一系列的實踐任務領略了Istio的無窮魅力。今天,將向大家介紹如何用Istio實現流量熔斷。

熔斷機制是創建彈性微服務應用程序的重要模式。熔斷可以幫助您自由控制故障影響的範圍、網絡延遲的峯值以及抵禦其他一些來自外部的惡意***等場景。

在接下來的任務中,idou老師將通過配置一個熔斷器來詳細介紹如何在Istio中實現熔斷,以及背後的原理。

首先,我們需要添加一個應用程序來模擬訪問網絡中的通信。接着我們按照前面Istio實踐中所要求的將Sidecar注入進應用中,然後啓動應用。

步驟一

爲了演示Istio的熔斷功能,我們需要創建熔斷器,並在熔斷器中設置一個目標規則,如下所示:

idou老師教你學Istio11 : 如何用Istio實現流量熔斷

在本步驟中,我們可以理解爲Istio的熔斷功能主要是通過在鏈接池中加入上述三個參數:

MaxConnections定義了到目標主機的 HTTP1/TCP 最大連接數;

http1MaxPendingRequests定義了針對一個目標的 HTTP 請求的最大排隊數量;

maxRequestsPerConnection定義了對某一後端的請求中,一個連接內能夠發出的最大請求數量。如果將這一參數設置爲 1 則會禁止 keep alive 特性。

在上述yaml文件中,我們爲了方便進行實踐,所以都設置成了1,當然大家也可以根據自己的需求自己設定閾值。

步驟二

對於網絡通信熟悉的小夥伴應該都知道,模擬網絡通信的環境需要一個服務端接收請求,一個請求端發送請求。剛剛我們已經創建完成一個服務端,並給服務端配置了熔斷的條件,現在我們繼續創建一個請求端來發送請求觸發熔斷機制。

我們用了官網上的一個例子fortio來進行測試。這個客戶端可以控制連接數量、併發數、以及發送HTTP請求的延遲,當然我們也必須將Sidecar注入其中。

步驟三

我們可以通過命令kubectl exec -it $FORTIO_POD -c fortio /usr/local/bin/fortio -- load -curl http://httpbin:8000/get來登入客戶端Pod,並使用剛剛創建的客戶端來調用httpbin。將會看到如下所示

idou老師教你學Istio11 : 如何用Istio實現流量熔斷

這表明我們創建的客戶端已經成功與服務端進行了一次通信。

步驟四

開始進入今天的主題,在上面的熔斷設置中指定了 maxConnections=1 以及 http1MaxPendingRequests=1。這意味着如果超過了一個連接同時發起請求,Istio 就會熔斷,阻止後續的請求或連接。我們不妨嘗試通過併發2個連接發送20個請求數來看一下結果。

idou老師教你學Istio11 : 如何用Istio實現流量熔斷

通過上圖不難看出,基本上所有的請求都發送成功了。明明我們設置的最大連接數是1,而我們模擬了兩個併發連接,理論上應該只有一半的請求能成功纔對,難道熔斷沒有成功?這裏別忘了我們還設置了http1MaxPendingRequests=1,正如在前文中介紹的,這個參數的功能類似於爲最大連接數提供了一級緩存,所以雖然我們的最大連接數是1,但是因爲這個參數也爲1,所以兩個併發連接的請求都可以發送成功。

步驟五

接下來我們再修改一下參數與步驟四做個對比,模擬併發連接數數改爲3請求數依然是20,我們將會看到如下圖所示的結果:

idou老師教你學Istio11 : 如何用Istio實現流量熔斷

正如我們在第三步中說的那樣,只有2/3的請求成功,還有1/3的請求數被熔斷。如果你覺得還不放心,那麼我們不妨再把http1MaxPendingRequests置爲2。這時候緩存區的請求相當於最大允許連接數的2倍,是不是併發數爲3的模擬連接發送的請求都可以成功呢?

idou老師教你學Istio11 : 如何用Istio實現流量熔斷

從上圖我們可以看到,確實如此,基本上所有的請求都成功了。

通過今天的實踐我們就可以知道,如何通過修改Istio的目標規則來對請求數啓動熔斷機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章