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界面
经典UI界面如下:
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执行,就可以看到收集到的数据
下面是一个来自 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首页如下:
点击搜索框和 istio 文件夹,查看已安装的仪表盘,如下图所示。
Istio Grafana 安装时预配置了以下仪表盘:
Istio 控制平面仪表盘(Istio Control Plane Dashboard)
从 Istio 控制平面仪表盘,我们可以监控 Istio 控制平面的健康和性能。
Istio Control Plane Dashboard 仪表盘将向我们展示控制平面的资源使用情况(内存、CPU、磁盘、Go routines),以及关于 Pilot、Envoy 和 Webhook 的信息。
Istio 网格仪表盘(Istio Mesh Dashboard)
网格仪表盘为我们提供了在网格中运行的所有服务的概览。仪表盘包括全局请求量、成功率以及 4xx 和 5xx 响应的数量。
Istio 性能仪表盘(Istio Performance Dashboard)
性能仪表盘向我们展示了 Istio 主要组件在稳定负载下的资源利用率。
Istio 服务仪表盘(Istio Service Dashboard)
服务仪表盘允许我们在网格中查看服务的细节。
我们可以获得关于请求量、成功率、持续时间的信息,以及显示按来源和响应代码、持续时间和大小的传入请求的详细图表。
Istio Wasm 扩展仪表盘(Istio Wasm Extension Dashboard)
Istio Wasm 扩展仪表盘显示与 WebAssembly 模块有关的指标。从这个仪表盘,我们可以监控活动的和创建的 Wasm 虚拟机,关于获取删除 Wasm 模块和代理资源使用的数据。
Istio 工作负载仪表盘(Istio Workload Dashboard)
这个仪表盘为我们提供了一个工作负载的详细指标分类。
七.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 只能在边缘收集跨度。我们要负责在每个应用程序中生成任何额外的跨度,并确保我们在调用其他服务时转发追踪头信息。这样一来,各个跨度就可以正确地关联到一个单一的追踪中。
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首页如下:
在用户界面上,我们可以选择跟踪查询的标准。点击按钮,从下拉菜单中选择 serviceName
然后选择 customers.default
service,点击搜索按钮(或按回车键),就可以搜索到 trace 信息。
我们可以点击个别 trace 来深入挖掘不同的跨度。详细的视图将显示服务之间的调用时间,以及请求的细节,如方法、协议、状态码等。由于我们只有一个服务在运行(Nginx),所以你不会看到很多细节。稍后,我们将回到 Zipkin,更详细地探索这些 trace。
八.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首页如下:
Kiali 可以生成一个像下图这样的服务图。
该图向我们展示了服务的拓扑结构,并将服务的通信方式可视化。它还显示了入站和出站的指标,以及通过连接 Jaeger 和 Grafana(如果安装了)的追踪。图中的颜色代表服务网格的健康状况。红色或橙色的节点可能需要注意。组件之间的边的颜色代表这些组件之间的请求的健康状况。节点形状表示组件的类型,如服务、工作负载或应用程序。
节点和边的健康状况会根据用户的偏好自动刷新。该图也可以暂停以检查一个特定的状态,或回放以重新检查一个特定的时期。
Kiali 提供创建、更新和删除 Istio 配置的操作,由向导驱动。我们可以配置请求路由、故障注入、流量转移和请求超时,所有这些都来自用户界面。如果我们有任何现有的 Istio 配置已经部署,Kiali 可以验证它并报告任何警告或错误。