一、前言¶
在本章节中,我们将学习一些监控(Prometheus)、追踪(Zipkin)、数据可视化工具 (Grafana)和服务拓扑结构(Kiali)。(我们又学到了一款Zipkin的链路追踪组件,为什么没有用Skywalking呢?主要还是Istio原生未做支持)
为了让 Grafana 和 Kiali 工作,我们首先要安装 Prometheus 插件。
安装Prometheus, Grafana, Zipkin, Kiali 的 前提 是已经安装好了istio。
二、可观察性¶
上节课我们使用 sidecar 部署了应用,即 Envoy 代理会运行在应用实例旁边并拦截流量,同时这些代理还有一个功能就是:收集指标。
Envoy 代理收集的指标可以帮助我们获得系统状态的可见性。获得系统的这种可见性是 至关重要的,因为我们需要了解正在发生的事情,并授权运维人员对应用程序进行故障 排除、维护和优化。
Istio 生成三种类型的遥测数据,为网格中的服务提供可观察性:
- 指标度量(Metric)
- 分布式追踪
- 访问日志
三、指标¶
Istio 基于四个黄金信号生成指标:延迟、流量、错误和饱和度。
- 延迟:表示服务一个请求所需的时间。这个指标应该分成成功请求(如 HTTP 200) 和失败请求(如 HTTP 500)的延迟。
- 流量:是衡量对系统的需求有多大,它是以系统的具体指标来衡量的。例如,每秒 的 HTTP 请求,或并发会话,每秒的检索量,等等。
- 错误:用来衡量请求失败的比率(例如 HTTP 500)。
- 饱和度:衡量一个服务中最紧张的资源有多满。例如,线程池的利用率。
这些指标是在不同的层面上收集的,首先是最细的,即 Envoy 代理层面,然后是服务层面和控制平面的指标。
3.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 端点查看代理级指标。
3.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
3.3 控制平面度量¶
Istio 也会生成控制平面指标,用于监控 Istio 的控制平面,而不是用户服务。
输出的控制平面指标的完整列表可以在这里找到。
控制平面指标包括冲突的入站/出站监听器的数量、没有实例的集群数量、被拒绝或被忽略的配置等指标。
四、Prometheus¶
4.1 安装Prometheus¶
Prometheus 是一个开源的监控系统和时间序列数据库。Istio 使用 Prometheus 来记 录指标,跟踪 Istio 和网格中的应用程序的健康状况。
要安装 Prometheus,我们可以使用 Istio 安装包中 /samples/addons 文件夹中的示例安装。
#prometheus.yaml是安装prometheus的yaml文件
[root@master01 ~]# cd /root/10/istio-1.20.8/samples/addons/
[root@master01 addons]# ls
extras grafana.yaml jaeger.yaml kiali.yaml loki.yaml prometheus.yaml README.md
#可以看到安装prometheus需要用到两个镜像:jimmidyson/configmap-reload:v0.8.0和prom/prometheus:v2.41.0
[root@master01 addons]# grep -rni "image:" prometheus.yaml
466: image: "jimmidyson/configmap-reload:v0.8.0"
479: image: "prom/prometheus:v2.41.0"
#替换国外镜像为国内镜像
[root@master01 addons]# vim +466 prometheus.yaml
image: "registry.cn-hangzhou.aliyuncs.com/abroad_images/configmap-reload:v0.8.0"
[root@master01 addons]# vim +479 prometheus.yaml
image: "registry.cn-hangzhou.aliyuncs.com/abroad_images/prometheus:v2.41.0"
#验证
[root@master01 addons]# grep -rni "image:" prometheus.yaml
466: image: "registry.cn-hangzhou.aliyuncs.com/abroad_images/configmap-reload:v0.8.0"
479: image: "registry.cn-hangzhou.aliyuncs.com/abroad_images/prometheus:v2.41.0"
#安装prometheus
[root@master01 addons]# kubectl apply -f prometheus.yaml
#说明:如果出现这类报错信息The ClusterRoleBinding "prometheus" is invalid: roleRef: Invalid value: rbac.RoleRef{APIGroup:"rbac.authorization.k8s.io", Kind:"ClusterRole", Name:"prometheus"}: cannot change roleRef是因为之前环境导致,执行下面操作即可
[root@master01 addons]# kubectl delete clusterrolebinding prometheus
[root@master01 addons]# kubectl apply -f prometheus.yaml
#查看deploy
[root@master01 addons]# kubectl get deploy -n istio-system | grep prometheus
prometheus 1/1 1 1 7m20s
#验证
[root@master01 addons]# kubectl get pod -n istio-system -o wide | grep prometheus
prometheus-5495fb4564-jj46j 2/2 Running 0 7m45s 172.20.59.242 master02 <none> <none>
临时使用ingress进行服务的暴露
[root@master01 ~]# cd /root/10/istioyaml/
[root@master01 istioyaml]# vim prometheus-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: istio-system
name: prometheus-ingress
spec:
ingressClassName: nginx
rules:
- host: prometheus-istio.zhang-qing.com
http:
paths:
- pathType: Prefix
backend:
service:
name: prometheus
port:
number: 9090
path: /
# 应用
[root@master01 istioyaml]# kaf prometheus-ingress.yaml
# 验证
[root@master01 istioyaml]# kgi -n istio-system
NAME CLASS HOSTS ADDRESS PORTS AGE
prometheus-ingress nginx prometheus-istio.zhang-qing.com 10.0.0.11 80 64s
浏览器直接输入http://prometheus-istio.zhang-qing.com/进行访问

4.2 部署示例应用¶
为了看到一些请求和流量,我们将部署一个 Nginx 实例:
[root@master01 istioyaml]# kubectl create deployment nginx --image=hub.c.163.com/library/nginx:latest -n microservice
为了能够产生一些流量并访问 Nginx Pod,我们需要以某种方式让它可以被访问。
最简单的方法是将 Nginx 部署作为 Kubernetes NodePort服务公开:<以后可以使用 Istio 资源并通过 Istio 的入口网关暴露服务>
[root@master01 istioyaml]# kubectl expose deployment nginx --type=NodePort --name=nginxsvc --port=80 -n microservice
现在我们可以运行 kubectl get services ,查看 nginxsvc 服务:
[root@master01 10]# kubectl get service -n microservice
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginxsvc NodePort 192.168.47.67 <none> 80:31602/TCP 35s
这时只要访问任意node的 IP:31602,就可以访问Nginx服务。
[root@master01 10]# curl 10.0.0.60:31602
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
...
Prometheus 验证数据
输入 istio_requests_total 之后,点击Execute执行,就可以看到收集到的数据
早先有小伙伴问我的一个问题,如何基于应用层面的 request 指标数据做弹性的扩缩容,那么下面这个指标是不是就可以用起来了?

五、Grafana¶
5.1 安装Grafana¶
Grafana 是一个用于分析和监控的开放平台。Grafana 可以连接到各种数据源,并使用 图形、表格、热图等将数据可视化。
通过强大的查询语言,你可以定制现有的仪表盘并创建更高级的可视化。
通过 Grafana,我们可以监控 Istio 安装和服务网格中运行的应用程序的健康状况。 我们可以使用 grafana.yaml 来部署带有预配置仪表盘的 Grafana 示例安装。该 YAML 文件在 Istio 安装包的 /samples/addons 下。
确保在部署 Grafana 之前部署 Promeheus 插件,因为 Grafana 使用 Prometheus 作为其数据源。
运行下面的命令来部署 Grafana 和预配置的仪表盘:
[root@master01 ~]# cd /root/10/istio-1.20.8/samples/addons/
# 修改镜像为国内镜像
[root@master01 addons]# grep -rin "image:" grafana.yaml
149: image: "registry.cn-hangzhou.aliyuncs.com/github_images1024/grafana:9.5.5"
# 应用
[root@master01 addons]# kaf grafana.yaml
# 验证
[root@master01 addons]# kubectl get pod -n istio-system | grep grafana
grafana-5f9cfb6b57-k4ngj 1/1 Running 0 27s
临时再次通过ingress将服务暴露
[root@master01 ~]# cd /root/10/istioyaml/
[root@master01 istioyaml]# vim grafana-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: istio-system
name: grafana-ingress
spec:
ingressClassName: nginx
rules:
- host: grafana-istio.zhang-qing.com
http:
paths:
- pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
path: /
# 应用
[root@master01 istioyaml]# kaf grafana-ingress.yaml
验证:
[root@master01 istioyaml]# kgi -nistio-system | grep grafana
grafana-ingress nginx grafana-istio.zhang-qing.com 10.0.0.11 80 53s
访问验证:
浏览器输入http://grafana-istio.zhang-qing.com/,账号密码都为admin

依次点击【Home】-【Dashboards】,选择istio 文件夹,查看已安装的仪表盘,如下图所示。

Istio Grafana 安装时预配置了以下仪表盘:
Istio 控制平面仪表盘(Istio Control Plane Dashboard)
Istio Control Plane Dashboard 仪表盘将向我们展示 Istio 控制平面的健康和性能。控制平面的资源使用情况(内存、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分布式追踪¶
Zipkin 是一个分布式追踪系统。我们可以 轻松地监控服务网格中发生的分布式事务,发 现任何性能或延迟问题。
为了让我们的服务参与分布式追踪,我们需要在进行任何下游服务调用时传播服务的 HTTP 头信息。尽管所有的请求都要经过 Istio sidecar,但 Istio 没有办法将出站请求与产生这些请求的入站请求联系起来。通过在应用程序中传播相关的头信息可以帮助 Zipkin 将这些跟踪信息拼接起来。
Istio 依赖于 B3 跟踪头(以 x-b3 开头的 header)和 Envoy 生成的请求 ID( xrequest-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@master01 ~]# cd /root/10/istio-1.20.8/samples/addons/extras/
# 替换镜像为国内镜像
[root@master01 extras]# grep -rin "image:" zipkin.yaml
20: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/zipkin-slim:2.23.14
# 应用
[root@master01 extras]# kubectl apply -f zipkin.yaml
#可以看到zipkin运行起来了
[root@master01 extras]# kubectl get pod -n istio-system | grep zipkin
zipkin-697d567d65-2rdcm 1/1 Running 0 39s
继续临时再次通过ingress将服务暴露:
[root@master01 extras]# vim zipkin-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: istio-system
name: zipkin-ingress
spec:
ingressClassName: nginx
rules:
- host: zipkin-istio.zhang-qing.com
http:
paths:
- pathType: Prefix
backend:
service:
name: zipkin
port:
number: 9411
path: /
# 应用
[root@master01 extras]# kaf zipkin-ingress.yaml
验证:
[root@master01 extras]# kgi -nistio-system | grep zipkin
zipkin-ingress nginx zipkin-istio.zhang-qing.com 10.0.0.11 80 80s
访问验证:

七、Kiali¶
Kiali 的 Graph 数据主要来自两个来源:Prometheus 和 Istio 本身的遥测数据
Prometheus:Prometheus 是一个开源监控和警报工具,它用于收集和存储 Istio 服务 网格中的指标数据。Istio 使用 Envoy 代理收集遥测数据,这些数据随后被 Prometheus 抓取和存储。Kiali 使用这些 Prometheus 数据来生成服务之间的流量、错误率、延迟等指标。
Istio 遥测数据:Istio 服务网格生成的遥测数据包括请求、响应、延迟以及 Envoy 代理 的其他性能指标。这些数据由 Istio 组件(例如 Mixer 和 Pilot)以及 Envoy 代理本身生 成。Kiali 从这些遥测数据中获取服务拓扑信息,以创建服务之间的依赖关系图。
Kiali 将这两个数据源的信息整合在一起,生成 Graph,它展示了服务网格的拓扑结构、 服务之间的流量以及其他性能指标。这有助于用户更好地理解服务之间的依赖关系,发 现潜在的性能问题,并优化服务网格配置。
要安装 Kiali,请使用 addons 文件夹中的 kiali.yaml 文件:
[root@master01 ~]# cd /root/10/istio-1.20.8/samples/addons/
[root@master01 addons]# ls
extras grafana.yaml jaeger.yaml kiali.yaml loki.yaml prometheus.yaml README.md
#替换镜像为国内镜像
[root@master01 addons]# grep -rin "image:" kiali.yaml
473: - image: "registry.cn-hangzhou.aliyuncs.com/github_images1024/kiali:v1.76"
#创建kiali
[root@master01 addons]# kubectl apply -f kiali.yaml
#验证
[root@master01 addons]# kubectl get pod -n istio-system | grep kiali
kiali-6b4b5bb675-2jnwt 1/1 Running 0 33s
注意,如果你看到任何错误,例如在版本 monitoringkiali.io/v1alpha 中没有匹配 的MonitoringDashboard,请重新运行 kubectl apply 命令。问题是,在安装 CRD(自定义资源定义)和由该 CRD 定义的资源时,可能存在一个匹配条件。
继续临时再次通过ingress将服务暴露:
# 编辑ingress文件
[root@master01 addons]# vim kiali-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: istio-system
name: kiali-ingress
spec:
ingressClassName: nginx
rules:
- host: kiali-istio.zhang-qing.com
http:
paths:
- pathType: Prefix
backend:
service:
name: kiali
port:
number: 20001
path: /
# 应用
[root@master01 addons]# kaf kiali-ingress.yaml
验证:
[root@master01 addons]# kgi -nistio-system | grep kiali-ingress
kiali-ingress nginx kiali-istio.zhang-qing.com 10.0.0.11 80 52s
访问验证:

Kiali 提供创建、更新和删除 Istio 配置的操作,由向导驱动。我们可以配置请求路由、故障注入、流量转移和请求超时,所有这些都来自用户界面。如果我们有任何现有的Istio 配置已经部署,Kiali 可以验证它并报告任何警告或错误。
八、监控istio相关资源(补充,课程未提及)¶
8.1 说明¶
本节需要使用monitor命名空间下的prometheus和grafana来监控istio-system命名空间下的的istio相关服务
# 查看grafana和prometheus
[root@master01 7]# kgp -n monitor | grep grafana
grafana-core-54c48855c9-vvbp5 1/1 Running 4 (12h ago) 4d23h
[root@master01 7]#
[root@master01 7]# kgp -n monitor | grep prometheus
prometheus-64dc78b55b-mznxx 2/2 Running 2 (21h ago) 22h
prometheus-alert-center-7f676bdc48-s6bfs 1/1 Running 18 (12h ago) 9d
# 查看istio相关服务
[root@master01 7]# kgp -n istio-system
NAME READY STATUS RESTARTS AGE
grafana-5f9cfb6b57-njkwv 1/1 Running 8 (21h ago) 8d
istio-eastwestgateway-7989cd5655-dx5q9 1/1 Running 7 (12h ago) 7d21h
istio-egressgateway-7cbb4d6cff-hfvj7 1/1 Running 8 (12h ago) 8d
istio-ingressgateway-7f8c8c6db7-wq4qn 1/1 Running 8 (12h ago) 8d
istiod-77cc598c96-5fvzp 1/1 Running 8 (12h ago) 8d
kiali-6b4b5bb675-l6msb 1/1 Running 8 (21h ago) 8d
prometheus-5495fb4564-w8nfm 2/2 Running 17 (21h ago) 8d
zipkin-697d567d65-s9g2x 1/1 Running 87 (14m ago) 8d
8.2 配置监控¶
修改prometheus的静态配置文件
# 添加如下内容
[root@master01 7]# vim prometheus-config.yaml
# -------------------------------
# 1. Istio 控制平面监控(istiod)
# -------------------------------
- job_name: 'istio-control-plane'
kubernetes_sd_configs:
- role: endpoints
# 限定在 istio-system 命名空间
namespaces:
names: ["istio-system"]
metrics_path: /metrics
relabel_configs:
# 仅保留名为 istiod 的服务端点
- source_labels: [__meta_kubernetes_service_name]
action: keep
regex: 'istiod'
# 替换端口为 15014(istiod 的 metrics 端口)
- source_labels: [__address__]
action: replace
regex: ([^:]+)(:\d+)?
target_label: __address__
replacement: ${1}:15014
# 添加统一标签标识(可选)
- source_labels: []
target_label: job_type
replacement: control-plane
# -------------------------------
# 2. Istio 数据平面监控(Envoy 边车)
# -------------------------------
- job_name: 'istio-dataplane'
kubernetes_sd_configs:
- role: pod
# 监控所有命名空间中的 Pod(自动发现注入边车的应用)
namespaces:
names: []
metrics_path: /stats/prometheus
relabel_configs:
# 仅保留带有 istio-proxy 容器的 Pod
- source_labels: [__meta_kubernetes_pod_container_name]
action: keep
regex: 'istio-proxy'
# 替换端口为 15090(Envoy 的 Prometheus 端口)
- source_labels: [__address__]
action: replace
regex: ([^:]+)(:\d+)?
target_label: __address__
replacement: ${1}:15090
# 添加命名空间标签(可选)
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
# 添加统一标签标识(可选)
- source_labels: []
target_label: job_type
replacement: data-plane
# -------------------------------
# 3. Istio 网关监控(如 istio-ingressgateway)
# -------------------------------
- job_name: 'istio-gateway'
kubernetes_sd_configs:
- role: endpoints
# 限定在 istio-system 命名空间(假设网关部署在此)
namespaces:
names: ["istio-system"]
metrics_path: /stats/prometheus
relabel_configs:
# 仅保留名为 istio-ingressgateway 的服务端点
- source_labels: [__meta_kubernetes_service_name]
action: keep
regex: 'istio-ingressgateway'
# 替换端口为 15090(Envoy 的 Prometheus 端口)
- source_labels: [__address__]
action: replace
regex: ([^:]+)(:\d+)?
target_label: __address__
replacement: ${1}:15090
# 添加统一标签标识(可选)
- source_labels: []
target_label: job_type
replacement: gateway
# 完整配置文件
[root@master01 7]# cat prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: monitor
data:
prometheus.yml: |
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "kubernetes"
############ 添加配置 Aertmanager 服务器地址 ###################
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
############ 数据采集job ###################
scrape_configs:
# -------------------------------
# 1. Istio 控制平面监控(istiod)
# -------------------------------
- job_name: 'istio-control-plane'
kubernetes_sd_configs:
- role: endpoints
# 限定在 istio-system 命名空间
namespaces:
names: ["istio-system"]
metrics_path: /metrics
relabel_configs:
# 仅保留名为 istiod 的服务端点
- source_labels: [__meta_kubernetes_service_name]
action: keep
regex: 'istiod'
# 替换端口为 15014(istiod 的 metrics 端口)
- source_labels: [__address__]
action: replace
regex: ([^:]+)(:\d+)?
target_label: __address__
replacement: ${1}:15014
# 添加统一标签标识(可选)
- source_labels: []
target_label: job_type
replacement: control-plane
# -------------------------------
# 2. Istio 数据平面监控(Envoy 边车)
# -------------------------------
- job_name: 'istio-dataplane'
kubernetes_sd_configs:
- role: pod
# 监控所有命名空间中的 Pod(自动发现注入边车的应用)
namespaces:
names: []
metrics_path: /stats/prometheus
relabel_configs:
# 仅保留带有 istio-proxy 容器的 Pod
- source_labels: [__meta_kubernetes_pod_container_name]
action: keep
regex: 'istio-proxy'
# 替换端口为 15090(Envoy 的 Prometheus 端口)
- source_labels: [__address__]
action: replace
regex: ([^:]+)(:\d+)?
target_label: __address__
replacement: ${1}:15090
# 添加命名空间标签(可选)
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
# 添加统一标签标识(可选)
- source_labels: []
target_label: job_type
replacement: data-plane
# -------------------------------
# 3. Istio 网关监控(如 istio-ingressgateway)
# -------------------------------
- job_name: 'istio-gateway'
kubernetes_sd_configs:
- role: endpoints
# 限定在 istio-system 命名空间(假设网关部署在此)
namespaces:
names: ["istio-system"]
metrics_path: /stats/prometheus
relabel_configs:
# 仅保留名为 istio-ingressgateway 的服务端点
- source_labels: [__meta_kubernetes_service_name]
action: keep
regex: 'istio-ingressgateway'
# 替换端口为 15090(Envoy 的 Prometheus 端口)
- source_labels: [__address__]
action: replace
regex: ([^:]+)(:\d+)?
target_label: __address__
replacement: ${1}:15090
# 添加统一标签标识(可选)
- source_labels: []
target_label: job_type
replacement: gateway
########## Ingress 监控配置 ##########
- job_name: 'ingress-nginx-endpoints'
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- ingress-nginx
relabel_configs:
- source_labels: [__meta_kubernetes_pod_container_port_number]
action: keep
regex: "10254"
########## Argocd 监控配置 ##########
- job_name: 'argocd-metrics'
static_configs:
- targets: ['argocd-metrics.argocd.svc.cluster.local:8082']
- job_name: 'argocd-server-metrics'
static_configs:
- targets: ['argocd-server-metrics.argocd.svc.cluster.local:8083']
- job_name: 'argocd-repo-server-metrics'
static_configs:
- targets: ['argocd-repo-server.argocd.svc.cluster.local:8084']
########## prometheus 监控配置 ##########
- job_name: prometheus
static_configs:
- targets: ['127.0.0.1:9090']
labels:
instance: prometheus
########## apisix 监控配置 ##########
- job_name: "apisix"
scrape_interval: 15s
metrics_path: "/apisix/prometheus/metrics"
static_configs:
- targets: [metrics.zhang-qing.com]
########## minio 监控配置 ##########
- job_name: minio-job
bearer_token: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJwcm9tZXRoZXVzIiwic3ViIjoiSEo1WDhSM0ZXM0dSQ1laNU5YV1ciLCJleHAiOjQ4OTg3MDgzNDd9.5xyr6M23J_bEgsR3bcJnz02G_3V6fzbsQpIFIxpxTRpr_KbgaaaD7p6MCeN5aF69Y9dQmE-8K14XAFnGjuVi7w
metrics_path: /minio/v2/metrics/cluster
scheme: http
static_configs:
- targets: [s3.zhang-qing.com]
########## kube-apiserver 监控配置 ##########
- job_name: kube-apiserver
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name]
action: keep
regex: default;kubernetes
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: service
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## kube-controller-manager 监控配置 ##########
- job_name: 'kube-controller-manager'
# 使用 Kubernetes Pod 发现机制
kubernetes_sd_configs:
- role: pod
# 强制使用 HTTPS 协议
scheme: https
# TLS 配置(测试环境跳过验证)
tls_config:
insecure_skip_verify: true
# 使用 ServiceAccount 的 Token 认证
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
# 保留标签为 component=kube-controller-manager 的 Pod
- source_labels: [__meta_kubernetes_pod_label_component]
regex: kube-controller-manager
action: keep
# 重写目标地址为 Pod IP + 10257 端口
- source_labels: [__meta_kubernetes_pod_ip]
regex: (.+)
target_label: __address__
replacement: "${1}:10257"
# 强制使用 HTTPS 协议(冗余但明确)
- source_labels: []
regex: .*
target_label: __scheme__
replacement: https
# 附加元数据标签
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: service
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## kube-scheduler 监控配置 ##########
- job_name: 'kube-scheduler'
kubernetes_sd_configs:
- role: pod
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_component]
regex: kube-scheduler
action: keep
- source_labels: [__meta_kubernetes_pod_ip]
regex: (.+)
target_label: __address__
replacement: "${1}:10259"
- source_labels: []
regex: .*
target_label: __scheme__
replacement: https
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: service
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## kube-state-metrics 监控配置 ##########
- job_name: kube-state-metrics
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_name]
regex: kube-state-metrics
action: keep
- source_labels: [__meta_kubernetes_pod_ip]
regex: (.+)
target_label: __address__
replacement: ${1}:8080
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: service
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## coredns 监控配置 ##########
- job_name: coredns
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels:
- __meta_kubernetes_service_label_k8s_app
regex: kube-dns
action: keep
- source_labels: [__meta_kubernetes_pod_ip]
regex: (.+)
target_label: __address__
replacement: ${1}:9153
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: service
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## etcd 监控配置 ##########
- job_name: etcd
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels:
- __meta_kubernetes_pod_label_component
regex: etcd
action: keep
- source_labels: [__meta_kubernetes_pod_ip]
regex: (.+)
target_label: __address__
replacement: ${1}:2381
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## kubelet 监控配置 ##########
- job_name: kubelet
metrics_path: /metrics/cadvisor
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## k8s-node 监控配置 ##########
- job_name: k8s-nodes
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- source_labels: [__meta_kubernetes_endpoints_name]
action: replace
target_label: endpoint
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
########## DNS 监控配置 ##########
- job_name: "kubernetes-dns"
metrics_path: /probe # 不是metrics,是probe
params:
module: [dns_tcp] # 使用DNS TCP模块
static_configs:
- targets:
- kube-dns.kube-system:53 #不要省略端口号
- 8.8.4.4:53
- 8.8.8.8:53
- 223.5.5.5:53
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter.monitor:9115 # 服务地址,和上面的 Service 定义保持一致
########## ICMP 监控配置 ##########
- job_name: icmp-status
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets:
- 10.0.0.61
labels:
group: icmp
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter.monitor:9115
########## HTTP 监控配置 ##########
- job_name: 'kubernetes-services'
metrics_path: /probe
params:
module: ## 使用HTTP_GET_2xx与HTTP_GET_3XX模块
- "http_get_2xx"
- "http_get_3xx"
kubernetes_sd_configs: ## 使用Kubernetes动态服务发现,且使用Service类型的发现
- role: service
relabel_configs: ## 设置只监测Kubernetes Service中Annotation里配置了注解prometheus.io/http_probe: true的service
- action: keep
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_http_probe]
regex: "true"
- action: replace
source_labels:
- "__meta_kubernetes_service_name"
- "__meta_kubernetes_namespace"
- "__meta_kubernetes_service_annotation_prometheus_io_http_probe_port"
- "__meta_kubernetes_service_annotation_prometheus_io_http_probe_path"
target_label: __param_target
regex: (.+);(.+);(.+);(.+)
replacement: $1.$2:$3$4
- target_label: __address__
replacement: blackbox-exporter.monitor:9115 ## BlackBox Exporter 的 Service 地址
- source_labels: [__param_target]
target_label: instance
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
########## TCP 监控配置 ##########
- job_name: "service-tcp-probe"
scrape_interval: 1m
metrics_path: /probe
# 使用blackbox exporter配置文件的tcp_connect的探针
params:
module: [tcp_connect]
kubernetes_sd_configs:
- role: service
relabel_configs:
# 保留prometheus.io/scrape: "true"和prometheus.io/tcp-probe: "true"的service
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape, __meta_kubernetes_service_annotation_prometheus_io_tcp_probe]
action: keep
regex: true;true
# 将原标签名__meta_kubernetes_service_name改成service_name
- source_labels: [__meta_kubernetes_service_name]
action: replace
regex: (.*)
target_label: service_name
# 将原标签名__meta_kubernetes_service_name改成service_name
- source_labels: [__meta_kubernetes_namespace]
action: replace
regex: (.*)
target_label: namespace
# 将instance改成 `clusterIP:port` 地址
- source_labels: [__meta_kubernetes_service_cluster_ip, __meta_kubernetes_service_annotation_prometheus_io_http_probe_port]
action: replace
regex: (.*);(.*)
target_label: __param_target
replacement: $1:$2
- source_labels: [__param_target]
target_label: instance
# 将__address__的值改成 `blackbox-exporter.monitor:9115`
- target_label: __address__
replacement: blackbox-exporter.monitor:9115
########## Ingress 监控配置 ##########
- job_name: 'blackbox-k8s-ingresses'
scrape_interval: 30s
scrape_timeout: 10s
metrics_path: /probe
params:
module: [http_get_2xx] # 使用定义的http模块
kubernetes_sd_configs:
- role: ingress # ingress 类型的服务发现
relabel_configs:
# 只有ingress的annotation中配置了 prometheus.io/http_probe=true 的才进行发现
- source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_http_probe]
action: keep
regex: true
- source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
regex: (.+);(.+);(.+)
replacement: ${1}://${2}${3}
target_label: __param_target
- target_label: __address__
replacement: blackbox-exporter.monitor:9115
- source_labels: [__param_target]
target_label: instance
- action: labelmap
regex: __meta_kubernetes_ingress_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_ingress_name]
target_label: kubernetes_name
########## 外部域名 监控配置 ##########
- job_name: "blackbox-external-website"
scrape_interval: 30s
scrape_timeout: 15s
metrics_path: /probe
params:
module: [http_get_2xx]
static_configs:
- targets:
- https://www.baidu.com # 改为公司对外服务的域名
- https://www.jd.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter.monitor:9115
########## 云上ECS 监控配置 ##########
- job_name: 'other-ECS'
static_configs:
- targets: ['101.201.68.158:9100']
labels:
hostname: 'test-node-exporter'
########## 进程 监控配置 ##########
- job_name: 'process-exporter'
static_configs:
- targets: ['10.0.0.62:9256']
########## Mysql 监控配置 ##########
- job_name: 'mysql-exporter'
static_configs:
- targets: ['10.0.0.62:9104']
########## Consul 监控配置 ##########
- job_name: consul
honor_labels: true
metrics_path: /metrics
scheme: http
consul_sd_configs: #基于consul服务发现的配置
- server: 10.0.0.62:18500 #consul的监听地址
services: [] #匹配consul中所有的service
relabel_configs: #relabel_configs下面都是重写标签相关配置
- source_labels: ['__meta_consul_tags'] #将__meta_consul_tags标签的至赋值给product
target_label: 'servername'
- source_labels: ['__meta_consul_dc'] #将__meta_consul_dc的值赋值给idc
target_label: 'idc'
- source_labels: ['__meta_consul_service']
regex: "consul" #匹配为"consul"的service
action: drop #执行的动作为删除
############ 指定告警规则文件路径位置 ###################
rule_files:
- /etc/prometheus/rules/*.rules
8.3 监控生效¶
重新加载配置文件
[root@master01 7]# kaf prometheus-config.yaml
热加载
[root@master01 7]# curl -XPOST http://prometheus.zhang-qing.com/-/reload
8.4 配置Grafana模板¶
| 仪表盘名称 | Grafana ID | 用途 |
|---|---|---|
| Istio Service Dashboard | 7636 | 单个服务的详细指标(HTTP/gRPC/TCP 流量) |
| Istio Control Plane | 7645 | 监控 Istiod(配置推送、资源使用、证书状态等) |
| Istio Mesh Dashboard | 7639 | 服务网格整体监控(请求量、错误率、延迟等) |
| Istio Workload Dashboard | 7630 | 工作负载(Pod/Deployment)级别的边车性能指标(CPU/内存、请求流量等) |