1. 程式人生 > >雲原生 - Istio可觀察性之監控(四)

雲原生 - Istio可觀察性之監控(四)

作者: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的可觀察性

1. 日誌

當流量流入服務網格中的微服務時,Istio可以為每個請求生成完整的記錄,包括源和目標的元資料等。使運維人員能夠將服務行為的審查控制到單個微服務的級別。

2. 監控

Istio基於監控的4 個黃金訊號(延遲、流量、錯誤、飽和度)來生成一系列的服務指標,同時還提供了一組預設的服務網格監控大盤。

話外音:Istio還為服務網格控制平面提供了更為詳細的監控指標。

3. 分散式跟蹤

Istio根據取樣率為每個請求生成完整的分散式追蹤軌跡,以便運維人員可以理解服務網格內微服務的依賴關係和呼叫流程。

可以看出,Istio的可觀察性,致力於解決兩方面的問題:

1、症狀:什麼病?

  • 是Istio的問題?
  • 哪個Istio元件的問題?
  • [...]

2、原因:為什麼得這種病?

  • 怎樣跟蹤、分析、定位?
  • 是異常,還是偶然事件?
  • [...]

知曉了症狀(什麼)和原因(為什麼),治病應該就信手拈來了吧,如果還不知如何治病,那就去格物致知吧。

話外音:不僅如此,Istio還支援按需降級或關閉某些功能的能力,請持續關注。

四、Why - 為什麼需要監控?

在軟體形態上,Service Mesh將業務系統中的非業務功能剝離到獨立的中介軟體系統中。同時,為了解耦運維,以Sidecar的方式將中間系統注入到業務容器內,在落地過程中難免會面臨穩定性、運維模式變化等諸多的問題與挑戰,如何確保網格的生產穩定和可靠呢?

從設計之初,Istio都致力於建設一個高可用的基礎架構,以防止服務質量降低而影響業務本身。為了跟蹤分散式系統中的每個訊號,Istio基於Google網站可靠性工程師小組(SRE)定義的四個監控關鍵指標,全面而詳細地監控業務系統和自身。

黃金四訊號:

  • 延遲(Latency)

    處理請求的時間,即傳送請求和接收響應所需的時間,比如:請求成功與請求失敗的延遲。

    在微服務中提倡“快速失敗”,特別要注意那些延遲較大的錯誤請求。這些緩慢的錯誤請求會明顯影響系統的效能,因此追蹤這些錯誤請求的延遲是非常重要的。

  • 流量(Traffic)

    也稱吞吐量,用於衡量系統的容量需求,即收到多少請求,比如:請求率(HTTP請求數/秒)。

    對於分散式系統,它可以幫助您提前規劃容量以滿足即將到來的需求等。

  • 錯誤(Errors)

    衡量系統發生的錯誤情況,比如:請求錯誤率。

  • 飽和度(Saturation)

    衡量網路和伺服器等資源的負載,主要強調最能影響服務狀態的受限制資源。

    每個資源都有一個限制,之後效能將降低或變得不可用。瞭解分散式系統的哪些部分可能首先變得飽和,以便在效能下降之前調整容量。

黃金四訊號幾乎深度覆蓋了所有想知道到底怎麼回事的相關資訊,既是監控系統發現問題的關鍵,也是保障高可用基礎性框架的關鍵。

話外音:分散式系統不同於單體應用,監控訊號是異常檢測的關鍵,是預警的重要積木。

五、What - Istio的監控?

為了監控應用服務行為,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自己的行為。

六、How - Istio如何配置監控?

1、部署監控大盤

root@just:~# istioctl manifest apply --set values.grafana.enabled=true
[...]
✔ Finished applying manifest for component Grafana.
[...]
root@just:~# kubectl -n istio-system get svc grafana -o yaml
apiVersion: v1
kind: Service
[...]
  name: grafana
  namespace: istio-system
spec:
  [...]
  type: NodePort
  ports:
  [...]
    nodePort: 3000
  [...]

話外音:測試環境使用NodePort聯網,僅供參考。

瀏覽器訪問:http://[主機IP]:3000/dashboard/db/istio-mesh-dashboard。

微服務應用BookInfo監控大盤

為了更好的閱讀體驗,上面僅截取了部分監控,可以看出監控的四個黃金訊號吧,同時,為了使指標統計更精確,有的指標還通過P50、P90、P99維度分別展示,避免長尾誤導。除了業務監控,Istio也提供了自身平臺的監控大盤,如下:

可以看出Istio的預設監控大盤非常全面,該監控的都監控起來了,到目前為止,大家已經從整體上了解和體驗Istio的監控體系。

2、擴充套件新指標

為了支援個性化監控需求,Istio支援自定義指標來擴充套件監控體系,下面將新增一個新指標(將每個請求計數兩次),併發送到Prometheus。

備註:Istio也支援自定義Mixer Adapter來支援其他監控後端。

2.1 定義指標

建立名為doublerequestcount的新指標,告訴Mixer如何根據Envoy報告的屬性為請求建立指標維度和生成值,即對於doublerequestcount的每個instance,指示Mixer為它提供值2

備註:Istio將為每個請求生成一個Instance。

# Configuration for metric instances
apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:
  name: doublerequestcount # metric name
  namespace: istio-system
spec:
  compiledTemplate: metric
  params:
    value: "2" # count each request twice
    # 表示指標的維度,為prometheus指標的{}部分。
    # 參考: {destination="",instance="",job="",message="",reporter="",source=""}`
    dimensions:
      reporter: conditional((context.reporter.kind | "inbound") == "outbound", "client", "server")
      source: source.workload.name | "unknown"
      destination: destination.workload.name | "unknown"
      message: '"twice the fun!"'
    monitored_resource_type: '"UNSPECIFIED"'

2.2 定義指標處理器

建立能夠處理生成的instances的handlers,即告訴Prometheus介面卡如何將收到的指標轉換為Prometheus格式的指標。

# Configuration for a Prometheus handler
apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:
  name: doublehandler
  namespace: istio-system
spec:
  compiledAdapter: prometheus
  params:
    metrics:
      # Prometheus metric name
    - name: double_request_count 
      # Mixer instance name (完全限定名稱)
      instance_name: doublerequestcount.instance.istio-system 
      kind: COUNTER
      # 此處標籤為doublerequestcount instance配置的dimensions。
      label_names:
      - reporter
      - source
      - destination
      - message

在指標名稱之前,Prometheus介面卡會添加了istio_字首,因此該指標在Prometheus中最終名稱為 istio_double_request_count

2.3 關聯指標到處理器

根據一組rules向handlers分配instances,如下將網格中的所有請求生成的指標都發送到doublehandler處理器,也可以使用match條件,篩選指標。

# Rule to send metric instances to a Prometheus handler
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
  name: doubleprom
  namespace: istio-system
spec:
  actions:
  - handler: doublehandler
    instances: [ doublerequestcount ]

2.4 通過Prometheus UI檢視新指標

到目前為止,就可以在監控大盤(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

https://istio.io/docs/tasks/observability/metrics/collecting-metr