一、前言

在本章节中,我们将学习一些监控(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/进行访问

Day10-服务治理-图6

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 指标数据做弹性的扩缩容,那么下面这个指标是不是就可以用起来了?

Day10-服务治理-图7

五、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

image-20250417081712473

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

image-20250417082132707

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

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

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

Day10-服务治理-图9

Istio 网格仪表盘(Istio Mesh Dashboard)

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

Istio 性能仪表盘(Istio Performance Dashboard)

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

Day10-服务治理-图10

Istio 服务仪表盘(Istio Service Dashboard)

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

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

Day10-服务治理-图11

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

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

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

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

Day10-服务治理-图12

六、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

访问验证:

image-20250417083603745

七、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

访问验证:

Day10-服务治理-图15

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/内存、请求流量等)