微服务架构可视化的重要性:前端
什么是 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 数据: