Istio熔断器功能解析
前言
Istio因靈活的可觀察性和安全的服務(wù)間通信受到了贊許。然而,其他更重要的功能才真正使得Istio成為了服務(wù)網(wǎng)格里的瑞士軍刀,當(dāng)遇到運(yùn)行時(shí)長(zhǎng)、延遲和錯(cuò)誤率等SLO問(wèn)題時(shí),服務(wù)間的流量管理能力是至關(guān)重要的。
在今年早些時(shí)候發(fā)布?Istio operator?時(shí),我們的目標(biāo)(除了管理Istio的安裝和升級(jí))是為這些出色的流量路由特性提供支持,同時(shí)使所有的功能都更加易用。最后,我們創(chuàng)建了一個(gè)簡(jiǎn)單且自動(dòng)化的服務(wù)網(wǎng)格Backyards,它在Istio operator之上提供了管理UI、CLI?和GraphQL API的能力。Backyards集成到了Banzai Cloud的容器管理平臺(tái)?Pipeline中,也可以作為一個(gè)單一的產(chǎn)品獨(dú)立工作。當(dāng)然,將Backyards與Pipeline一起使用會(huì)為用戶(hù)提供特別的好處(比如在多云和混合云環(huán)境中管理應(yīng)用程序),Backyards也可以被用于任何Kubernetes的安裝環(huán)境。
我們已經(jīng)發(fā)布了一些Backyards相關(guān)特性的文章比如:
- 使用Backyards自動(dòng)金絲雀部署
- 流量切換
熔斷:失敗是一個(gè)選項(xiàng)
在微服務(wù)架構(gòu)中,服務(wù)可能會(huì)用不同的語(yǔ)言實(shí)現(xiàn)并部署在多個(gè)節(jié)點(diǎn)或集群上,具有不同的響應(yīng)時(shí)間或故障率。如果服務(wù)成功(并且及時(shí)地)響應(yīng)了請(qǐng)求,那么它的性能就算是令人滿(mǎn)意的。但現(xiàn)實(shí)情況并非如此,下游客戶(hù)端應(yīng)該在上游服務(wù)過(guò)于緩慢時(shí)受到保護(hù)。反之,上游服務(wù)也必須被保護(hù),以免被積壓的請(qǐng)求拖垮。在多客戶(hù)端下情況會(huì)更加復(fù)雜,并可能導(dǎo)致整個(gè)基礎(chǔ)設(shè)施出現(xiàn)一系列的連鎖故障。這一問(wèn)題的解決方案是采用經(jīng)過(guò)時(shí)間檢驗(yàn)的熔斷器模式。
一個(gè)熔斷器可以有三種狀態(tài):關(guān)閉、打開(kāi)和半開(kāi),默認(rèn)情況下處于關(guān)閉狀態(tài)。在關(guān)閉狀態(tài)下,無(wú)論請(qǐng)求成功或失敗,到達(dá)預(yù)先設(shè)定的故障數(shù)量閾值前,都不會(huì)觸發(fā)熔斷。而當(dāng)達(dá)到閾值時(shí),熔斷器就會(huì)打開(kāi)。當(dāng)調(diào)用處于打開(kāi)狀態(tài)的服務(wù)時(shí),熔斷器將斷開(kāi)請(qǐng)求,這意味著它會(huì)直接返回一個(gè)錯(cuò)誤,而不去執(zhí)行調(diào)用。通過(guò)在客戶(hù)端斷開(kāi)下游請(qǐng)求的方式,可以在生產(chǎn)環(huán)境中防止級(jí)聯(lián)故障的發(fā)生。在經(jīng)過(guò)事先配置的超時(shí)時(shí)長(zhǎng)后,熔斷器進(jìn)入半開(kāi)狀態(tài),這種狀態(tài)下故障服務(wù)有時(shí)間從其中斷的行為中恢復(fù)。如果請(qǐng)求在這種狀態(tài)下繼續(xù)失敗,則熔斷器將再次打開(kāi)并繼續(xù)阻斷請(qǐng)求。否則熔斷器將關(guān)閉,服務(wù)將被允許再次處理請(qǐng)求。
Istio中的熔斷
Istio的?熔斷?可以在?流量策略?中配置。Istio的?自定義資源Destination Rule里,TrafficPolicy字段下有兩個(gè)和熔斷相關(guān)的配置:?ConnectionPoolSettings?和?OutlierDetection。
ConnectionPoolSettings可以為服務(wù)配置連接的數(shù)量。OutlierDetection用來(lái)控制從負(fù)載均衡池中剔除不健康的實(shí)例。
例如,ConnectionPoolSettings控制請(qǐng)求的最大數(shù)量,掛起請(qǐng)求,重試或者超時(shí);OutlierDetection?設(shè)置服務(wù)被從連接池剔除時(shí)發(fā)生錯(cuò)誤的請(qǐng)求數(shù),可以設(shè)置最小逐出時(shí)間和最大逐出百分比。有關(guān)完整的字段列表,請(qǐng)參考文檔.
Istio在底層使用了Envoy的熔斷特性。
讓我們來(lái)看看Destination Rule中有關(guān)熔斷的配置:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata:name: notifications spec:host: notificationstrafficPolicy:connectionPool:tcp:maxConnections: 1http:http1MaxPendingRequests: 1maxRequestsPerConnection: 1outlierDetection:consecutiveErrors: 1interval: 1sbaseEjectionTime: 3mmaxEjectionPercent: 100使用ConnectionPoolSettings字段中的這些設(shè)置,在給定的時(shí)間內(nèi)只能和notifications?服務(wù)建立一個(gè)連接:每個(gè)連接最多只能有一個(gè)掛起的請(qǐng)求。如果達(dá)到閾值,熔斷器將開(kāi)始阻斷請(qǐng)求。
OutlierDetection部分的設(shè)置用來(lái)檢查每秒調(diào)用服務(wù)是否有錯(cuò)誤發(fā)生。如果有,則將服務(wù)從負(fù)載均衡池中逐出至少三分鐘(100%最大彈出百分比表示,如果需要,所有的服務(wù)實(shí)例都可以同時(shí)被逐出)。
在手動(dòng)創(chuàng)建Destination Rule資源時(shí)有一件事需要特別注意,那就是是否為該服務(wù)啟用了mTLS。如果是的話(huà),還需要在Destination Rule中設(shè)置如下字段,否則當(dāng)調(diào)用movies服務(wù)時(shí),調(diào)用方可能會(huì)收到503錯(cuò)誤:
trafficPolicy:tls:mode: ISTIO_MUTUAL還可以為特定namespace?或特定服務(wù)啟用全局的mTLS。你應(yīng)該了解這些設(shè)置以便確定是否把trafficPolicy.tls.mode設(shè)置為?ISTIO_MUTUAL。更重要的是,當(dāng)你試圖配置一個(gè)完全不同的功能(例如熔斷)時(shí),很容易忘記設(shè)置此字段。
提示:在創(chuàng)建Destination Rule前總是考慮mTLS!
為了觸發(fā)熔斷,讓我們同時(shí)從兩個(gè)連接來(lái)調(diào)用?notifications服務(wù)。maxConnections字段被設(shè)置為1。這時(shí)應(yīng)該會(huì)看到503與200的響應(yīng)同時(shí)到達(dá)。
當(dāng)一個(gè)服務(wù)從客戶(hù)端接收到的負(fù)載大于它所能處理的負(fù)載(如熔斷器中配置的那樣),它會(huì)在調(diào)用之前返回503錯(cuò)誤。這是防止錯(cuò)誤級(jí)聯(lián)的一種方法。
監(jiān)控
在生產(chǎn)環(huán)境中必須要監(jiān)控你的服務(wù),以便得到通知并能夠在系統(tǒng)發(fā)生錯(cuò)誤時(shí)進(jìn)行檢查。因此,如果你已經(jīng)為你的服務(wù)配置了一個(gè)熔斷器,你就會(huì)想知道它什么時(shí)候跳閘;熔斷器攔截了百分之多少的請(qǐng)求;何時(shí)觸發(fā),來(lái)自哪個(gè)下游客戶(hù)端?如果能夠回答這些問(wèn)題,你就可以確定熔斷器是否工作正常,并根據(jù)需要微調(diào)配置,或者優(yōu)化服務(wù)來(lái)處理額外的并發(fā)請(qǐng)求。
提示:如果你繼續(xù)閱讀,可以在Backyards UI中看到和配置所有的這些設(shè)置。
讓我們看看怎樣在Istio里確定熔斷器跳閘:
熔斷器跳閘時(shí)的響應(yīng)碼是503,因此你無(wú)法僅根據(jù)該響應(yīng)與其他的503錯(cuò)誤區(qū)分開(kāi)來(lái)。在Envoy中,有一個(gè)計(jì)數(shù)器叫upstream_rq_pending_overflow,它記錄了熔斷且失敗的請(qǐng)求總數(shù)。如果為你的服務(wù)深入研究Envoy的統(tǒng)計(jì)數(shù)據(jù)就可以獲得這些信息,但這并不容易。
除了響應(yīng)代碼,Envoy還返回響應(yīng)標(biāo)志?,并且存在一個(gè)專(zhuān)用響應(yīng)標(biāo)志來(lái)表示熔斷器跳閘:UO。如果這個(gè)標(biāo)志只能通過(guò)Envoy的日志獲得,這將不會(huì)特別有用。幸運(yùn)的是,它在Istio中實(shí)現(xiàn)了,因此響應(yīng)標(biāo)志在Istio指標(biāo)中是可用的并且能被Prometheus獲取到。
熔斷器的跳閘可以像這樣查詢(xún)到:
sum(istio_requests_total{response_code="503", response_flags="UO"}) by (source_workload, destination_workload, response_code)Backyards的熔斷更簡(jiǎn)單
使用Backyards時(shí),你不需要手動(dòng)編輯Destination Rules來(lái)設(shè)置熔斷。可以通過(guò)一個(gè)方便的UI界面或者(如果你愿意的話(huà))是Backyards CLI?命令行工具來(lái)達(dá)到相同的結(jié)果。
不必?fù)?dān)心由于忘記把trafficPolicy.tls.mode?設(shè)置為?ISTIO_MUTUAL而配錯(cuò)了Destination Rules。Backyards會(huì)為你解決這個(gè)問(wèn)題;它會(huì)找到啟用了mTLS的服務(wù)并相應(yīng)地設(shè)置上述字段。
上面只是Backyards驗(yàn)證特性的一個(gè)例子,這能避免你設(shè)置錯(cuò)誤。后面還有更多的特性。
在此之上,你可以看到服務(wù)和請(qǐng)求的可視化界面和活動(dòng)儀表板,因此可以輕松地確定有多少請(qǐng)求被熔斷器觸發(fā),以及它來(lái)自哪個(gè)調(diào)用者和何時(shí)觸發(fā)。
熔斷實(shí)戰(zhàn)
創(chuàng)建一個(gè)集群
首先,我們需要一個(gè)Kubernetes集群。
我通過(guò)Pipeline platform的免費(fèi)開(kāi)發(fā)版本在GKE上創(chuàng)建了一個(gè)Kubernetes集群。如果你也想這樣做,可以在我們支持的五個(gè)云提供商或使用Pipeline在本地創(chuàng)建集群。否則,你需要提供自己的Kubernetes集群。
安裝BACKYARDS
在一個(gè)新集群安裝Istio,Backyards和demo應(yīng)用的最簡(jiǎn)單的辦法是使用Backyards CLI。
你只需要執(zhí)行下面的命令(集群必須設(shè)置了KUBECONFIG):
$ backyards install -a --run-demo該命令首先使用我們開(kāi)源的Istio operator安裝Istio,然后安裝Backyards和demo應(yīng)用程序。安裝完成后,Backyards UI將自動(dòng)打開(kāi)并向demo應(yīng)用發(fā)送一些流量。通過(guò)這個(gè)簡(jiǎn)單的命令,你可以看到Backyards在幾分鐘內(nèi)啟動(dòng)了一個(gè)全新的Istio集群!試試吧!
你也可以按順序執(zhí)行所有這些步驟。Backyards需要一個(gè)Istio集群——如果沒(méi)有,可以通過(guò)$ backyards istio install安裝。一旦安裝了Istio,就可以使用$ backyards install安裝Backyards。最后,使用$ backyards demoapp install部署demo應(yīng)用程序。
提示:Backyards是Pipeline平臺(tái)的核心組件——可以嘗試開(kāi)發(fā)者版本(Service Mesh 標(biāo)簽頁(yè))。
使用BACKYARDS UI創(chuàng)建熔斷
配置熔斷器
你不需要手動(dòng)創(chuàng)建或編輯Destination Rule,可以很容易的在UI界面中改變?nèi)蹟嗟呐渲?。讓我們先?chuàng)建一個(gè)demo。
正如你將看到的,Backyards(與Kiali相比)不僅是為可觀察性構(gòu)建的web UI,而且是具有豐富功能的服務(wù)網(wǎng)格管理工具,支持單集群和多集群,并且具有強(qiáng)大的CLI和GraphQL API。
查看熔斷器設(shè)置
你不需要通過(guò)Destination Rule(例如通過(guò)kubectl)來(lái)查看熔斷器的配置,當(dāng)你點(diǎn)擊notification?服務(wù)圖標(biāo)并切換SHOW CONFIGS滑塊時(shí),可以在Backyards UI的右側(cè)看到它們。
監(jiān)控熔斷器
根據(jù)剛才的設(shè)置,當(dāng)兩個(gè)連接同時(shí)產(chǎn)生流量時(shí),熔斷器將發(fā)出跳閘請(qǐng)求。在Backyards UI中,你將看到圖形的邊緣出現(xiàn)了紅色。如果單擊該服務(wù),你將了解有關(guān)錯(cuò)誤的更多信息,并將看到兩個(gè)專(zhuān)門(mén)用來(lái)顯示熔斷器跳閘的實(shí)時(shí)Grafana儀表板。
第一個(gè)儀表板展示了熔斷器觸發(fā)的總請(qǐng)求的百分比。當(dāng)沒(méi)有熔斷器錯(cuò)誤,而你的服務(wù)工作正常,這張圖將顯示0%。否則,你將能夠立即看到有多少請(qǐng)求被熔斷器觸發(fā)。
第二個(gè)儀表板提供了由源熔斷器引起的跳閘故障。如果沒(méi)有發(fā)生跳閘,則此圖中不會(huì)出現(xiàn)尖峰。否則,你將看到哪個(gè)服務(wù)導(dǎo)致了跳閘,何時(shí)跳閘,以及跳閘次數(shù)??梢酝ㄟ^(guò)此圖來(lái)追蹤惡意的客戶(hù)端。
這些是實(shí)時(shí)的Grafana儀表盤(pán),用于顯示熔斷相關(guān)的信息。在默認(rèn)情況下Backyards集成了Grafana和Prometheus——還有更多的儀表板可以幫助你深入查看服務(wù)的指標(biāo)。
移除熔斷器配置
可以通過(guò)?Remove?按鈕很容易的移除熔斷配置。
Backyards UI 的熔斷實(shí)戰(zhàn)
這個(gè)視頻總結(jié)了所有這些UI操作(譯者注:視頻來(lái)自YouTube)
使用BACKYARDS-CLI創(chuàng)建熔斷
從經(jīng)驗(yàn)來(lái)看,可以從UI界面做的事一定也可以通過(guò)?Backyards CLI?命令行工具完成。
配置熔斷
讓我們?cè)僮鲆淮蝿?chuàng)建熔斷的測(cè)試,這次通過(guò)CLI命令行。
可以以交互模式進(jìn)行:
$ 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或者用非交互模式,指定要設(shè)置的值:
$ 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命令執(zhí)行后,熔斷配置會(huì)立刻獲取到并顯示出來(lái)。
查看熔斷設(shè)置
你可以用下面的命令通過(guò)namespace來(lái)列出熔斷的設(shè)置:
$ backyards r cb get backyards-demo/notificationsConnections Timeout Pending Requests Requests RPC Retries Errors Interval Ejection time percentage1 3s 1 1024 1 1024 5 1s 3m 100默認(rèn)情況結(jié)果以表格的方式顯示,也支持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 yamlmaxConnections: 1connectTimeout: 3shttp1MaxPendingRequests: 1http2MaxRequests: 1024maxRequestsPerConnection: 1maxRetries: 1024consecutiveErrors: 5interval: 1sbaseEjectionTime: 3mmaxEjectionPercent: 100監(jiān)控熔斷
要從CLI中查看和前面Grafana UI界面類(lèi)似的儀表板,可以通過(guò)從多個(gè)連接調(diào)用服務(wù)來(lái)觸發(fā)跳閘,執(zhí)行命令:
$ backyards r cb graph backyards-demo/notifications可以看到類(lèi)似下面的結(jié)果:
移除熔斷配置
移除熔斷執(zhí)行下面的命令:
$ 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使用下面的命令驗(yàn)證是否成功:
$ backyards r cb get backyards-demo/notificationsINFO[0001] no circuit breaker rules set for backyards-demo/notifications使用BACKYARDS GRAPHQL API創(chuàng)建熔斷
Backyards由多個(gè)組件組成,比如Istio、Banzai Cloud的Istio operator,多集群Canary release operator,以及多個(gè)后端基礎(chǔ)設(shè)施。所有的這些都在Backyards’ GraphQL API的后面。
Backyards UI和CLI都使用Backyards的GraphQL API,它將在9月底與GA版本一起發(fā)布。用戶(hù)將很快能夠使用我們的工具來(lái)管理Istio和構(gòu)建他們自己的客戶(hù)端。
清理
從你的集群移除demo應(yīng)用、Backyards和Istio,執(zhí)行下面的命令,它將按順序卸載這些組件:
$ backyards uninstall -a總結(jié)
使用Backyards,你可以通過(guò)UI或CLI命令行工具輕松的配置熔斷器。然后通過(guò)嵌入的Grafana儀表板從Backyards UI實(shí)時(shí)的監(jiān)控熔斷器,來(lái)查看跳閘率和按源計(jì)算的跳閘次數(shù)。
總結(jié)
以上是生活随笔為你收集整理的Istio熔断器功能解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 5G比4G快
- 下一篇: 【NEO官方】一键新机 改串 安装教程