作者:justmine 頭條号:大資料與雲原生 微信公衆号:大資料與雲原生 創作不易,在滿足創作共用版權協定的基礎上可以轉載,但請以超連結形式注明出處。 為了友善閱讀,微信公衆号已按分類排版,後續的文章将在移動端首發,想學習雲原生相關知識,請關注我。
雲原生 - 體驗Istio的完美入門之旅(一)
雲原生 - Why is istio(二)
雲原生 - Istio可觀察性之分布式跟蹤(三)
[請持續關注...]
如前所述,業務微服務化後,每個單獨的微服務可能會有很多副本,多個版本,這麼多微服務之間的互相調用、管理和治理非常複雜,Istio統一封裝了這塊内容在代理層,最終形成一個分布式的微服務代理叢集(服務網格)。管理者通過統一的控制平面來配置整個叢集的應用流量、安全規則等,代理會自動從控制中心擷取動态配置,根據使用者的期望來改變行為。
話外音:借着微服務和容器化的東風,傳統的代理搖身一變,成了如今炙手可熱的服務網格。

Istio就是上面service mesh架構的一種實作,通過代理(預設是envoy)全面接管服務間通信,完全支援主流的通信協定HTTP/1.1,HTTP/2,gRPC ,TCP等;同時進一步細分控制中心,包括Pilot、Mixer、Citadel等。
話外音:後面系列會詳細介紹控制中心的各個元件,請持續關注。
整體功能描述如下:
連接配接(Connect)
控制中心從叢集中擷取所有微服務的資訊,并分發給代理,這樣代理就能根據使用者的期望來完成服務之間的通信(自動地服務發現、負載均衡、流量控制等)。
保護(Secure)
所有的流量都是通過代理,當代理接收到未加密流量時,可以自動做一次封裝,把它更新成安全的加密流量。
控制(Control)
使用者可以配置各種規則(比如 RBAC 授權、白名單、rate limit 、quota等),當代理發現服務之間的通路不符合這些規則,就直接拒絕掉。
觀察(Observe)
所有的流量都經過代理,是以代理對整個叢集的通路情況知道得一清二楚,它把這些資料上報到控制中心,那麼管理者就能觀察到整個叢集的流量情況。
作為服務網格的一個完整解決方案,為了向運維人員提供豐富而深入的控制,同時又不給服務開發人員帶來負擔,Istio被設計為高度子產品化和可擴充的平台,涉及到衆多的元件,它們分工協作,共同組成了完整的控制平面。為了更好地學習如何運用Istio的連接配接、安全、控制、可觀察性全面地治理分布式微服務應用,先從戰略上鳥瞰Istio,進一步從戰術上學習Istio将更加容易,故作者決定從可觀察性開始Istio的布道,先體驗,再實踐,最後落地,一步步愛上Istio,愛上雲原生,充分利用雲資源的優勢,解放應用開發工程師的雙手,使他們僅僅關注業務實作,讓專業的人做專業的事,為企業創造更大的價值。
當流量流入服務網格中的微服務時,Istio可以為每個請求生成完整的記錄,包括源和目标的中繼資料等。使運維人員能夠将服務行為的審查控制到單個微服務的級别。
Istio基于監控的4 個黃金信号(延遲、流量、錯誤、飽和度)來生成一系列的服務名額,同時還提供了一組預設的服務網格監控大盤。
話外音:Istio還為服務網格控制平面提供了更為詳細的監控名額。
Istio根據采樣率為每個請求生成完整的分布式追蹤軌迹,以便運維人員可以了解服務網格内微服務的依賴關系和調用流程。
可以看出,Istio的可觀察性,緻力于解決兩方面的問題:
1、症狀:什麼病?
是Istio的問題?
哪個Istio元件的問題?
[...]
2、原因:為什麼得這種病?
怎樣跟蹤、分析、定位?
是異常,還是偶然事件?
知曉了症狀(什麼)和原因(為什麼),治病應該就信手拈來了吧,如果還不知如何治病,那就去格物緻知吧。
話外音:不僅如此,Istio還支援按需降級或關閉某些功能的能力,請持續關注。
在軟體形态上,Service Mesh将業務系統中的非業務功能剝離到獨立的中間件系統中。同時,為了解耦運維,以Sidecar的方式将中間系統注入到業務容器内,在落地過程中難免會面臨穩定性、運維模式變化等諸多的問題與挑戰,如何確定網格的生産穩定和可靠呢?
從設計之初,Istio都緻力于建設一個高可用的基礎架構,以防止服務品質降低而影響業務本身。為了跟蹤分布式系統中的每個信号,Istio基于Google網站可靠性工程師小組(SRE)定義的四個監控關鍵名額,全面而詳細地監控業務系統和自身。
黃金四信号:
延遲(Latency)
處理請求的時間,即發送請求和接收響應所需的時間,比如:請求成功與請求失敗的延遲。
在微服務中提倡“快速失敗”,特别要注意那些延遲較大的錯誤請求。這些緩慢的錯誤請求會明顯影響系統的性能,是以追蹤這些錯誤請求的延遲是非常重要的。
流量(Traffic)
也稱吞吐量,用于衡量系統的容量需求,即收到多少請求,比如:請求率(HTTP請求數/秒)。
對于分布式系統,它可以幫助您提前規劃容量以滿足即将到來的需求等。
錯誤(Errors)
衡量系統發生的錯誤情況,比如:請求錯誤率。
飽和度(Saturation)
衡量網絡和伺服器等資源的負載,主要強調最能影響服務狀态的受限制資源。
每個資源都有一個限制,之後性能将降低或變得不可用。了解分布式系統的哪些部分可能首先變得飽和,以便在性能下降之前調整容量。
黃金四信号幾乎深度覆寫了所有想知道到底怎麼回事的相關資訊,既是監控系統發現問題的關鍵,也是保障高可用基礎性架構的關鍵。
話外音:分布式系統不同于單體應用,監控信号是異常檢測的關鍵,是預警的重要積木。
為了監控應用服務行為,Istio為服務網格中所有出入的服務流量都生成了名額,例如總請求數、錯誤率和請求響應時間等。
為了監控服務網格本身,Istio元件可以導出自身内部行為的詳細統計名額,以提供對服務網格控制平面功能和健康情況的洞察能力。
話外音:Istio名額收集可以由運維人員配置來驅動,即運維人員決定如何以及何時收集名額,以及收集的詳細程度,靈活地調整名額收集政策來滿足個性化的監控需求。
Istio名額收集從sidecar代理(Envoy)開始,它為通過代理的所有流量(入站和出站)生成一組豐富的名額,同時允許運維人員為每個工作負載執行個體(微服務)配置如何生成和收集哪些名額。
Envoy統計資訊收集詳細說明:https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/observability/statistics.html?highlight=statistics
除了代理級别名額之外,Istio還提供了一組用于監控服務通信的名額。這些名額涵蓋了四個基本的服務監控需求:延遲、流量、錯誤、飽和度,同時Istio也提供了一組預設的儀表盤,用于監控基于這些名額的服務行為。
預設的Istio名額由Istio提供的配置集定義并預設導出到Prometheus。運維人員可以自由地修改這些名額的形态和内容,更改它們的收集機制,以滿足各自的監控需求。
備注:運維人員也可以選擇關閉服務級别名額的生成和收集。
每一個Istio的元件(Pilot、Galley、Mixer等)都提供了對自身監控名額的集合。這些名額容許監控Istio自己的行為。
話外音:測試環境使用NodePort聯網,僅供參考。
浏覽器通路:http://[主機IP]:3000/dashboard/db/istio-mesh-dashboard。
為了更好的閱讀體驗,上面僅截取了部分監控,可以看出監控的四個黃金信号吧,同時,為了使名額統計更精确,有的名額還通過P50、P90、P99次元分别展示,消除長尾噪音。除了業務監控,Istio也提供了自身平台的監控大盤,如下:
可以看出Istio的預設監控大盤非常全面,該監控的都監控起來了,到目前為止,大家已經從整體上了解和體驗Istio的監控體系。
為了支援個性化監控需求,Istio支援自定義名額來擴充監控體系,下面将添加一個新名額(将每個請求計數兩次),并發送到Prometheus。
備注:Istio也支援自定義Mixer Adapter來支援其他監控後端。
建立名為<code>doublerequestcount</code>的新名額,告訴<code>Mixer</code>如何根據Envoy報告的屬性為請求建立名額次元和生成值,即對于<code>doublerequestcount</code>的每個<code>instance</code>,訓示Mixer為它提供值<code>2</code>。
備注:Istio将為每個請求生成一個Instance。
建立能夠處理生成的instances的handlers,即告訴Prometheus擴充卡如何将收到的名額轉換為Prometheus格式的名額。
在名額名稱之前,Prometheus擴充卡會添加了<code>istio_</code>字首,是以該名額在Prometheus中最終名稱為 <code>istio_double_request_count</code>。
根據一組rules向handlers配置設定instances,如下将網格中的所有請求生成的名額都發送到<code>doublehandler</code>處理器,也可以使用<code>match</code>條件,篩選名額。
到目前為止,就可以在監控大盤(grafana)中使用該名額了。
本篇先回顧了Istio曆史系列文章,然後大緻概述了Istio的整體功能,以及可觀察性,最後從why、what、how的角度詳細介紹了Istio的監控體系,并通過自定義名額示範了如何支援個性化監控需求。除了分布式跟蹤、監控,Istio的可觀察性還包括日志,敬請期待,請持續關注。
如果有什麼疑問和見解,歡迎評論區交流。
如果覺得本篇有幫助的話,歡迎推薦和轉發。
如果覺得本篇非常不錯的話,可以請作者吃個雞腿,創作的源泉将如滔滔江水連綿不斷,嘿嘿。
https://istio.io/docs/concepts/observability
https://istio.io/docs/reference/config/policy-and-telemetry/metrics
https://istio.io/docs/ops/common-problems/observability-issues
https://raw.githubusercontent.com/istio/istio/master/install/kubernetes/helm/istio/charts/mixer/templates/config.yaml
https://istio.io/docs/tasks/observability/metrics/using-istio-dashboard
https://istio.io/docs/tasks/observability/metrics/collecting-metrics
https://istio.io/docs/tasks/observability/metrics/tcp-metrics
https://istio.io/docs/tasks/observability/metrics/querying-metrics
https://istio.io/docs/reference/config/policy-and-telemetry/adapters/prometheus
https://mp.weixin.qq.com/s/KMnIzA5i99ZSkAtIujVqJA
做一個有底蘊的軟體工作者