洞察你的服務(wù):使用Kiali觀測(cè)你的微服務(wù)應(yīng)用
微服務(wù)架構(gòu)可視化的重要性:
- 痛點(diǎn):
- 服務(wù)間依賴關(guān)系錯(cuò)綜復(fù)雜
- 問題排查困難毡琉,扯皮甩鍋時(shí)有發(fā)生
- 可視化的優(yōu)勢(shì):
- 梳理服務(wù)的交互關(guān)系
- 了解應(yīng)用的行為與狀態(tài)
什么是 Kiali:
Kiali屬于Istio的集成組件之一软啼,是一個(gè)用于Istio的可觀測(cè)性控制臺(tái)疹味,具有服務(wù)網(wǎng)格配置和驗(yàn)證功能滔吠。它通過監(jiān)控網(wǎng)絡(luò)流量來推斷服務(wù)拓?fù)浜蛨?bào)告錯(cuò)誤烂完,幫助你了解服務(wù)網(wǎng)格的結(jié)構(gòu)和運(yùn)行狀況赂蕴。Kiali提供了詳細(xì)的度量和基本的Grafana集成设哗,可用于高級(jí)查詢唱捣。
- 官方定義:
- Istio 的可觀察性控制臺(tái)
- 通過服務(wù)拓?fù)鋷椭憷斫夥?wù)網(wǎng)格的結(jié)構(gòu)
- 提供網(wǎng)格的健康狀態(tài)視圖
- 具有服務(wù)網(wǎng)格配置功能
- 名字含義:源自希臘語,意為望遠(yuǎn)鏡
- 依賴 Istio 作為宿主网梢,為 Istio 開發(fā)有較強(qiáng)的綁定關(guān)系
- Kiali 是 Istio 服務(wù)觀測(cè)的一環(huán)
Kiali 的功能:
Kiali 的架構(gòu):
從上圖可以看到 Kiali 是一個(gè)前后端分離的架構(gòu)震缭,我們可以使用官方提供的配置文件啟動(dòng) Kiali 的后端組件:
[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/kiali.yaml
確認(rèn)啟動(dòng)成功:
[root@m1 ~]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
kiali-7476977cf9-nwnsg 1/1 Running 1 33h
...
然后使用如下命令啟動(dòng) kiali 的前端:
[root@m1 ~]# istioctl dashboard kiali --address 192.168.243.138
http://localhost:20001/kiali
- Tips:這里的 IP 是該虛擬機(jī)可被外部訪問的 IP
使用瀏覽器訪問 192.168.243.138:20001 ,基本頁面如下:
在 “Application” 頁面可以查看不同 Namespace 下所部署的應(yīng)用:
在 “Graph” 頁面下可以查看服務(wù)之間的總體拓?fù)湔铰玻⑻峁┝硕喾N頁面操作:
在 “Services” 頁面可以查看指定 Namespace 下的服務(wù)信息:
點(diǎn)擊服務(wù)的名稱可以進(jìn)入該服務(wù)的詳情頁:
在 “Workloads” 頁面可以查看指定 Namespace 下的工作負(fù)載信息:
點(diǎn)擊工作負(fù)載的名稱可以進(jìn)入該工作負(fù)載的詳情頁:
在 “Istio Config” 頁面可以對(duì) Istio 中的資源配置進(jìn)行查看拣宰、編輯及驗(yàn)證:
- 綠色代表沒問題,黃色代表有警告烦感,例如使用了過期的配置項(xiàng)巡社,紅色則代表配置有錯(cuò)誤
例如 detail 的配置有錯(cuò)誤,我們可以點(diǎn)擊進(jìn)去查看出錯(cuò)的地方手趣,并且根據(jù)提示進(jìn)行修改晌该,然后點(diǎn)擊 “Save” 保存即可:
在 “Istio Config” 頁面還有個(gè)向?qū)Чδ埽梢宰屛覀儎?chuàng)建 Istio 的資源回懦。如下:
但目前只提供了少數(shù)的幾個(gè)資源類型可以創(chuàng)建:
指標(biāo):使用Prometheus收集指標(biāo)
Prometheus 是一個(gè)開源的監(jiān)控系統(tǒng)和時(shí)間序列數(shù)據(jù)庫气笙。你可以使用 Prometheus 來記錄跟蹤 Istio 和服務(wù)網(wǎng)格內(nèi)應(yīng)用程序運(yùn)行狀況的指標(biāo)。然后可以使用Grafana和Kiali等工具對(duì)監(jiān)控指標(biāo)進(jìn)行可視化怯晕。
Prometheus 的功能:
Prometheus 的架構(gòu):
Prometheus 與 Istio 的集成也比較簡(jiǎn)單潜圃,我們可以使用官方提供的配置文件啟動(dòng) Prometheus Server:
[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/prometheus.yaml
確認(rèn)啟動(dòng)成功:
[root@m1 ~]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
prometheus-7bfddb8dbf-4mnzr 2/2 Running 2 33h
...
然后使用如下命令啟動(dòng) Prometheus 的 Web UI :
[root@m1 ~]# istioctl dashboard prometheus --address 192.168.243.138
http://localhost:9090
使用瀏覽器訪問 192.168.243.138:9090,頁面如下:
通過官方提供的配置文件啟動(dòng) Prometheus Server 后舟茶,它就會(huì)自動(dòng)收集 Istio 的監(jiān)控指標(biāo)了谭期。此時(shí)我們就可以通過 Prometheus 收集指標(biāo)并查看指標(biāo)數(shù)據(jù)了堵第,例如查看 Istio 的請(qǐng)求總數(shù),該指標(biāo)屬于服務(wù)指標(biāo):
Envoy 代理指標(biāo)則以 envoy 開頭隧出,可以輸入前綴進(jìn)行查詢:
除以上兩類指標(biāo)外還有控制平面指標(biāo)踏志,這類指標(biāo)是 Istio 提供的一系列自我監(jiān)控指標(biāo),這些指標(biāo)用于監(jiān)控 Istio 本身的行為胀瞪。
在 “Status -> Targets” 頁面可以查看監(jiān)控目標(biāo)的狀態(tài):
Istio 1.5 之后提供的遙測(cè)指標(biāo):
- 請(qǐng)求總數(shù)(istio_requests_total)
- 請(qǐng)求時(shí)長(istio_request_duration_milliseconds)
- 請(qǐng)求大姓胗唷(istio_request_bytes)
- 響應(yīng)大小(istio_response_bytes)
- TCP 發(fā)送字節(jié)數(shù)(istio_tcp_sent_bytes_total)
- TCP 接受字節(jié)數(shù)(istio_tcp_received_bytes_total)
- TCP 連接打開數(shù)(istio_tcp_connections_opened_total)
- TCP 連接關(guān)閉數(shù)(istio_tcp_connections_closed_total)
Istio 1.5 之前是通過Mixer來進(jìn)行指標(biāo)收集的凄诞,如下圖:
- 首先Envoy需要調(diào)用Mixer來上報(bào)指標(biāo)信息圆雁,Mixer則會(huì)提供一個(gè) metrics 這樣的接口給 Prometheus 去抓取指標(biāo)數(shù)據(jù)。因?yàn)槊看握?qǐng)求進(jìn)入代理時(shí)都需要調(diào)用Mixer上報(bào)數(shù)據(jù)帆谍,導(dǎo)致了一些性能問題伪朽,例如額外的資源占用以及請(qǐng)求延遲這樣的情況,所以1.5之后Mixer就被廢棄了
Istio 1.5 之后就直接是 Envoy 和 Prometheus 進(jìn)行交互汛蝙,如下圖:
- 無論是代理級(jí)別的指標(biāo)還是服務(wù)級(jí)別的指標(biāo)烈涮,都是通過 Envoy 直接去獲取的,這就省去了一層與Mixer的交互窖剑。盡管更改后的版本在性能上有了大幅提升坚洽,但還是存在一些問題。首先因?yàn)槿∠薓ixer這樣的中心化管理苛吱,所以導(dǎo)致 Envoy 代理需要自己去上傳指標(biāo)數(shù)據(jù)酪术,不是很方便,擴(kuò)展性變?nèi)趿恕?/li>
可同時(shí)解決性能與擴(kuò)展性問題最可行的一個(gè)方法就是未來在 Envoy 上使用 WebAssembly 這樣的技術(shù)翠储。WebAssembly in Envoy:
- 解決靜態(tài)化編譯(構(gòu)建時(shí))的弊端
- 優(yōu)勢(shì):
- 無需修改 Envoy
- 避免遠(yuǎn)程調(diào)用
- 隔離性/安全/多樣性
- 可移植/可維護(hù)
關(guān)于收集绘雁、查詢指標(biāo)的更多方式可以參考官方文檔:
監(jiān)控:使用Grafana查看系統(tǒng)的整體狀態(tài)
Grafana 的功能:
- Grafana 只是一個(gè)功能強(qiáng)大的可視化分析平臺(tái),自身并不包含數(shù)據(jù)源援所,所以通常需要配合 Prometheus 等數(shù)據(jù)源使用庐舟。讓 Grafana 從Prometheus 中讀取數(shù)據(jù)進(jìn)行各種可視化展示,可以彌補(bǔ) Prometheus 自帶的可視化界面的不足
Istio 默認(rèn)提供了一些 Grafana Dashboard:
- Mesh Dashboard:查看應(yīng)用(服務(wù))數(shù)據(jù)
- 網(wǎng)格數(shù)據(jù)總覽
- 服務(wù)視圖
- 工作負(fù)載視圖
- Performance Dashboard:查看 Istio 自身(各組件)數(shù)據(jù)
- Istio 系統(tǒng)總覽
- 各組件負(fù)載情況
關(guān)于 Grafana 與 Istio 的集成住拭,官方也提供了相應(yīng)的配置文件挪略,使用如下命令就可以啟動(dòng) Grafana :
[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/grafana.yaml
確認(rèn)啟動(dòng)成功:
[root@m1 ~]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-784c89f4cf-s26lp 1/1 Running 1 33h
...
然后使用如下命令啟動(dòng) Grafana 的 Web UI :
[root@m1 ~]# istioctl dashboard grafana --address 192.168.243.138
http://localhost:3000
使用瀏覽器訪問 192.168.243.138:3000 ,首頁如下:
現(xiàn)在我們就可以使用 Grafana 查看指標(biāo)生成的 Istio Dashboard了滔岳,進(jìn)入 “Home”杠娱,可以看到 Istio 提供的 Dashboard:
打開 “Istio Mesh Dashboard” 查看網(wǎng)格數(shù)據(jù)總覽,展示效果如下:
點(diǎn)擊下方的 Service 名稱可以進(jìn)入 “Istio Service Dashboard” 查看服務(wù)視圖:
“Istio Workload Dashboard” 查看工作負(fù)載視圖:
“Istio Performance Dashboard” 查看資源使用總覽:
日志:如何獲取Envoy的日志并進(jìn)行調(diào)試
最簡(jiǎn)單的一種Istio日志記錄是Envoy的訪問日志記錄谱煤。訪問日志(Access logs)提供了一種從單個(gè)工作負(fù)載實(shí)例的角度監(jiān)視和理解行為的方法关斜,通過查看Envoy日志可以了解流量信息屿附、定位問題。Envoy代理將訪問信息打印到其標(biāo)準(zhǔn)輸出隧期。然后凿可,使用kubectl logs
命令可以打印Envoy容器的標(biāo)準(zhǔn)輸出。
這一小節(jié)將演示如何獲取Envoy的訪問日志。首先,確認(rèn) Envoy 日志配置已開啟(默認(rèn)是開啟的)野来,可使用如下命令開啟:
$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout
還是以Bookinfo應(yīng)用作為示例:
[root@m1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-79c697d759-wpxlj 2/2 Running 2 9h
productpage-v1-65576bb7bf-4bwwr 2/2 Running 2 9h
ratings-v1-7d99676f7f-cfbw4 2/2 Running 2 9h
reviews-v1-987d495c-8n5mv 2/2 Running 2 9h
reviews-v2-6c5bf657cf-rzn4q 2/2 Running 2 9h
reviews-v3-5f7b9f4f77-29454 2/2 Running 2 9h
[root@m1 ~]#
訪問Bookinfo應(yīng)用的服務(wù)后會(huì)產(chǎn)生流量輸出,此時(shí)可以使用如下命令查看 Envoy(istio-proxy)的日志輸出:
[root@m1 ~]# kubectl logs -l app=productpage -c istio-proxy
...
[2020-12-23T01:34:30.349Z] "GET /details/0 HTTP/1.1" 200 - "-" 0 178 15 14 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "1e449e4d-0f3f-928b-9add-8b8ace3f5feb" "details:9080" "172.22.152.212:9080" outbound|9080||details.default.svc.cluster.local 172.22.152.206:42074 10.104.2.32:9080 172.22.152.206:56744 - default
[2020-12-23T01:34:30.376Z] "GET /reviews/0 HTTP/1.1" 200 - "-" 0 375 948 948 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" "1e449e4d-0f3f-928b-9add-8b8ace3f5feb" "reviews:9080" "172.22.78.148:9080" outbound|9080||reviews.default.svc.cluster.local 172.22.152.206:52008 10.100.239.139:9080 172.22.152.206:55806 - default
訪問日志默認(rèn)的格式是 TEXT 格式踪旷,不利于查看日志項(xiàng)的含義曼氛,我們可以將日志格式設(shè)置為JSON,這樣可以比較方便觀察其日志項(xiàng)埃脏,使用如下命令將accessLogEncoding設(shè)置為JSON:
$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogEncoding=JSON
將日志格式設(shè)置為JSON后搪锣,此時(shí)輸出的日志內(nèi)容如下:
{"upstream_cluster":"outbound|9080||reviews.default.svc.cluster.local","downstream_remote_address":"172.22.152.206:32852","authority":"reviews:9080","path":"/reviews/0","protocol":"HTTP/1.1","upstream_service_time":"735","upstream_local_address":"172.22.152.206:53320","duration":735,"route_name":"default","downstream_local_address":"10.100.239.139:9080","upstream_transport_failure_reason":null,"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36","response_code":200,"response_flags":"-","start_time":"2020-12-23T01:45:58.932Z","method":"GET","request_id":"12bc8456-65b1-9a34-96e6-0fa9f0525f23","upstream_host":"172.22.152.209:9080","x_forwarded_for":null,"requested_server_name":null,"bytes_received":0,"bytes_sent":379}
將JSON格式化后,如下:
日志信息中有五個(gè)重要的字段彩掐,也就是所謂的Envoy 流量五元組:
- Envoy 流量五元組可以讓你清晰地知道,流量是從哪里來灰追,會(huì)到哪里去堵幽,所以五元組是 Envoy 日志中非常重要的概念
調(diào)試關(guān)鍵字段:response_flags
,一些請(qǐng)求的錯(cuò)誤標(biāo)志會(huì)被賦值給該字段弹澎。常見錯(cuò)誤標(biāo)志有如下幾種:
- UH:upstream cluster 中沒有健康的 host朴下,503
- UF:upstream 連接失敗,503
- UO:upstream overflow(熔斷)
- NR:沒有路由配置苦蒿,404
- URX:請(qǐng)求被拒絕因?yàn)橄蘖骰蜃畲筮B接次數(shù)
- 更多信息可參考:官方文檔
Envoy 的一些日志配置項(xiàng):
分布式追蹤:使用Jeager對(duì)應(yīng)用進(jìn)行分布式追蹤
分布式追蹤概念
- 分析和監(jiān)控應(yīng)用的監(jiān)控方法
- 查找故障點(diǎn)殴胧、分析性能問題
- 起源于 Google 的 Dapper
-
隨著分布式追蹤技術(shù)的發(fā)展,衍生出了OpenTracing:API 規(guī)范佩迟、框架团滥、公共庫的組合
image.png
Istio支持通過 Envoy 代理進(jìn)行分布式追蹤。代理會(huì)代表其代理的應(yīng)用程序自動(dòng)生成跟蹤范圍报强,只需要應(yīng)用程序轉(zhuǎn)發(fā)適當(dāng)?shù)恼?qǐng)求上下文灸姊。
Istio支持許多跟蹤后端,包括Zipkin秉溉、Jaeger力惯、Lightstep和Datadog。本小節(jié)將介紹 Istio 集成 Jaeger 實(shí)現(xiàn)分布式追蹤召嘶。
什么是 Jaeger:
- 開源父晶、端到端的分布式追蹤系統(tǒng)
-
針對(duì)復(fù)雜的分布式系統(tǒng),對(duì)業(yè)務(wù)鏈路進(jìn)行監(jiān)控和問題排查
image.png
分布式追蹤的兩個(gè)重要術(shù)語:
- Span:
- 邏輯單元
- 有操作名弄跌、執(zhí)行時(shí)間
- 嵌套甲喝、有序、因果關(guān)系
- Trace:
- 數(shù)據(jù)/執(zhí)行路徑
-
Span 的組合
image.png
Jaeger 的架構(gòu):
核心組件:
- Client libraries:客戶端公共庫碟绑,支持不同語言
- Agent:用于從應(yīng)用抓取Span俺猿,并發(fā)送給Collector
- Collector:收集器茎匠,從應(yīng)用層收集Span數(shù)據(jù),并發(fā)送給存儲(chǔ)系統(tǒng)(DB)
- Query:相當(dāng)于查詢引擎押袍,用于提供在頁面上查詢數(shù)據(jù)的能力
- Ingester:與Kafka配合使用诵冒,相當(dāng)于Kafka的一個(gè)Consumer,消費(fèi)數(shù)據(jù)存儲(chǔ)到DB中
接下來我們把 Jaeger 集成到 Istio谊惭。首先汽馋,確認(rèn) Istio 開啟了追蹤選項(xiàng),可以使用如下命令開啟:
$ istioctl install <flags-you-used-to-install-Istio> --set values.tracing.enabled=true
我們可以使用官方提供的配置文件快速將 Jaeger 集成到 Istio 中:
[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/jaeger.yaml
確認(rèn) Jaeger 啟動(dòng)成功:
[root@m1 ~]# kubectl get pods -n istio-system
NAME READY STATUS RESTARTS AGE
jaeger-7f78b6fb65-gchw2 1/1 Running 2 46h
...
然后使用如下命令啟動(dòng) Jaeger 的Web UI:
[root@m1 ~]# istioctl dashboard jaeger --address 192.168.243.138
http://localhost:16686
使用瀏覽器訪問 Jaeger 的Web UI:
然后訪問 Bookinfo 應(yīng)用頁面生成一些 trace 數(shù)據(jù)后圈盔,到 Jaeger 查詢 trace 數(shù)據(jù):
點(diǎn)擊任意 Span 可以查看其詳細(xì) trace 數(shù)據(jù):