微服務架構可視化的重要性:前端
什麼是 Kiali:web
Kiali屬於Istio的集成組件之一,是一個用於Istio的可觀測性控制檯,具備服務網格配置和驗證功能。它經過監控網絡流量來推斷服務拓撲和報告錯誤,幫助你瞭解服務網格的結構和運行情況。Kiali提供了詳細的度量和基本的Grafana集成,可用於高級查詢。數據庫
Kiali 的功能:
json
Kiali 的架構:
後端
從上圖能夠看到 Kiali 是一個先後端分離的架構,咱們可使用官方提供的配置文件啓動 Kiali 的後端組件:瀏覽器
[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/kiali.yaml
確認啓動成功:安全
[root@m1 ~]# kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE kiali-7476977cf9-nwnsg 1/1 Running 1 33h ...
而後使用以下命令啓動 kiali 的前端:bash
[root@m1 ~]# istioctl dashboard kiali --address 192.168.243.138 http://localhost:20001/kiali
使用瀏覽器訪問 192.168.243.138:20001 ,基本頁面以下:
網絡
在 「Application」 頁面能夠查看不一樣 Namespace 下所部署的應用:
架構
在 「Graph」 頁面下能夠查看服務之間的整體拓撲,並提供了多種頁面操做:
在 「Services」 頁面能夠查看指定 Namespace 下的服務信息:
點擊服務的名稱能夠進入該服務的詳情頁:
在 「Workloads」 頁面能夠查看指定 Namespace 下的工做負載信息:
點擊工做負載的名稱能夠進入該工做負載的詳情頁:
在 「Istio Config」 頁面能夠對 Istio 中的資源配置進行查看、編輯及驗證:
例如 detail 的配置有錯誤,咱們能夠點擊進去查看出錯的地方,而且根據提示進行修改,而後點擊 「Save」 保存便可:
在 「Istio Config」 頁面還有個嚮導功能,可讓咱們建立 Istio 的資源。以下:
但目前只提供了少數的幾個資源類型能夠建立:
Prometheus 是一個開源的監控系統和時間序列數據庫。你可使用 Prometheus 來記錄跟蹤 Istio 和服務網格內應用程序運行情況的指標。而後可使用Grafana和Kiali等工具對監控指標進行可視化。
Prometheus 的功能:
Prometheus 的架構:
Prometheus 與 Istio 的集成也比較簡單,咱們可使用官方提供的配置文件啓動 Prometheus Server:
[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/prometheus.yaml
確認啓動成功:
[root@m1 ~]# kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE prometheus-7bfddb8dbf-4mnzr 2/2 Running 2 33h ...
而後使用以下命令啓動 Prometheus 的 Web UI :
[root@m1 ~]# istioctl dashboard prometheus --address 192.168.243.138 http://localhost:9090
使用瀏覽器訪問 192.168.243.138:9090,頁面以下:
經過官方提供的配置文件啓動 Prometheus Server 後,它就會自動收集 Istio 的監控指標了。此時咱們就能夠經過 Prometheus 收集指標並查看指標數據了,例如查看 Istio 的請求總數,該指標屬於服務指標:
Envoy 代理指標則以 envoy 開頭,能夠輸入前綴進行查詢:
除以上兩類指標外還有控制平面指標,這類指標是 Istio 提供的一系列自我監控指標,這些指標用於監控 Istio 自己的行爲。
在 「Status -> Targets」 頁面能夠查看監控目標的狀態:
Istio 1.5 以後提供的遙測指標:
Istio 1.5 以前是經過Mixer來進行指標收集的,以下圖:
Istio 1.5 以後就直接是 Envoy 和 Prometheus 進行交互,以下圖:
可同時解決性能與擴展性問題最可行的一個方法就是將來在 Envoy 上使用 WebAssembly 這樣的技術。WebAssembly in Envoy:
關於收集、查詢指標的更多方式能夠參考官方文檔:
Grafana 的功能:
Istio 默認提供了一些 Grafana Dashboard:
關於 Grafana 與 Istio 的集成,官方也提供了相應的配置文件,使用以下命令就能夠啓動 Grafana :
[root@m1 ~]# kubectl apply -f /usr/local/istio-1.8.1/samples/addons/grafana.yaml
確認啓動成功:
[root@m1 ~]# kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE grafana-784c89f4cf-s26lp 1/1 Running 1 33h ...
而後使用以下命令啓動 Grafana 的 Web UI :
[root@m1 ~]# istioctl dashboard grafana --address 192.168.243.138 http://localhost:3000
使用瀏覽器訪問 192.168.243.138:3000 ,首頁以下:
如今咱們就能夠使用 Grafana 查看指標生成的 Istio Dashboard了,進入 「Home」,能夠看到 Istio 提供的 Dashboard:
打開 「Istio Mesh Dashboard」 查看網格數據總覽,展現效果以下:
點擊下方的 Service 名稱能夠進入 「Istio Service Dashboard」 查看服務視圖:
「Istio Workload Dashboard」 查看工做負載視圖:
「Istio Performance Dashboard」 查看資源使用總覽:
最簡單的一種Istio日誌記錄是Envoy的訪問日誌記錄。訪問日誌(Access logs)提供了一種從單個工做負載實例的角度監視和理解行爲的方法,經過查看Envoy日誌能夠了解流量信息、定位問題。Envoy代理將訪問信息打印到其標準輸出。而後,使用kubectl logs
命令能夠打印Envoy容器的標準輸出。
這一小節將演示如何獲取Envoy的訪問日誌。首先,確認 Envoy 日誌配置已開啓(默認是開啓的),可以使用以下命令開啓:
$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout
仍是以Bookinfo應用做爲示例:
[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應用的服務後會產生流量輸出,此時可使用以下命令查看 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
訪問日誌默認的格式是 TEXT 格式,不利於查看日誌項的含義,咱們能夠將日誌格式設置爲JSON,這樣能夠比較方便觀察其日誌項,使用以下命令將accessLogEncoding設置爲JSON:
$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogEncoding=JSON
將日誌格式設置爲JSON後,此時輸出的日誌內容以下:
{"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格式化後,以下:
日誌信息中有五個重要的字段,也就是所謂的Envoy 流量五元組:
調試關鍵字段:response_flags
,一些請求的錯誤標誌會被賦值給該字段。常見錯誤標誌有以下幾種:
Envoy 的一些日誌配置項:
分佈式追蹤概念
Istio支持經過 Envoy 代理進行分佈式追蹤。代理會表明其代理的應用程序自動生成跟蹤範圍,只須要應用程序轉發適當的請求上下文。
Istio支持許多跟蹤後端,包括Zipkin、Jaeger、Lightstep和Datadog。本小節將介紹 Istio 集成 Jaeger 實現分佈式追蹤。
什麼是 Jaeger:
分佈式追蹤的兩個重要術語:
Jaeger 的架構:
核心組件:
接下來咱們把 Jaeger 集成到 Istio。首先,確認 Istio 開啓了追蹤選項,可使用以下命令開啓:
$ 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
確認 Jaeger 啓動成功:
[root@m1 ~]# kubectl get pods -n istio-system NAME READY STATUS RESTARTS AGE jaeger-7f78b6fb65-gchw2 1/1 Running 2 46h ...
而後使用以下命令啓動 Jaeger 的Web UI:
[root@m1 ~]# istioctl dashboard jaeger --address 192.168.243.138 http://localhost:16686
使用瀏覽器訪問 Jaeger 的Web UI:
而後訪問 Bookinfo 應用頁面生成一些 trace 數據後,到 Jaeger 查詢 trace 數據:
點擊任意 Span 能夠查看其詳細 trace 數據: