idou老師教你學Istio11 : 如何用Istio實現流量熔斷
在之前的最佳實踐中,已經帶大家通過一系列的實踐任務領略了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的目標規則來對請求數啟動熔斷機制。