云原生 - Istio可观察性之监控(四)
作者:justmine
頭條號(hào):大數(shù)據(jù)與云原生
微信公眾號(hào):大數(shù)據(jù)與云原生
創(chuàng)作不易,在滿足創(chuàng)作共用版權(quán)協(xié)議的基礎(chǔ)上可以轉(zhuǎn)載,但請(qǐng)以超鏈接形式注明出處。
為了方便閱讀,微信公眾號(hào)已按分類排版,后續(xù)的文章將在移動(dòng)端首發(fā),想學(xué)習(xí)云原生相關(guān)知識(shí),請(qǐng)關(guān)注我。
一、回顧
云原生 - 體驗(yàn)Istio的完美入門之旅(一)
云原生 - Why is istio(二)
云原生 - Istio可觀察性之分布式跟蹤(三)
[請(qǐng)持續(xù)關(guān)注...]
如前所述,業(yè)務(wù)微服務(wù)化后,每個(gè)單獨(dú)的微服務(wù)可能會(huì)有很多副本,多個(gè)版本,這么多微服務(wù)之間的相互調(diào)用、管理和治理非常復(fù)雜,Istio統(tǒng)一封裝了這塊內(nèi)容在代理層,最終形成一個(gè)分布式的微服務(wù)代理集群(服務(wù)網(wǎng)格)。管理員通過(guò)統(tǒng)一的控制平面來(lái)配置整個(gè)集群的應(yīng)用流量、安全規(guī)則等,代理會(huì)自動(dòng)從控制中心獲取動(dòng)態(tài)配置,根據(jù)用戶的期望來(lái)改變行為。
話外音:借著微服務(wù)和容器化的東風(fēng),傳統(tǒng)的代理?yè)u身一變,成了如今炙手可熱的服務(wù)網(wǎng)格。
Istio就是上面service mesh架構(gòu)的一種實(shí)現(xiàn),通過(guò)代理(默認(rèn)是envoy)全面接管服務(wù)間通信,完全支持主流的通信協(xié)議HTTP/1.1,HTTP/2,gRPC ,TCP等;同時(shí)進(jìn)一步細(xì)分控制中心,包括Pilot、Mixer、Citadel等。
話外音:后面系列會(huì)詳細(xì)介紹控制中心的各個(gè)組件,請(qǐng)持續(xù)關(guān)注。
整體功能描述如下:
連接(Connect)
控制中心從集群中獲取所有微服務(wù)的信息,并分發(fā)給代理,這樣代理就能根據(jù)用戶的期望來(lái)完成服務(wù)之間的通信(自動(dòng)地服務(wù)發(fā)現(xiàn)、負(fù)載均衡、流量控制等)。
保護(hù)(Secure)
所有的流量都是通過(guò)代理,當(dāng)代理接收到未加密流量時(shí),可以自動(dòng)做一次封裝,把它升級(jí)成安全的加密流量。
控制(Control)
用戶可以配置各種規(guī)則(比如 RBAC 授權(quán)、白名單、rate limit 、quota等),當(dāng)代理發(fā)現(xiàn)服務(wù)之間的訪問(wèn)不符合這些規(guī)則,就直接拒絕掉。
觀察(Observe)
所有的流量都經(jīng)過(guò)代理,因此代理對(duì)整個(gè)集群的訪問(wèn)情況知道得一清二楚,它把這些數(shù)據(jù)上報(bào)到控制中心,那么管理員就能觀察到整個(gè)集群的流量情況。
二、前言
作為服務(wù)網(wǎng)格的一個(gè)完整解決方案,為了追求完美,Istio高度抽象并設(shè)計(jì)了一個(gè)優(yōu)雅的架構(gòu),涉及到眾多的組件,它們分工協(xié)作,共同組成了完整的控制平面。為了更好地學(xué)習(xí)如何運(yùn)用Istio的連接、安全、控制、可觀察性全面地治理分布式微服務(wù)應(yīng)用,先從戰(zhàn)略上鳥瞰I(xiàn)stio,進(jìn)一步從戰(zhàn)術(shù)上學(xué)習(xí)Istio將更加容易,故作者決定從可觀察性開始Istio的布道,先體驗(yàn),再實(shí)踐,最后落地,一步步愛(ài)上Istio,愛(ài)上云原生,充分利用云資源的優(yōu)勢(shì),解放應(yīng)用開發(fā)工程師的雙手,使他們僅僅關(guān)注業(yè)務(wù)實(shí)現(xiàn),讓專業(yè)的人做專業(yè)的事,為企業(yè)創(chuàng)造更大的價(jià)值。
三、Istio的可觀察性
1. 日志
當(dāng)流量流入服務(wù)網(wǎng)格中的微服務(wù)時(shí),Istio可以為每個(gè)請(qǐng)求生成完整的記錄,包括源和目標(biāo)的元數(shù)據(jù)等。使運(yùn)維人員能夠?qū)⒎?wù)行為的審查控制到單個(gè)微服務(wù)的級(jí)別。
2. 監(jiān)控
Istio基于監(jiān)控的4 個(gè)黃金信號(hào)(延遲、流量、錯(cuò)誤、飽和度)來(lái)生成一系列的服務(wù)指標(biāo),同時(shí)還提供了一組默認(rèn)的服務(wù)網(wǎng)格監(jiān)控大盤。
話外音:Istio還為服務(wù)網(wǎng)格控制平面提供了更為詳細(xì)的監(jiān)控指標(biāo)。
3. 分布式跟蹤
Istio根據(jù)采樣率為每個(gè)請(qǐng)求生成完整的分布式追蹤軌跡,以便運(yùn)維人員可以理解服務(wù)網(wǎng)格內(nèi)微服務(wù)的依賴關(guān)系和調(diào)用流程。
可以看出,Istio的可觀察性,致力于解決兩方面的問(wèn)題:
1、癥狀:什么病?
是Istio的問(wèn)題?
哪個(gè)Istio組件的問(wèn)題?
[...]
2、原因:為什么得這種病?
怎樣跟蹤、分析、定位?
是異常,還是偶然事件?
[...]
知曉了癥狀(什么)和原因(為什么),治病應(yīng)該就信手拈來(lái)了吧,如果還不知如何治病,那就去格物致知吧。
話外音:不僅如此,Istio還支持按需降級(jí)或關(guān)閉某些功能的能力,請(qǐng)持續(xù)關(guān)注。
四、Why - 為什么需要監(jiān)控?
在軟件形態(tài)上,Service Mesh將業(yè)務(wù)系統(tǒng)中的非業(yè)務(wù)功能剝離到獨(dú)立的中間件系統(tǒng)中。同時(shí),為了解耦運(yùn)維,以Sidecar的方式將中間系統(tǒng)注入到業(yè)務(wù)容器內(nèi),在落地過(guò)程中難免會(huì)面臨穩(wěn)定性、運(yùn)維模式變化等諸多的問(wèn)題與挑戰(zhàn),如何確保網(wǎng)格的生產(chǎn)穩(wěn)定和可靠呢?
從設(shè)計(jì)之初,Istio都致力于建設(shè)一個(gè)高可用的基礎(chǔ)架構(gòu),以防止服務(wù)質(zhì)量降低而影響業(yè)務(wù)本身。為了跟蹤分布式系統(tǒng)中的每個(gè)信號(hào),Istio基于Google網(wǎng)站可靠性工程師小組(SRE)定義的四個(gè)監(jiān)控關(guān)鍵指標(biāo),全面而詳細(xì)地監(jiān)控業(yè)務(wù)系統(tǒng)和自身。
黃金四信號(hào):
延遲(Latency)
處理請(qǐng)求的時(shí)間,即發(fā)送請(qǐng)求和接收響應(yīng)所需的時(shí)間,比如:請(qǐng)求成功與請(qǐng)求失敗的延遲。
在微服務(wù)中提倡“快速失敗”,特別要注意那些延遲較大的錯(cuò)誤請(qǐng)求。這些緩慢的錯(cuò)誤請(qǐng)求會(huì)明顯影響系統(tǒng)的性能,因此追蹤這些錯(cuò)誤請(qǐng)求的延遲是非常重要的。
流量(Traffic)
也稱吞吐量,用于衡量系統(tǒng)的容量需求,即收到多少請(qǐng)求,比如:請(qǐng)求率(HTTP請(qǐng)求數(shù)/秒)。
對(duì)于分布式系統(tǒng),它可以幫助您提前規(guī)劃容量以滿足即將到來(lái)的需求等。
錯(cuò)誤(Errors)
衡量系統(tǒng)發(fā)生的錯(cuò)誤情況,比如:請(qǐng)求錯(cuò)誤率。
飽和度(Saturation)
衡量網(wǎng)絡(luò)和服務(wù)器等資源的負(fù)載,主要強(qiáng)調(diào)最能影響服務(wù)狀態(tài)的受限制資源。
每個(gè)資源都有一個(gè)限制,之后性能將降低或變得不可用。了解分布式系統(tǒng)的哪些部分可能首先變得飽和,以便在性能下降之前調(diào)整容量。
黃金四信號(hào)幾乎深度覆蓋了所有想知道到底怎么回事的相關(guān)信息,既是監(jiān)控系統(tǒng)發(fā)現(xiàn)問(wèn)題的關(guān)鍵,也是保障高可用基礎(chǔ)性框架的關(guān)鍵。
話外音:分布式系統(tǒng)不同于單體應(yīng)用,監(jiān)控信號(hào)是異常檢測(cè)的關(guān)鍵,是預(yù)警的重要積木。
五、What - Istio的監(jiān)控?
為了監(jiān)控應(yīng)用服務(wù)行為,Istio為服務(wù)網(wǎng)格中所有出入的服務(wù)流量都生成了指標(biāo),例如總請(qǐng)求數(shù)、錯(cuò)誤率和請(qǐng)求響應(yīng)時(shí)間等。
為了監(jiān)控服務(wù)網(wǎng)格本身,Istio組件可以導(dǎo)出自身內(nèi)部行為的詳細(xì)統(tǒng)計(jì)指標(biāo),以提供對(duì)服務(wù)網(wǎng)格控制平面功能和健康情況的洞察能力。
話外音:Istio指標(biāo)收集可以由運(yùn)維人員配置來(lái)驅(qū)動(dòng),即運(yùn)維人員決定如何以及何時(shí)收集指標(biāo),以及收集的詳細(xì)程度,靈活地調(diào)整指標(biāo)收集策略來(lái)滿足個(gè)性化的監(jiān)控需求。
代理級(jí)別指標(biāo)
Istio指標(biāo)收集從sidecar代理(Envoy)開始,它為通過(guò)代理的所有流量(入站和出站)生成一組豐富的指標(biāo),同時(shí)允許運(yùn)維人員為每個(gè)工作負(fù)載實(shí)例(微服務(wù))配置如何生成和收集哪些指標(biāo)。
Envoy統(tǒng)計(jì)信息收集詳細(xì)說(shuō)明:https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/observability/statistics.html?highlight=statistics
服務(wù)級(jí)別指標(biāo)
除了代理級(jí)別指標(biāo)之外,Istio還提供了一組用于監(jiān)控服務(wù)通信的指標(biāo)。這些指標(biāo)涵蓋了四個(gè)基本的服務(wù)監(jiān)控需求:延遲、流量、錯(cuò)誤、飽和度,同時(shí)Istio也提供了一組默認(rèn)的儀表盤,用于監(jiān)控基于這些指標(biāo)的服務(wù)行為。
默認(rèn)的Istio指標(biāo)由Istio提供的配置集定義并默認(rèn)導(dǎo)出到Prometheus。運(yùn)維人員可以自由地修改這些指標(biāo)的形態(tài)和內(nèi)容,更改它們的收集機(jī)制,以滿足各自的監(jiān)控需求。
備注:運(yùn)維人員也可以選擇關(guān)閉服務(wù)級(jí)別指標(biāo)的生成和收集。
控制面板指標(biāo)
每一個(gè)Istio的組件(Pilot、Galley、Mixer等)都提供了對(duì)自身監(jiān)控指標(biāo)的集合。這些指標(biāo)容許監(jiān)控Istio自己的行為。
六、How - Istio監(jiān)控是如何工作的?
1、部署監(jiān)控大盤
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: grafananamespace: istio-system spec:[...]type: NodePortports:[...]nodePort: 3000[...]話外音:測(cè)試環(huán)境使用NodePort聯(lián)網(wǎng),僅供參考。
瀏覽器訪問(wèn):http://[主機(jī)IP]:3000/dashboard/db/istio-mesh-dashboard。
微服務(wù)應(yīng)用BookInfo監(jiān)控大盤
為了更好的閱讀體驗(yàn),上面僅截取了部分監(jiān)控,可以看出監(jiān)控的四個(gè)黃金信號(hào)吧,同時(shí),為了使指標(biāo)統(tǒng)計(jì)更精確,有的指標(biāo)還通過(guò)P50、P90、P99維度分別展示,避免長(zhǎng)尾誤導(dǎo)。除了業(yè)務(wù)監(jiān)控,Istio也提供了自身平臺(tái)的監(jiān)控大盤,如下:
可以看出Istio的默認(rèn)監(jiān)控大盤非常全面,該監(jiān)控的都監(jiān)控起來(lái)了,到目前為止,大家已經(jīng)從整體上了解和體驗(yàn)Istio的監(jiān)控體系。
2、擴(kuò)展新指標(biāo)
為了支持個(gè)性化監(jiān)控需求,Istio支持自定義指標(biāo)來(lái)擴(kuò)展監(jiān)控體系,下面將添加一個(gè)新指標(biāo)(將每個(gè)請(qǐng)求計(jì)數(shù)兩次),并發(fā)送到Prometheus。
備注:Istio也支持自定義Mixer Adapter來(lái)支持其他監(jiān)控后端。
2.1 定義指標(biāo)
創(chuàng)建名為doublerequestcount的新指標(biāo),告訴Mixer如何根據(jù)Envoy報(bào)告的屬性為請(qǐng)求創(chuàng)建指標(biāo)維度和生成值,即對(duì)于doublerequestcount的每個(gè)instance,指示Mixer為它提供值2。
備注:Istio將為每個(gè)請(qǐng)求生成一個(gè)Instance。
# Configuration for metric instances apiVersion: config.istio.io/v1alpha2 kind: instance metadata:name: doublerequestcount # metric namenamespace: istio-system spec:compiledTemplate: metricparams:value: "2" # count each request twice# 表示指標(biāo)的維度,為prometheus指標(biāo)的{}部分。# 參考: {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 定義指標(biāo)處理器
創(chuàng)建能夠處理生成的instances的handlers,即告訴Prometheus適配器如何將收到的指標(biāo)轉(zhuǎn)換為Prometheus格式的指標(biāo)。
# Configuration for a Prometheus handler apiVersion: config.istio.io/v1alpha2 kind: handler metadata:name: doublehandlernamespace: istio-system spec:compiledAdapter: prometheusparams:metrics:# Prometheus metric name- name: double_request_count # Mixer instance name (完全限定名稱)instance_name: doublerequestcount.instance.istio-system kind: COUNTER# 此處標(biāo)簽為doublerequestcount instance配置的dimensions。label_names:- reporter- source- destination- message在指標(biāo)名稱之前,Prometheus適配器會(huì)添加了istio_前綴,因此該指標(biāo)在Prometheus中最終名稱為?istio_double_request_count。
2.3 關(guān)聯(lián)指標(biāo)到處理器
根據(jù)一組rules向handlers分配instances,如下將網(wǎng)格中的所有請(qǐng)求生成的指標(biāo)都發(fā)送到doublehandler處理器,也可以使用match條件,篩選指標(biāo)。
# Rule to send metric instances to a Prometheus handler apiVersion: config.istio.io/v1alpha2 kind: rule metadata:name: doublepromnamespace: istio-system spec:actions:- handler: doublehandlerinstances: [ doublerequestcount ]2.4 通過(guò)Prometheus UI查看新指標(biāo)
到目前為止,就可以在監(jiān)控大盤(grafana)中使用該指標(biāo)了。
七、總結(jié)
本篇先回顧了Istio歷史系列文章,然后大致概述了Istio的整體功能,以及可觀察性,最后從why、what、how的角度詳細(xì)介紹了Istio的監(jiān)控體系,并通過(guò)自定義指標(biāo)演示了如何支持個(gè)性化監(jiān)控需求。除了分布式跟蹤、監(jiān)控,Istio的可觀察性還包括日志,敬請(qǐng)期待,請(qǐng)持續(xù)關(guān)注。
八、最后
如果有什么疑問(wèn)和見解,歡迎評(píng)論區(qū)交流。
如果覺(jué)得本篇有幫助的話,歡迎推薦和轉(zhuǎn)發(fā)。
如果覺(jué)得本篇非常不錯(cuò)的話,可以請(qǐng)作者吃個(gè)雞腿,創(chuàng)作的源泉將如滔滔江水連綿不斷,嘿嘿。
九、參考
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-metrics
總結(jié)
以上是生活随笔為你收集整理的云原生 - Istio可观察性之监控(四)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: abp vnext2.0核心组件之DDD
- 下一篇: 使用.NET Core优雅获取并展示最新