Istio熔斷器解析

做者:Laszlo Bence Nagygit

譯者:馬若飛github

審校:羅廣明web

原文:https://banzaicloud.com/blog/istio-circuit-breaking/json

編者按

做者簡要介紹了熔斷的概念,而後以實戰演練的方式分別演示瞭如何經過Backyards UI、CLI等方式建立並設置熔斷功能。注:Backyards是Banzai Cloud開發的一款基於Istio的服務網格產品,本文是該產品功能介紹系列中的一篇。後端

前言

Istio因靈活的可觀察性和安全的服務間通訊受到了讚許。然而,其餘更重要的功能才真正使得Istio成爲了服務網格里的瑞士軍刀,當遇到運行時長、延遲和錯誤率等SLO問題時,服務間的流量管理能力是相當重要的。api

在今年早些時候發佈 Istio operator 時,咱們的目標(除了管理Istio的安裝和升級)是爲這些出色的流量路由特性提供支持,同時使全部的功能都更加易用。最後,咱們建立了一個簡單且自動化的服務網格Backyards,它在Istio operator之上提供了管理UI、CLI 和GraphQL API的能力。Backyards集成到了Banzai Cloud的容器管理平臺 Pipeline中,也能夠做爲一個單一的產品獨立工做。固然,將Backyards與Pipeline一塊兒使用會爲用戶提供特別的好處(好比在多雲和混合雲環境中管理應用程序),Backyards也能夠被用於任何Kubernetes的安裝環境。安全

咱們已經發布了一些Backyards相關特性的文章好比:架構

- 使用Backyards自動金絲雀部署併發

- 流量切換app

熔斷:失敗是一個選項

在微服務架構中,服務可能會用不一樣的語言實現並部署在多個節點或集羣上,具備不一樣的響應時間或故障率。若是服務成功(而且及時地)響應了請求,那麼它的性能就算是使人滿意的。但現實狀況並不是如此,下游客戶端應該在上游服務過於緩慢時受到保護。反之,上游服務也必須被保護,以避免被積壓的請求拖垮。在多客戶端下狀況會更加複雜,並可能致使整個基礎設施出現一系列的連鎖故障。這一問題的解決方案是採用通過時間檢驗的熔斷器模式。

一個熔斷器能夠有三種狀態:關閉、打開和半開,默認狀況下處於關閉狀態。在關閉狀態下,不管請求成功或失敗,到達預先設定的故障數量閾值前,都不會觸發熔斷。而當達到閾值時,熔斷器就會打開。當調用處於打開狀態的服務時,熔斷器將斷開請求,這意味着它會直接返回一個錯誤,而不去執行調用。經過在客戶端斷開下游請求的方式,能夠在生產環境中防止級聯故障的發生。在通過事先配置的超時時長後,熔斷器進入半開狀態,這種狀態下故障服務有時間從其中斷的行爲中恢復。若是請求在這種狀態下繼續失敗,則熔斷器將再次打開並繼續阻斷請求。不然熔斷器將關閉,服務將被容許再次處理請求。

Circuit Breaking

Istio中的熔斷

Istio的 熔斷 能夠在 流量策略 中配置。Istio的 自定義資源Destination Rule裏,TrafficPolicy字段下有兩個和熔斷相關的配置: ConnectionPoolSettingsOutlierDetection

ConnectionPoolSettings能夠爲服務配置鏈接的數量。OutlierDetection用來控制從負載均衡池中剔除不健康的實例。

例如,ConnectionPoolSettings控制請求的最大數量,掛起請求,重試或者超時;OutlierDetection 設置服務被從鏈接池剔除時發生錯誤的請求數,能夠設置最小逐出時間和最大逐出百分比。有關完整的字段列表,請參考文檔.

Istio在底層使用了Envoy的熔斷特性

讓咱們來看看Destination Rule中有關熔斷的配置:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: notifications
spec:
  host: notifications
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutiveErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100複製代碼

使用ConnectionPoolSettings字段中的這些設置,在給定的時間內只能和notifications 服務創建一個鏈接:每一個鏈接最多隻能有一個掛起的請求。若是達到閾值,熔斷器將開始阻斷請求。

OutlierDetection部分的設置用來檢查每秒調用服務是否有錯誤發生。若是有,則將服務從負載均衡池中逐出至少三分鐘(100%最大彈出百分比表示,若是須要,全部的服務實例均可以同時被逐出)。

在手動建立Destination Rule資源時有一件事須要特別注意,那就是是否爲該服務啓用了mTLS。若是是的話,還須要在Destination Rule中設置以下字段,不然當調用movies服務時,調用方可能會收到503錯誤:

trafficPolicy:
   tls:
  mode: ISTIO_MUTUAL複製代碼

還能夠爲特定namespace 或特定服務啓用全局的mTLS。你應該瞭解這些設置以便肯定是否把trafficPolicy.tls.mode設置爲 ISTIO_MUTUAL。更重要的是,當你試圖配置一個徹底不一樣的功能(例如熔斷)時,很容易忘記設置此字段。

提示:在建立Destination Rule前老是考慮mTLS!

爲了觸發熔斷,讓咱們同時從兩個鏈接來調用 notifications服務。maxConnections字段被設置爲1。這時應該會看到503與200的響應同時到達。

當一個服務從客戶端接收到的負載大於它所能處理的負載(如熔斷器中配置的那樣),它會在調用以前返回503錯誤。這是防止錯誤級聯的一種方法。

監控

在生產環境中必需要監控你的服務,以便獲得通知並可以在系統發生錯誤時進行檢查。所以,若是你已經爲你的服務配置了一個熔斷器,你就會想知道它何時跳閘;熔斷器攔截了百分之多少的請求;什麼時候觸發,來自哪一個下游客戶端?若是可以回答這些問題,你就能夠肯定熔斷器是否工做正常,並根據須要微調配置,或者優化服務來處理額外的併發請求。

提示:若是你繼續閱讀,能夠在Backyards UI中看到和配置全部的這些設置。

讓咱們看看怎樣在Istio裏肯定熔斷器跳閘:

熔斷器跳閘時的響應碼是503,所以你沒法僅根據該響應與其餘的503錯誤區分開來。在Envoy中,有一個計數器叫upstream_rq_pending_overflow,它記錄了熔斷且失敗的請求總數。若是爲你的服務深刻研究Envoy的統計數據就能夠得到這些信息,但這並不容易。

除了響應代碼,Envoy還返回響應標誌 ,而且存在一個專用響應標誌來表示熔斷器跳閘:UO。若是這個標誌只能經過Envoy的日誌得到,這將不會特別有用。幸運的是,它在Istio中實現了,所以響應標誌在Istio指標中是可用的而且能被Prometheus獲取到。

熔斷器的跳閘能夠像這樣查詢到:

sum(istio_requests_total{response_code="503", response_flags="UO"}) by (source_workload, destination_workload, response_code)複製代碼

Backyards的熔斷更簡單

使用Backyards時,你不須要手動編輯Destination Rules來設置熔斷。能夠經過一個方便的UI界面或者(若是你願意的話)是Backyards CLI 命令行工具來達到相同的結果。

沒必要擔憂因爲忘記把trafficPolicy.tls.mode 設置爲 ISTIO_MUTUAL而配錯了Destination Rules。Backyards會爲你解決這個問題;它會找到啓用了mTLS的服務並相應地設置上述字段。

上面只是Backyards驗證特性的一個例子,這能避免你設置錯誤。後面還有更多的特性。

在此之上,你能夠看到服務和請求的可視化界面和活動儀表板,所以能夠輕鬆地肯定有多少請求被熔斷器觸發,以及它來自哪一個調用者和什麼時候觸發。

熔斷實戰

建立一個集羣

首先,咱們須要一個Kubernetes集羣。

我經過Pipeline platform的免費開發版本在GKE上建立了一個Kubernetes集羣。若是你也想這樣作,能夠在咱們支持的五個雲提供商或使用Pipeline在本地建立集羣。不然,你須要提供本身的Kubernetes集羣。

安裝BACKYARDS

在一個新集羣安裝Istio,Backyards和demo應用的最簡單的辦法是使用Backyards CLI

你只須要執行下面的命令(集羣必須設置了KUBECONFIG):

$ backyards install -a --run-demo複製代碼

該命令首先使用咱們開源的Istio operator安裝Istio,而後安裝Backyards和demo應用程序。安裝完成後,Backyards UI將自動打開並向demo應用發送一些流量。經過這個簡單的命令,你能夠看到Backyards在幾分鐘內啓動了一個全新的Istio集羣!試試吧!

你也能夠按順序執行全部這些步驟。Backyards須要一個Istio集羣——若是沒有,能夠經過$ backyards istio install安裝。一旦安裝了Istio,就可使用$ backyards install安裝Backyards。最後,使用$ backyards demoapp install部署demo應用程序。

提示:Backyards是Pipeline平臺的核心組件——能夠嘗試開發者版本(Service Mesh 標籤頁)。

使用BACKYARDS UI建立熔斷

配置熔斷器

你不須要手動建立或編輯Destination Rule,能夠很容易的在UI界面中改變熔斷的配置。讓咱們先建立一個demo。

正如你將看到的,Backyards(與Kiali相比)不只是爲可觀察性構建的web UI,並且是具備豐富功能的服務網格管理工具,支持單集羣和多集羣,而且具備強大的CLI和GraphQL API。

Circuit Breaking set

查看熔斷器設置

你不須要經過Destination Rule(例如經過kubectl)來查看熔斷器的配置,當你點擊notification 服務圖標並切換SHOW CONFIGS滑塊時,能夠在Backyards UI的右側看到它們。

Circuit Breaking view

監控熔斷器

根據剛纔的設置,當兩個鏈接同時產生流量時,熔斷器將發出跳閘請求。在Backyards UI中,你將看到圖形的邊緣出現了紅色。若是單擊該服務,你將瞭解有關錯誤的更多信息,並將看到兩個專門用來顯示熔斷器跳閘的實時Grafana儀表板。

第一個儀表板展現了熔斷器觸發的總請求的百分比。當沒有熔斷器錯誤,而你的服務工做正常,這張圖將顯示0%。不然,你將可以當即看到有多少請求被熔斷器觸發。

第二個儀表板提供了由源熔斷器引發的跳閘故障。若是沒有發生跳閘,則此圖中不會出現尖峯。不然,你將看到哪一個服務致使了跳閘,什麼時候跳閘,以及跳閘次數。能夠經過此圖來追蹤惡意的客戶端。

Circuit Breaking trip

這些是實時的Grafana儀表盤,用於顯示熔斷相關的信息。在默認狀況下Backyards集成了Grafana和Prometheus——還有更多的儀表板能夠幫助你深刻查看服務的指標。

移除熔斷器配置

能夠經過 Remove 按鈕很容易的移除熔斷配置。

Backyards UI 的熔斷實戰

這個視頻總結了全部這些UI操做(譯者注:視頻來自YouTube)

使用BACKYARDS-CLI建立熔斷

從經驗來看,能夠從UI界面作的事必定也能夠經過 Backyards CLI 命令行工具完成。

配置熔斷

讓咱們再作一次建立熔斷的測試,此次經過CLI命令行。

能夠以交互模式進行:

$ backyards r cb set backyards-demo/notifications
? Maximum number of HTTP1/TCP connections 1
? TCP connection timeout 3s
? Maximum number of pending HTTP requests 1
? Maximum number of requests 1024
? Maximum number of requests per connection 1
? Maximum number of retries 1024
? Number of errors before a host is ejected 1
? Time interval between ejection sweep analysis 1s
? Minimum ejection duration 3m
? Maximum ejection percentage 100
INFO[0043] circuit breaker rules successfully applied to 'backyards-demo/notifications'
Connections  Timeout  Pending Requests  Requests  RPC  Retries  Errors  Interval  Ejection time  percentage
1            3s       1                 1024      1    1024     1       1s        3m             100複製代碼

或者用非交互模式,指定要設置的值:

$ backyards r cb set backyards-demo/notifications --non-interactive --max-connections=1 --max-pending-requests=1 --max-requests-per-connection=1 --consecutiveErrors=1 --interval=1s --baseEjectionTime=3m --maxEjectionPercent=100
Connections  Timeout  Pending Requests  Requests  RPC  Retries  Errors  Interval  Ejection time  percentage
1            3s       1                 1024      1    1024     5       1s        3m             100複製代碼

命令執行後,熔斷配置會馬上獲取到並顯示出來。

查看熔斷設置

你能夠用下面的命令經過namespace來列出熔斷的設置:

$ backyards r cb get backyards-demo/notifications
  Connections  Timeout  Pending Requests  Requests  RPC  Retries  Errors  Interval  Ejection time  percentage
  1            3s       1                 1024      1    1024     5       1s        3m             100複製代碼

默認狀況結果以表格的方式顯示,也支持JSON或者YMAL格式:

$ backyards r cb get backyards-demo/notifications -o json
  {
    "maxConnections": 1,
    "connectTimeout": "3s",
    "http1MaxPendingRequests": 1,
    "http2MaxRequests": 1024,
    "maxRequestsPerConnection": 1,
    "maxRetries": 1024,
    "consecutiveErrors": 5,
    "interval": "1s",
    "baseEjectionTime": "3m",
    "maxEjectionPercent": 100
  }

$ backyards r cb get backyards-demo/notifications -o yaml
  maxConnections: 1
  connectTimeout: 3s
  http1MaxPendingRequests: 1
  http2MaxRequests: 1024
  maxRequestsPerConnection: 1
  maxRetries: 1024
  consecutiveErrors: 5
  interval: 1s
  baseEjectionTime: 3m
  maxEjectionPercent: 100複製代碼

監控熔斷

要從CLI中查看和前面Grafana UI界面相似的儀表板,能夠經過從多個鏈接調用服務來觸發跳閘,執行命令:

$ backyards r cb graph backyards-demo/notifications複製代碼

能夠看到相似下面的結果:

Circuit Breaking trip cli

移除熔斷配置

移除熔斷執行下面的命令:

$ backyards r cb delete backyards-demo/notifications
INFO[0000] current settings
Connections  Timeout  Pending Requests  Requests  RPC  Retries  Errors  Interval  Ejection time  percentage
1            3s       1                 1024      1    1024     5       1s        3m             100
? Do you want to DELETE the circuit breaker rules? Yes
INFO[0008] circuit breaker rules set to backyards-demo/notifications successfully deleted複製代碼

使用下面的命令驗證是否成功:

$ backyards r cb get backyards-demo/notifications
  INFO[0001] no circuit breaker rules set for backyards-demo/notifications複製代碼

使用BACKYARDS GRAPHQL API建立熔斷

Backyards由多個組件組成,好比Istio、Banzai Cloud的Istio operator,多集羣Canary release operator,以及多個後端基礎設施。全部的這些都在Backyards’ GraphQL API的後面。

Backyards UI和CLI都使用Backyards的GraphQL API,它將在9月底與GA版本一塊兒發佈。用戶將很快可以使用咱們的工具來管理Istio和構建他們本身的客戶端。

清理

從你的集羣移除demo應用、Backyards和Istio,執行下面的命令,它將按順序卸載這些組件:

$ backyards uninstall -a複製代碼

總結

使用Backyards,你能夠經過UI或CLI命令行工具輕鬆的配置熔斷器。而後經過嵌入的Grafana儀表板從Backyards UI實時的監控熔斷器,來查看跳閘率和按源計算的跳閘次數。

下一次咱們將介紹錯誤注入,請繼續關注!

關於 ServiceMesher 社區

ServiceMesher 社區是由一羣擁有相同價值觀和理念的志願者們共同發起,於 2018 年 4 月正式成立。

社區關注領域有:容器、微服務、Service Mesh、Serverless,擁抱開源和雲原生,致力於推進 Service Mesh 在中國的蓬勃發展。

社區官網:https://www.servicemesher.com

ServiceMesher 社區

相關文章
相關標籤/搜索