可观察性工具 kiali

Istio 中有个 issue #9066 要求将 Istio 中默认使用的 Service Graph 替换成 Kiali。Kiali 最初是由 Red Hat 开源的,用于解决 Service Mesh 中可观察性即微服务的可视性问题。目前已获得 Istio 社区的官方支持。

关于 Kiali

单体应用使用微服务架构拆分成了许多微服务的组合。服务的数量显著增加,就对需要了解服务之间的通信模式,例如容错(通过超时、重试、断路等)以及分布式跟踪,以便能够看到服务调用的去向。服务网格可以在平台级别上提供这些服务,并使应用程序编写者从以上繁重的通信模式中解放出来。路由决策在网格级别完成。Kiali 与Istio 合作,可视化服务网格拓扑、断路器和请求率等功能。Kiali还包括 Jaeger Tracing,可以提供开箱即用的分布式跟踪功能。

Kiali 提供的功能

Kiali 提供以下功能:

  • 服务拓扑图

  • 分布式跟踪

  • 指标度量收集和图标

  • 配置校验

  • 健康检查和显示

  • 服务发现

下图展示了 kiali 中显示的 Bookinfo 示例的服务拓扑图。

你可以使用 kubernetes-vagrant-centos-cluster 来快速启动一个运行 Kiali 的 Kubernetes 集群。

编译安装与试用

Kilia pod 中运行的进程是 /opt/kiali/kiali -config /kiali-configuration/config.yaml -v 4

/kiali-configuration/config.yaml 是使用 ConfigMap 挂载进去的,用于配置 Kiali 的 Web 根路径和外部服务地址。

Kiali 中的基本概念

在了解 Kiali 如何提供 Service Mesh 中微服务可观察性之前,我们需要先了解下 Kiali 如何划分监控类别的。

  • Application:使用运行的工作负载,必须使用 Istio 的将 Label 标记为 app 才算。注意,如果一个应用有多个版本,只要 app 标签的值相同就是属于同一个应用。

  • Deployment:即 Kubernetes 中的 Deployment。

  • Label:这个值对于 Istio 很重要,因为 Istio 要用它来标记 metrics。每个 Application 要求包括 appversion 两个 label。

  • Namespace:通常用于区分项目和用户。

  • Service:即 Kubernetes 中的 Service,不过要求必须有 app label。

  • Workload:Kubernetes 中的所有常用资源类型如 Deployment、StatefulSet、Job 等都可以检测到,不论这些负载是否加入到 Istio Service Mesh 中。

Application、Workload 与 Service 的关系如下图所示。

Kilia 的详细 API 使用说明请查看 Swagger API 文档,在 Kiali 的根目录下运行下面的命令可以查看 API 文档。

Swagger UI 如下图。

架构

Kiali 部署完成后只启动了一个 Pod,前后端都集成在这一个 Pod 中。Kiali 也有一些依赖的组件,例如如果要在 Kiali 的页面中获取到监控 metric 需要使用在 istio-system 中部署 Prometheus。分布式卓总直接下图是 Kiali 的架构,来自 Kiali 官网。

Kiali 使用传统的前后端分离架构:

  • 后端使用 Go 编写:https://github.com/kiali/kiali,为前端提供 API,所有消息使用 JSON 编码,使用 ConfigMap 和 Secret 来存储配置。直接与 Kubernetes 和 Istio 通信来获取数据。

  • 前端使用 Typescript 编写:https://github.com/kiali/kiali-ui,无状态,除了一些证书保存在浏览器中。于查询后端 API,可以跳转访问 Jaeger 分布式追踪和 Grafana 监控页面。

Jaeger 和 Grafana 都是可选组件,使用的都是外部服务,不是由 Kiali 部署的,需要在 kiali-configmap.yaml 中配置 URL。注意该 URL 必须是从你本地浏览器中可以直接访问到的地址。

**注意:**如果服务之间没有任何请求就不会在 Prometheus 中保存数据也就无法显示服务拓扑图,所以大家在部署完 Bookinfo 服务之后向 productpage 服务发送一些请求用于生成服务拓扑图。

服务拓扑图

Kiali 中的服务拓扑图比起 Istio 原来默认部署的 ServiceGraph 的效果更炫也更加直观,具有更多选项。

例如使用 CURL 模拟请求。

会得到如下的返回的 JSON 返回值,为了节省篇幅其中省略了部分结果:

该值中包含了每个 nodeedege 的信息,Node 即图中的每个节点,其中包含了节点的配置信息,Edge 即节点间的关系还有流量情况。前端可以根据该信息绘制服务拓扑图,我们下面将查看下 kiali 的后端,看看它是如何生成以上格式的 JSON 信息的。

:详细的 REST API 使用和字段说明请查看 swagger 生成的 API 文档。

代码解析

下面将带大家了解 Kiali 的后端代码基本结构。

路由配置

服务拓扑图的路由信息保存在 kiali/routing/routes.go 文件中。

直接查看 Swagger 生成的 API 文档也可以。

PQL 查询语句构建

kiali/handlers/graph.go 中处理 HTTP 请求,服务拓扑图中所有的指标信息都是从 Prometheus 中查询得到的。

Kiali 的服务状态拓扑是根据 namespace 来查询的,例如 default namespace 下的服务指标查询 PQL:

其中的参数都是通过页面选择传入的(构建的 PQL 中的选项在 kiali/graph/options/options.go 中定义):

  • reporter="source":metric 报告来源,源服务(source)是 envoy 代理的下游客户端。在服务网格里,一个源服务通常是一个工作负载,但是入口流量的源服务有可能包含其他客户端,例如浏览器,或者一个移动应用。

  • source_workload_namespace="default":选择命名空间。

  • response_code:返回码区间。

  • [600s]:查询的数据中的时间间隔。

关于 PQL 的详细使用方式请参考 QUERY EXAMPLES - prometheus.io

Prometheus

这里面包含了所有 workload 的流量信息,做简单的操作就可以计算出 application/service 的流量状况。

HTTP 处理逻辑

HTTP 请求的处理逻辑入口位于 kiali/handlers/graph.go,路径为:

Appender 是一个接口,在 service graph 中注入详细的信息,它的定义如下:

Appender 位于 kiali/graph/appender 目录下,目前一共有如下实现:

  • DeadNodeAppender:用于将不想要 node 从 service graph 中删除。

  • IstioAppender:获取指定 namespace 下 Istio 的详细信息,当前版本获取指定 namespace 下的 VirtualService 和 DestinationRule 信息。

  • ResponseTimeAppender:获取响应时间。

  • SecurityPolicyAppender:在 service graph 中添加安全性策略信息。

  • SidecarsCheckAppender:检查 Sidecar 的配置信息,例如 Pod 中是否有 App label。

  • UnusedNodeAppender:未加入 Service Mesh 的 node。

我们再来看下在 kiali/graph/graph.go 中定义的 TrafficMap 结构。

以上只是对 Kiali 部分代码的解读,更详细的实现大家可以克隆 kiali 的代码自己研究。

参考

最后更新于

这有帮助吗?