Istio(三):服务网格istio可观察性:Prometheus,Grafana,Zipkin,Kiali

一.模块概览

在这个模块中,我们将学习一些监控(Prometheus)、追踪(Zipkin)、数据可视化工具(Grafana)和服务拓扑结构(Kiali)。

为了让 Grafana 和 Kiali 工作,我们首先要安装 Prometheus 插件。

安装Prometheus,Grafana,Zipkin,Kiali的前提是已经安装好了istio,关于istio的安装部署,请查看博客《Istio(二):在Kubernetes(k8s)集群上安装部署istio1.14》https://www.cnblogs.com/renshengdezheli/p/16836404.html

二.系统环境

服务器版本 docker软件版本 Kubernetes(k8s)集群版本 Istio软件版本 CPU架构
CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 Istio1.14 x86_64

Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点

服务器 操作系统版本 CPU架构 进程 功能描述
k8scloude1/192.168.110.130 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico k8s master节点
k8scloude2/192.168.110.129 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点
k8scloude3/192.168.110.128 CentOS Linux release 7.4.1708 (Core) x86_64 docker,kubelet,kube-proxy,calico k8s worker节点

三.可观察性

由于采用了 sidecar 部署模式,即 Envoy 代理运行在应用实例旁边并拦截流量,这些代理也收集指标

Envoy 代理收集的指标可以帮助我们获得系统状态的可见性。获得系统的这种可见性是至关重要的,因为我们需要了解正在发生的事情,并授权运维人员对应用程序进行故障排除、维护和优化。

Istio 生成三种类型的遥测数据,为网格中的服务提供可观察性:

  • 指标度量(Metric)
  • 分布式追踪
  • 访问日志

四.指标

Istio 基于四个黄金信号生成指标:延迟、流量、错误和饱和度

  • 延迟表示服务一个请求所需的时间。这个指标应该分成成功请求(如 HTTP 200)和失败请求(如 HTTP 500)的延迟。
  • 流量是衡量对系统的需求有多大,它是以系统的具体指标来衡量的。例如,每秒的 HTTP 请求,或并发会话,每秒的检索量,等等。
  • 错误用来衡量请求失败的比率(例如 HTTP 500)。
  • 饱和度衡量一个服务中最紧张的资源有多满。例如,线程池的利用率。

这些指标是在不同的层面上收集的,首先是最细的,即 Envoy 代理层面,然后是服务层面和控制平面的指标

4.1 代理级指标

生成指标的关键角色是 Envoy,它生成了一套关于所有通过代理的流量的丰富指标。使用 Envoy 生成的指标,我们可以以最低的粒度来监控服务网格,例如 Envoy 代理中的每个监听器和集群的指标

作为网格运维人员,我们有能力控制生成和收集工作负载实例中的哪些 Envoy 指标。

下面是几个代理级指标的例子。

 envoy_cluster_internal_upstream_rq{response_code_class="2xx",cluster_name="xds-grpc"} 7163
 envoy_cluster_upstream_rq_completed{cluster_name="xds-grpc"} 7164
 envoy_cluster_ssl_connection_error{cluster_name="xds-grpc"} 0
 envoy_cluster_lb_subsets_removed{cluster_name="xds-grpc"} 0
 envoy_cluster_internal_upstream_rq{response_code="503",cluster_name="xds-grpc"} 1

注意你可以从每个 Envoy 代理实例的 /stats 端点查看代理级指标。

4.2 服务级指标

服务级别的指标涵盖了我们前面提到的四个黄金信号。这些指标使我们能够监控服务与服务之间的通信。此外,Istio 还提供了一组仪表盘,我们可以根据这些指标来监控服务行为。

就像代理级别的指标一样,运维人员可以自定义收集哪些服务级别的指标。

默认情况下,Istio 的标准指标集会被导出到 Prometheus。

下面是几个服务级指标的例子:

 istio_requests_total{
   connection_security_policy="mutual_tls",
   destination_app="hello-world",
   destination_canonical_service="hello-world",
   destination_canonical_revision="v1",
   destination_principal="cluster.local/ns/default/sa/default",
   destination_service="hello-world.default.svc.cluster.local",
   destination_service_name="hello-world",
   destination_service_namespace="default",
   destination_version="v1",
   destination_workload="hello-world-v1",
   destination_workload_namespace="default",
   reporter="destination",
   request_protocol="http",
   response_code="200",
   response_flags="-",
   source_app="hello-web",
   source_canonical_service="hello-web",
   source_canonical_revision="v1",
   source_principal="cluster.local/ns/default/sa/default",
   source_version="v1",
   source_workload="hello-web-v1",
   source_workload_namespace="default"
 } 981

4.3 控制平面度量

Istio 也会生成控制平面指标,用于监控 Istio 的控制平面,而不是用户服务。

输出的控制平面指标的完整列表可以在这里找到。

控制平面指标包括冲突的入站/出站监听器的数量、没有实例的集群数量、被拒绝或被忽略的配置等指标

五.Prometheus

5.1 安装Prometheus

Prometheus 是一个开源的监控系统和时间序列数据库Istio 使用 Prometheus 来记录指标,跟踪 Istio 和网格中的应用程序的健康状况

要安装 Prometheus,我们可以使用 Istio 安装包中 /samples/addons 文件夹中的示例安装。

[root@k8scloude1 ~]# cd istio-1.14.3/

[root@k8scloude1 istio-1.14.3]# ls
bin  LICENSE  manifests  manifest.yaml  README.md  samples  tools

[root@k8scloude1 istio-1.14.3]# cd samples/

[root@k8scloude1 samples]# ls
addons    certs             extauthz  grpc-echo     helloworld  jwt-server  kubernetes-blog  open-telemetry  ratelimit  security  tcp-echo
bookinfo  custom-bootstrap  external  health-check  httpbin     kind-lb     multicluster     operator        README.md  sleep     websockets

[root@k8scloude1 samples]# cd addons/

[root@k8scloude1 addons]# pwd
/root/istio-1.14.3/samples/addons

#prometheus.yaml是安装prometheus的yaml文件
[root@k8scloude1 addons]# ls
extras  grafana.yaml  jaeger.yaml  kiali.yaml  prometheus.yaml  README.md

[root@k8scloude1 addons]# vim prometheus.yaml 

#可以看到安装prometheus需要用到两个镜像:jimmidyson/configmap-reload:v0.5.0和prom/prometheus:v2.31.1
[root@k8scloude1 addons]# grep image prometheus.yaml 
          image: "jimmidyson/configmap-reload:v0.5.0"
          imagePullPolicy: "IfNotPresent"
          image: "prom/prometheus:v2.31.1"
          imagePullPolicy: "IfNotPresent"

#提前在k8s的worker节点拉取所需镜像,以k8scloude2节点为例
[root@k8scloude2 ~]# docker pull jimmidyson/configmap-reload:v0.5.0
[root@k8scloude2 ~]# docker pull prom/prometheus:v2.31.1

#安装prometheus
[root@k8scloude1 addons]# kubectl apply -f /root/istio-1.14.3/samples/addons/prometheus.yaml 
serviceaccount/prometheus created
configmap/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/prometheus created
deployment.apps/prometheus created

[root@k8scloude1 addons]# kubectl get deploy -n istio-system 
NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
istio-egressgateway    1/1     1            1           8d
istio-ingressgateway   1/1     1            1           8d
istiod                 1/1     1            1           8d
prometheus             1/1     1            1           102s

#可以看到prometheus运行起来了
[root@k8scloude1 ~]# kubectl get pod -n istio-system -o wide 
NAME                                    READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES
istio-egressgateway-58949b7c84-k7v6f    1/1     Running   5          8d    10.244.112.138   k8scloude2   <none>           <none>
istio-ingressgateway-75bc568988-69k8j   1/1     Running   3          46h   10.244.112.134   k8scloude2   <none>           <none>
istiod-84d979766b-kz5sd                 1/1     Running   10         8d    10.244.112.137   k8scloude2   <none>           <none>
prometheus-699b7cc575-dx6rp             2/2     Running   2          22h   10.244.251.244   k8scloude3   <none>           <none>

要打开 Prometheus 仪表板,我们可以使用 Istio CLI 中的 dashboard 命令:

 $ istioctl dashboard prometheus
 http://localhost:9090
 
[root@k8scloude1 ~]# istioctl dashboard prometheus
http://localhost:9090
Failed to open browser; open http://localhost:9090 in your browser.

我们使用另外一种方法:

#可以看到prometheus这个service的类型为ClusterIP,外部环境访问不了
[root@k8scloude1 ~]# kubectl get service -n istio-system -o wide 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE   SELECTOR
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               8d    app=istio-egressgateway,istio=egressgateway
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   8d    app=istio-ingressgateway,istio=ingressgateway
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        8d    app=istiod,istio=pilot
prometheus             ClusterIP      10.101.141.187   <none>            9090/TCP                                                                     22h   app=prometheus,component=server,release=prometheus

#修改prometheus这个service的类型为NodePort,这样外部环境就可以访问prometheus了
#把type: ClusterIP 修改为 type: NodePort即可
[root@k8scloude1 ~]# kubectl edit service prometheus -n istio-system
service/prometheus edited

#现在prometheus这个service的类型为NodePort,浏览器输入物理机ip:31755即可访问prometheus网页了
[root@k8scloude1 ~]# kubectl get service -n istio-system -o wide 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE   SELECTOR
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               8d    app=istio-egressgateway,istio=egressgateway
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   8d    app=istio-ingressgateway,istio=ingressgateway
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        8d    app=istiod,istio=pilot
prometheus             NodePort       10.101.141.187   <none>            9090:31755/TCP                                                               22h   app=prometheus,component=server,release=prometheus

因为k8scloude1地址为192.168.110.130,所以我们可以在浏览器中打开 http://192.168.110.130:31755/,进入 Prometheus 仪表盘,如下图所示。

Prometheus Dashboard如下:默认显示的是新版UI界面,可以点击Classic UI切换到经典UI界面

image-20221002171023606

经典UI界面如下:

image-20221002171749697

5.2 部署示例应用

为了看到一些请求和流量,我们将部署一个 Nginx 实例:

[root@k8scloude1 ~]# kubectl get pod 
No resources found in microservice namespace.

#使用hub.c.163.com/library/nginx:latest镜像创建一个deploy
[root@k8scloude1 ~]# kubectl create deployment nginx --image=hub.c.163.com/library/nginx:latest -n microservice
deployment.apps/nginx created

[root@k8scloude1 ~]# kubectl get pod -n microservice
NAME                     READY   STATUS    RESTARTS   AGE
nginx-85669b5597-9lwr4   2/2     Running   0          12s

为了能够产生一些流量并访问 Nginx Pod,我们需要以某种方式让它可以被访问。

最简单的方法是将 Nginx 部署作为 Kubernetes NodePort服务公开:

[root@k8scloude1 ~]# kubectl expose deployment nginx --type=NodePort --name=nginxsvc --port=80 -n microservice
service/nginxsvc exposed

以后可以使用 Istio 资源并通过 Istio 的入口网关暴露服务。

现在我们可以运行 kubectl get services,查看 nginxsvc 服务:

[root@k8scloude1 ~]# kubectl get service -n microservice
NAME       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginxsvc   NodePort   10.108.253.73   <none>        80:30784/TCP   12s

这时只要访问k8scloude1的IP:30784,就可以访问Nginx服务。

[root@k8scloude1 ~]# curl 192.168.110.130:30784
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

使用curl 192.168.110.130:30784请求Nginx之后,从 Prometheus UI 中,你可以搜索 Istio 的一个指标(例如 istio_requests_total),以了解哪些数据点正在被收集。

输入istio_requests_total之后,点击Execute执行,就可以看到收集到的数据

image-20221002182537171

下面是一个来自 Prometheus 用户界面的示例元素:

istio_requests_total{app="nginx",connection_security_policy="none",destination_app="nginx",destination_canonical_revision="latest",destination_canonical_service="nginx",destination_cluster="Kubernetes",destination_principal="unknown",destination_service="nginxsvc.microservice.svc.cluster.local",destination_service_name="nginxsvc",destination_service_namespace="microservice",destination_version="unknown",destination_workload="nginx",destination_workload_namespace="microservice",instance="10.244.112.141:15020",job="kubernetes-pods",namespace="microservice",pod="nginx-85669b5597-9lwr4",pod_template_hash="85669b5597",reporter="destination",request_protocol="http",response_code="200",response_flags="-",security_istio_io_tlsMode="istio",service_istio_io_canonical_name="nginx",service_istio_io_canonical_revision="latest",source_app="unknown",source_canonical_revision="latest",source_canonical_service="unknown",source_cluster="unknown",source_principal="unknown",source_version="unknown",source_workload="unknown",source_workload_namespace="unknown"} 1 

六.Grafana

6.1 安装Grafana

Grafana 是一个用于分析和监控的开放平台。Grafana 可以连接到各种数据源,并使用图形、表格、热图等将数据可视化。通过强大的查询语言,你可以定制现有的仪表盘并创建更高级的可视化。

通过 Grafana,我们可以监控 Istio 安装和服务网格中运行的应用程序的健康状况

我们可以使用 grafana.yaml 来部署带有预配置仪表盘的 Grafana 示例安装。该 YAML 文件在 Istio 安装包的 /samples/addons 下。

确保在部署 Grafana 之前部署 Promeheus 插件,因为 Grafana 使用 Prometheus 作为其数据源

运行下面的命令来部署 Grafana 和预配置的仪表盘:

[root@k8scloude1 addons]# kubectl apply -f /root/istio-1.14.3/samples/addons/grafana.yaml 
serviceaccount/grafana created
configmap/grafana created
service/grafana created
deployment.apps/grafana created
configmap/istio-grafana-dashboards created
configmap/istio-services-grafana-dashboards created

[root@k8scloude1 addons]# vim grafana.yaml 

[root@k8scloude1 addons]# kubectl get pod -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-6c5dc6df7c-cnc9w                1/1     Running   0          75s
istio-egressgateway-58949b7c84-k7v6f    1/1     Running   6          9d
istio-ingressgateway-75bc568988-69k8j   1/1     Running   4          2d17h
istiod-84d979766b-kz5sd                 1/1     Running   11         9d
prometheus-699b7cc575-dx6rp             2/2     Running   4          41h

这个 Grafana 安装不打算在生产中运行,因为它没有经过性能或安全方面的调整。

Kubernetes 将 Grafana 部署在 istio-system 命名空间。要访问 Grafana,我们可以使用 istioctl dashboard 命令。

[root@k8scloude1 addons]# istioctl dashboard grafana
http://localhost:3000
Failed to open browser; open http://localhost:3000 in your browser.

我们使用另外一种方法:

#可以看到grafana这个service的类型为ClusterIP,外部环境访问不了
[root@k8scloude1 addons]# kubectl get service -n istio-system 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE
grafana                ClusterIP      10.100.151.232   <none>            3000/TCP                                                                     87m
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               9d
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   9d
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        9d
prometheus             NodePort       10.101.141.187   <none>            9090:31755/TCP                                                               42h

#修改grafana这个service的类型为NodePort,这样外部环境就可以访问grafana了
#把type: ClusterIP 修改为 type: NodePort即可
[root@k8scloude1 addons]# kubectl edit service grafana -n istio-system 
service/grafana edited

#现在grafana这个service的类型为NodePort,浏览器输入物理机ip:31092即可访问grafana网页了
[root@k8scloude1 addons]# kubectl get service -n istio-system 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE
grafana                NodePort       10.100.151.232   <none>            3000:31092/TCP                                                               88m
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               9d
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   9d
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        9d
prometheus             NodePort       10.101.141.187   <none>            9090:31755/TCP                                                               42h

k8scloude1机器的地址为192.168.110.130,我们可以在浏览器中打开 http://192.168.110.130:31092,进入 Grafana,Grafana首页如下:

image-20221003134059281

点击搜索框和 istio 文件夹,查看已安装的仪表盘,如下图所示。

image-20221003134327676

Istio Grafana 安装时预配置了以下仪表盘:

Istio 控制平面仪表盘(Istio Control Plane Dashboard)

从 Istio 控制平面仪表盘,我们可以监控 Istio 控制平面的健康和性能。

image-20221003135009166

Istio Control Plane Dashboard 仪表盘将向我们展示控制平面的资源使用情况(内存、CPU、磁盘、Go routines),以及关于 Pilot、Envoy 和 Webhook 的信息。

Istio 网格仪表盘(Istio Mesh Dashboard)

网格仪表盘为我们提供了在网格中运行的所有服务的概览。仪表盘包括全局请求量、成功率以及 4xx 和 5xx 响应的数量。

image-20221003174936332

Istio 性能仪表盘(Istio Performance Dashboard)

性能仪表盘向我们展示了 Istio 主要组件在稳定负载下的资源利用率。

image-20221003175400296

Istio 服务仪表盘(Istio Service Dashboard)

服务仪表盘允许我们在网格中查看服务的细节。

我们可以获得关于请求量、成功率、持续时间的信息,以及显示按来源和响应代码、持续时间和大小的传入请求的详细图表。

image-20221003175655341

Istio Wasm 扩展仪表盘(Istio Wasm Extension Dashboard)

Istio Wasm 扩展仪表盘显示与 WebAssembly 模块有关的指标。从这个仪表盘,我们可以监控活动的和创建的 Wasm 虚拟机,关于获取删除 Wasm 模块和代理资源使用的数据。

image-20221003175857339

Istio 工作负载仪表盘(Istio Workload Dashboard)

这个仪表盘为我们提供了一个工作负载的详细指标分类。

image-20221003181615585

七.Zipkin

7.1 什么是分布式追踪?

分布式追踪是一种监测微服务应用程序的方法。使用分布式追踪,我们可以在请求通过被监控系统的不同部分时追踪它们

每当一个请求进入服务网格时,Envoy 都会生成一个唯一的请求 ID 和追踪信息,并将其作为 HTTP 头的一部分来存储。任何应用程序都可以将这些头信息转发给它所调用的其他服务,以便在系统中创建一个完整的追踪。

分布式追踪是一个跨度(span)的集合。当请求流经不同的系统组件时,每个组件都会产生一个跨度。每个跨度都有一个名称,开始和结束的时间戳,一组称为标签(tag)和日志(log)的键值对,以及一个跨度上下文

标签被应用于整个跨度,并用于查询和过滤。下面是我们在使用 Zipkin 时将看到的几个标签的例子。注意,其中有些是通用的,有些是 Istio 特有的:

  • istio.mesh_id
  • istio.canonical_service
  • upstream_cluster
  • http.url
  • http.status_code
  • zone

单个跨度与识别跨度、父跨度、追踪 ID 的上下文头一起被发送到一个叫做采集器的组件。采集器对数据进行验证、索引和存储。

当请求流经 Envoy 代理时,Envoy 代理会自动发送各个跨度。请注意,Envoy 只能在边缘收集跨度。我们要负责在每个应用程序中生成任何额外的跨度,并确保我们在调用其他服务时转发追踪头信息。这样一来,各个跨度就可以正确地关联到一个单一的追踪中。

image-20221027175822314

7.2 使用 Zipkin 进行分布式追踪

Zipkin 是一个分布式追踪系统。我们可以轻松地监控服务网格中发生的分布式事务,发现任何性能或延迟问题

为了让我们的服务参与分布式追踪,我们需要在进行任何下游服务调用时传播服务的 HTTP 头信息。尽管所有的请求都要经过 Istio sidecar,但 Istio 没有办法将出站请求与产生这些请求的入站请求联系起来。通过在应用程序中传播相关的头信息可以帮助 Zipkin 将这些跟踪信息拼接起来。

Istio 依赖于 B3 跟踪头(以 x-b3 开头的 header)和 Envoy 生成的请求 ID(x-request-id)。B3 头信息用于跨服务边界的跟踪上下文传播。

以下是我们需要在我们的应用程序中对每个发出的请求进行传播的特定头文件名称:

 x-request-id
 x-b3-traceid
 x-b3-spanid
 x-b3-parentspanid
 x-b3-sampled
 x-b3-flags
 b3

如果你使用 Lightstep,你还需要转发名为 x-ot-span-context 的头。

传播头信息最常见的方法是从传入的请求中复制它们,并将它们包含在所有从你的应用程序发出的请求中

你用 Istio 服务网格得到的跟踪只在服务边界捕获。为了了解应用程序的行为并排除故障,你需要通过创建额外的跨度(span)来正确检测你的应用程序。

要安装 Zipkin,我们可以使用 addons 文件夹中的 zipkin.yaml 文件。

[root@k8scloude1 extras]# pwd
/root/istio-1.14.3/samples/addons/extras

[root@k8scloude1 extras]# ls
prometheus-operator.yaml  prometheus_vm_tls.yaml  prometheus_vm.yaml  zipkin.yaml

[root@k8scloude1 extras]# kubectl apply -f /root/istio-1.14.3/samples/addons/extras/zipkin.yaml 
deployment.apps/zipkin created
service/tracing created
service/zipkin created

[root@k8scloude1 extras]# vim zipkin.yaml 

#所需的镜像为openzipkin/zipkin-slim:2.23.14
[root@k8scloude1 extras]# grep image zipkin.yaml 
          image: openzipkin/zipkin-slim:2.23.14

#可以看到zipkin运行起来了
[root@k8scloude1 extras]# kubectl get pod -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-6c5dc6df7c-cnc9w                1/1     Running   1          10h
istio-egressgateway-58949b7c84-k7v6f    1/1     Running   7          10d
istio-ingressgateway-75bc568988-69k8j   1/1     Running   5          3d4h
istiod-84d979766b-kz5sd                 1/1     Running   12         10d
prometheus-699b7cc575-dx6rp             2/2     Running   6          2d3h
zipkin-6cd5d58bcc-hxngj                 1/1     Running   0          2m25s

我们可以通过运行 getmesh istioctl dashboard zipkin 来打开 Zipkin 仪表板。

我们使用另外一种方法:

#可以看到zipkin这个service的类型为ClusterIP,外部环境访问不了
[root@k8scloude1 extras]# kubectl get service -n istio-system 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE
grafana                NodePort       10.100.151.232   <none>            3000:31092/TCP                                                               10h
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               10d
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   10d
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        10d
prometheus             NodePort       10.101.141.187   <none>            9090:31755/TCP                                                               2d3h
tracing                ClusterIP      10.101.30.10     <none>            80/TCP                                                                       2m50s
zipkin                 ClusterIP      10.104.85.78     <none>            9411/TCP                                                                     2m50s

#修改zipkin这个service的类型为NodePort,这样外部环境就可以访问zipkin了
#把type: ClusterIP 修改为 type: NodePort即可
[root@k8scloude1 extras]# kubectl edit service zipkin -n istio-system 
service/zipkin edited

#现在zipkin这个service的类型为NodePort,浏览器输入物理机ip:30350即可访问zipkin网页了
[root@k8scloude1 extras]# kubectl get service -n istio-system 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE
grafana                NodePort       10.100.151.232   <none>            3000:31092/TCP                                                               10h
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               10d
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   10d
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        10d
prometheus             NodePort       10.101.141.187   <none>            9090:31755/TCP                                                               2d3h
tracing                ClusterIP      10.101.30.10     <none>            80/TCP                                                                       4m42s
zipkin                 NodePort       10.104.85.78     <none>            9411:30350/TCP                                                               4m42s       

k8scloude1机器的地址为192.168.110.130,我们可以在浏览器中打开 http://192.168.110.130:30350,进入 zipkin,zipkin首页如下:

image-20221003225731647

在用户界面上,我们可以选择跟踪查询的标准。点击按钮,从下拉菜单中选择 serviceName

image-20221003225904030

然后选择 customers.default service,点击搜索按钮(或按回车键),就可以搜索到 trace 信息。

image-20221027180144431

我们可以点击个别 trace 来深入挖掘不同的跨度。详细的视图将显示服务之间的调用时间,以及请求的细节,如方法、协议、状态码等。由于我们只有一个服务在运行(Nginx),所以你不会看到很多细节。稍后,我们将回到 Zipkin,更详细地探索这些 trace。

image-20221027180315380

八.Kiali

Kiali 是一个基于 Istio 的服务网格的管理控制台。它提供了仪表盘、可观察性,并让我们通过强大的配置和验证能力来操作网格。它通过推断流量拓扑来显示服务网格,并显示网格的健康状况。Kiali 提供了详细的指标,强大的验证,Grafana 访问,以及与 Jaeger 的分布式追踪的强大集成

要安装 Kiali,请使用 addons 文件夹中的 kiali.yaml 文件:

[root@k8scloude1 ~]# cd istio-1.14.3/samples/addons/

[root@k8scloude1 addons]# ls
extras  grafana.yaml  jaeger.yaml  kiali.yaml  prometheus.yaml  README.md

[root@k8scloude1 addons]# pwd
/root/istio-1.14.3/samples/addons

[root@k8scloude1 addons]# vim kiali.yaml 

#所需镜像为quay.io/kiali/kiali:v1.50
[root@k8scloude1 addons]# grep image kiali.yaml 
      image_digest: ""
      image_name: quay.io/kiali/kiali
      image_pull_policy: Always
      image_pull_secrets: []
      image_version: v1.50
      - image: "quay.io/kiali/kiali:v1.50"
        imagePullPolicy: Always
        
#创建kiali
[root@k8scloude1 addons]# kubectl apply -f /root/istio-1.14.3/samples/addons/kiali.yaml 
serviceaccount/kiali created
configmap/kiali created
clusterrole.rbac.authorization.k8s.io/kiali-viewer created
clusterrole.rbac.authorization.k8s.io/kiali created
clusterrolebinding.rbac.authorization.k8s.io/kiali created
role.rbac.authorization.k8s.io/kiali-controlplane created
rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
service/kiali created
deployment.apps/kiali created

[root@k8scloude1 addons]# kubectl get pod -n istio-system 
NAME                                    READY   STATUS    RESTARTS   AGE
grafana-6c5dc6df7c-cnc9w                1/1     Running   2          27h
istio-egressgateway-58949b7c84-k7v6f    1/1     Running   8          10d
istio-ingressgateway-75bc568988-69k8j   1/1     Running   6          3d21h
istiod-84d979766b-kz5sd                 1/1     Running   14         10d
kiali-5db6985fb5-8t77v                  1/1     Running   0          3m25s
prometheus-699b7cc575-dx6rp             2/2     Running   8          2d21h
zipkin-6cd5d58bcc-hxngj                 1/1     Running   1          17h

注意,如果你看到任何错误,例如在版本 monitoringkiali.io/v1alpha 中没有匹配的 MonitoringDashboard,请重新运行 kubectl apply 命令。问题是,在安装 CRD(自定义资源定义)和由该 CRD 定义的资源时,可能存在一个匹配条件。

我们可以用 getmesh istioctl dashboard kiali 打开 Kiali。

我们使用另外一种方法:

#可以看到kiali这个service的类型为ClusterIP,外部环境访问不了
[root@k8scloude1 addons]# kubectl get service -n istio-system 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE
grafana                NodePort       10.100.151.232   <none>            3000:31092/TCP                                                               27h
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               10d
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   10d
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        10d
kiali                  ClusterIP      10.109.42.120    <none>            20001/TCP,9090/TCP                                                           7m42s
prometheus             NodePort       10.101.141.187   <none>            9090:31755/TCP                                                               2d21h
tracing                ClusterIP      10.101.30.10     <none>            80/TCP                                                                       17h
zipkin                 NodePort       10.104.85.78     <none>            9411:30350/TCP                                                               17h
#修改kiali这个service的类型为NodePort,这样外部环境就可以访问kiali了
#把type: ClusterIP 修改为 type: NodePort即可 
[root@k8scloude1 addons]# kubectl edit service kiali -n istio-system 
service/kiali edited

#现在kiali这个service的类型为NodePort,浏览器输入物理机ip:30754即可访问kiali网页了
[root@k8scloude1 addons]# kubectl get service -n istio-system 
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                      AGE
grafana                NodePort       10.100.151.232   <none>            3000:31092/TCP                                                               27h
istio-egressgateway    ClusterIP      10.102.56.241    <none>            80/TCP,443/TCP                                                               10d
istio-ingressgateway   LoadBalancer   10.107.131.65    192.168.110.190   15021:30093/TCP,80:32126/TCP,443:30293/TCP,31400:30628/TCP,15443:30966/TCP   10d
istiod                 ClusterIP      10.103.37.59     <none>            15010/TCP,15012/TCP,443/TCP,15014/TCP                                        10d
kiali                  NodePort       10.109.42.120    <none>            20001:30754/TCP,9090:31573/TCP                                               8m42s
prometheus             NodePort       10.101.141.187   <none>            9090:31755/TCP                                                               2d21h
tracing                ClusterIP      10.101.30.10     <none>            80/TCP                                                                       17h
zipkin                 NodePort       10.104.85.78     <none>            9411:30350/TCP                                                               17h

k8scloude1机器的地址为192.168.110.130,我们可以在浏览器中打开 http://192.168.110.130:30754,进入 kiali,kiali首页如下:

image-20221004154635498

Kiali 可以生成一个像下图这样的服务图。

image-20221004155101009

该图向我们展示了服务的拓扑结构,并将服务的通信方式可视化。它还显示了入站和出站的指标,以及通过连接 Jaeger 和 Grafana(如果安装了)的追踪。图中的颜色代表服务网格的健康状况。红色或橙色的节点可能需要注意。组件之间的边的颜色代表这些组件之间的请求的健康状况。节点形状表示组件的类型,如服务、工作负载或应用程序。

节点和边的健康状况会根据用户的偏好自动刷新。该图也可以暂停以检查一个特定的状态,或回放以重新检查一个特定的时期。

Kiali 提供创建、更新和删除 Istio 配置的操作,由向导驱动。我们可以配置请求路由、故障注入、流量转移和请求超时,所有这些都来自用户界面。如果我们有任何现有的 Istio 配置已经部署,Kiali 可以验证它并报告任何警告或错误。

posted @ 2022-10-28 17:56  人生的哲理  阅读(2129)  评论(2编辑  收藏  举报