在之前的最佳實踐中,已經帶大家通過一系列的實踐任務領略了Istio的無窮魅力。今天,將向大家介紹如何用Istio實現流量熔斷。
熔斷機制是創建彈性微服務應用程序的重要模式。熔斷可以幫助您自由控制故障影響的范圍、網絡延遲的峰值以及抵御其他一些來自外部的惡意攻擊等場景。
在接下來的任務中,idou老師將通過配置一個熔斷器來詳細介紹如何在Istio中實現熔斷,以及背后的原理。
首先,我們需要添加一個應用程序來模擬訪問網絡中的通信。接着我們按照前面Istio實踐中所要求的將Sidecar注入進應用中,然后啟動應用。
步驟一
為了演示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。將會看到如下所示:
這表明我們創建的客戶端已經成功與服務端進行了一次通信。
步驟四
開始進入今天的主題,在上面的熔斷設置中指定了 maxConnections=1 以及 http1MaxPendingRequests=1。這意味着如果超過了一個連接同時發起請求,Istio 就會熔斷,阻止后續的請求或連接。我們不妨嘗試通過並發2個連接發送20個請求數來看一下結果。
通過上圖不難看出,基本上所有的請求都發送成功了。明明我們設置的最大連接數是1,而我們模擬了兩個並發連接,理論上應該只有一半的請求能成功才對,難道熔斷沒有成功?這里別忘了我們還設置了http1MaxPendingRequests=1,正如在前文中介紹的,這個參數的功能類似於為最大連接數提供了一級緩存,所以雖然我們的最大連接數是1,但是因為這個參數也為1,所以兩個並發連接的請求都可以發送成功。
步驟五
接下來我們再修改一下參數與步驟四做個對比,模擬並發連接數數改為3請求數依然是20,我們將會看到如下圖所示的結果:
正如我們在第三步中說的那樣,只有2/3的請求成功,還有1/3的請求數被熔斷。如果你覺得還不放心,那么我們不妨再把http1MaxPendingRequests置為2。這時候緩存區的請求相當於最大允許連接數的2倍,是不是並發數為3的模擬連接發送的請求都可以成功呢?
從上圖我們可以看到,確實如此,基本上所有的請求都成功了。
通過今天的實踐我們就可以知道,如何通過修改Istio的目標規則來對請求數啟動熔斷機制。