云平台监控-云原生环境Prometheus企业级监控实战

目录

[一、基于 Kubernetes 的 Prometheus 监控方案概述](#一、基于 Kubernetes 的 Prometheus 监控方案概述)

[1. 核心组件及功能](#1. 核心组件及功能)

[2. 监控流程详解](#2. 监控流程详解)

[3. 关键监控指标说明](#3. 关键监控指标说明)

[二、Prometheus 与相关组件部署](#二、Prometheus 与相关组件部署)

[1. 克隆项目代码](#1. 克隆项目代码)

[2. 安装 Prometheus Operator](#2. 安装 Prometheus Operator)

[3. 安装 Prometheus Stack](#3. 安装 Prometheus Stack)

[4. 查看容器运行状态](#4. 查看容器运行状态)

[三、ServiceMonitor 配置与应用](#三、ServiceMonitor 配置与应用)

[1. ServiceMonitor 作用与查看](#1. ServiceMonitor 作用与查看)

[2. ServiceMonitor 工作原理](#2. ServiceMonitor 工作原理)

[四、Grafana 配置与访问](#四、Grafana 配置与访问)

[1. 修改 Grafana Service 类型](#1. 修改 Grafana Service 类型)

[2. 访问 Grafana 并配置数据源](#2. 访问 Grafana 并配置数据源)

[3. 导入监控模板](#3. 导入监控模板)

[五、Prometheus 访问配置](#五、Prometheus 访问配置)

[1. 修改 Prometheus Service 类型](#1. 修改 Prometheus Service 类型)

[2. 访问 Prometheus 并查看监控目标](#2. 访问 Prometheus 并查看监控目标)

[六、监控 MySQL 数据库](#六、监控 MySQL 数据库)

[1. 部署 MySQL](#1. 部署 MySQL)

[2. 部署 MySQL Exporter](#2. 部署 MySQL Exporter)

[3. 配置 ServiceMonitor 监控 MySQL](#3. 配置 ServiceMonitor 监控 MySQL)

[4. 在 Grafana 中添加 MySQL 监控模板](#4. 在 Grafana 中添加 MySQL 监控模板)

七、对接钉钉报警

[1. 部署 DingTalk 组件](#1. 部署 DingTalk 组件)

[2. 修改 DingTalk 配置文件](#2. 修改 DingTalk 配置文件)

[3. 启动 DingTalk 服务](#3. 启动 DingTalk 服务)

[4. 配置 Alertmanager 对接 DingTalk](#4. 配置 Alertmanager 对接 DingTalk)

[5. 测试钉钉报警](#5. 测试钉钉报警)


一、基于 Kubernetes 的 Prometheus 监控方案概述

  1. 核心组件及功能
    在 Kubernetes 监控中,node - exporter + Prometheus + Grafana 组成的组合被广泛采用,各组件功能如下:

node - exporter:节点级指标导出工具,可采集节点的 CPU、内存、磁盘、网络等关键指标,并通过 Metrics 接口暴露数据,为监控提供基础数据来源。

Prometheus:集时间序列数据库与监控报警功能于一身,能够主动抓取 Cadvisor 和 node - exporter 暴露的 Metrics 接口数据,将容器和节点的时序数据存储起来,同时提供强大的 PromQL 查询语言用于监控分析和报警设置。
Grafana:专业的图表和 Dashboard 工具,可将 Prometheus 作为数据源,通过编写 PromQL 查询语句,以直观的图表形式展示 K8S 集群的 CPU 使用率、内存使用率、网络流量等监控指标。
2. 监控流程详解
Kubernetes 集群的监控流程清晰且有序,主要分为以下步骤:

数据采集层部署:在 Kubernetes 集群的每个节点上安装 Cadvisor 和 node - exporter,其中 Cadvisor 负责容器级指标采集,node - exporter 负责节点级指标采集。

数据存储与处理:部署 Prometheus,通过配置使其能够抓取 Cadvisor 和 node - exporter 的 Metrics 接口数据,将容器(containers)和节点(nodes)的时序数据妥善存储。
可视化展示:利用 Grafana 构建监控仪表盘,选择 Prometheus 作为数据源,通过编写 PromQL 查询语句,直观展示 K8S 集群的各类监控指标。
报警机制设置:根据监控需求设置 Prometheus 报警规则,当监控指标超过设定阈值时,及时发送报警信息,保障集群稳定运行。
在实际部署中,node - exporter 以 DaemonSet 形式运行,确保每个节点都能被监控;Prometheus 通过部署 Prometheus Operator 以 Deployment 形式运行,实现 Metrics 抓取和报警功能;Grafana 则通过部署 Grafana Operator 实现仪表盘展示。

3. 关键监控指标说明

Kubernetes 集群的监控指标众多,涵盖集群运行状态的各个方面,主要包括:

资源利用率指标:CPU 利用率(节点、Pod、容器级别)、内存利用率(节点、Pod、容器级别)、网络流量(节点、Pod、容器的收发包大小和带宽利用率)、磁盘使用率(节点磁盘空间使用情况)。

组件状态指标:Pod 状态(Running、Waiting、Succeeded、Failed 等状态数量)、节点状态(Ready、NotReady 和 Unreachable 状态数量)、容器重启次数(单个容器或 Pod 内所有容器的重启次数)。
核心组件性能指标:API 服务指标(Kubernetes API Server 的请求 LATENCY、请求 QPS、错误码数量等)、集群组件指标(etcd、kubelet、kube - proxy 等组件的运行指标)。
基于这些指标可设置相应报警规则,例如 CPU 利用率超过 80% 报警、内存利用率超过 90% 报警、Pod / 节点 NotReady 状态超过 10% 报警、API Server 请求 LATENCY 超过 200ms 报警等,具体阈值需根据集群大小和服务负载评估确定。

二、Prometheus 与相关组件部署

  1. 克隆项目代码
    首先需要从 Github 克隆 kube - prometheus 项目的指定分支,命令如下:

[root@k8s - master ~]# git clone -b release - 0.10 https://github.com/prometheus - operator/kube - prometheus.git

命令解释:git clone用于克隆远程仓库代码,-b release - 0.10指定克隆的分支为 release - 0.10,该分支包含了适配当前部署需求的稳定版本代码。

2. 安装 Prometheus Operator

Prometheus Operator 是 CoreOS 开源项目,提供了 Kubernetes 原生方式运行和管理 Prometheus 的能力,能自动创建、配置和管理 Prometheus 实例,并与 Kubernetes 服务发现机制集成,大幅简化部署工作量。
安装命令如下:

[root@k8s - master ~]# cd kube - prometheus/

root@k8s - master kube - prometheus\]# kubectl apply --server - side -f manifests/setup 命令解释:cd kube - prometheus/进入克隆下来的项目目录;kubectl apply用于应用 Kubernetes 资源配置,--server - side特性将配置逻辑从 kubectl 移至 API 服务器,解决所有权冲突问题,-f manifests/setup指定应用 setup 目录下的配置文件,完成 Prometheus Operator 的基础环境部署。 ### 若需删除 Prometheus Operator,可执行以下命令: ### kubectl delete --ignore - not - found=true -f manifests/setup 命令解释:kubectl delete用于删除 Kubernetes 资源,--ignore - not - found=true表示忽略未找到资源的错误,-f manifests/setup指定删除 setup 目录下配置文件对应的资源。 ### 3. 安装 Prometheus Stack 待 Operator 容器启动后,安装 Prometheus Stack,命令如下: ### \[root@k8s - master kube - prometheus\]# kubectl apply --server - side -f manifests/ 命令解释:-f manifests/指定应用 manifests 目录下的所有配置文件,该目录包含了 Prometheus、Alertmanager、Grafana 等全套监控告警组件的配置,即 kube - prometheus - stack 全家桶。 ### 删除 Prometheus Stack 的命令为: ### kubectl delete --ignore - not - found=true -f manifests/ -f manifests/setup 4. 查看容器运行状态 安装完成后,查看监控命名空间下的 Pod 状态,确认组件是否正常运行: ### \[root@k8s - master \~\]# kubectl get pod -n monitoring 正常情况下,会显示 alertmanager、blackbox - exporter、grafana、kube - state - metrics、node - exporter、prometheus 等组件的 Pod 处于 Running 状态,如下所示(部分示例): ### NAME READY STATUS RESTARTS AGE alertmanager - main - 0 2/2 Running 0 79m grafana - 5fc7f9f55d - x4gv4 1/1 Running 0 87m prometheus - k8s - 0 2/2 Running 0 79m 命令解释:kubectl get pod用于获取 Pod 列表,-n monitoring指定查看 monitoring 命名空间下的 Pod,通过 STATUS 列可确认 Pod 是否正常运行。 ### 三、ServiceMonitor 配置与应用 1. ServiceMonitor 作用与查看 ServiceMonitor 用于定义如何监控一组动态服务,通过标签选择器确定需要监控的 Service,实现服务的自动发现和监控配置,无需手动重新配置。 查看已有的 ServiceMonitor: ### \[root@k8s - master \~\]# kubectl get servicemonitors -A 执行后会列出 monitoring 命名空间下的各类 ServiceMonitor,如 alertmanager - main、coredns、grafana、kube - apiserver 等,示例如下: ### NAMESPACE NAME AGE monitoring alertmanager - main 2m9s monitoring coredns 2m6s monitoring grafana 2m7s 命令解释:kubectl get servicemonitors用于获取 ServiceMonitor 列表,-A表示查看所有命名空间下的 ServiceMonitor。 ### 2. ServiceMonitor 工作原理 为使 Prometheus 监控 Kubernetes 内的应用,需存在 Endpoints 对象(本质是 IP 地址列表),通常由 Service 对象通过标签选择器匹配 Pod 自动填充。Prometheus Operator 的 ServiceMonitor 会发现这些 Endpoints 对象,并配置 Prometheus 监控对应的 Pod,其 spec.endpoints 部分用于配置需要抓取指标的端口。 ### 四、Grafana 配置与访问 1. 修改 Grafana Service 类型 默认 Grafana 的 Service 类型为 ClusterIP,仅集群内部可访问,需修改为 NodePort 类型以便外部访问: ### \[root@k8s - master \~\]# kubectl edit svc grafana -n monitoring 命令解释:kubectl edit svc用于编辑 Service 配置,grafana为 Service 名称,-n monitoring指定命名空间。 ### 在编辑界面中,将type: ClusterIP修改为type: NodePort,并可指定 nodePort(如 32082),修改后保存退出。 ### 查看修改后的 Grafana Service 信息: ### \[root@k8s - master \~\]# kubectl get svc grafana -n monitoring 输出如下: ### NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE grafana NodePort 10.99.26.98 \ 3000:32082/TCP 28m 命令解释:kubectl get svc用于获取 Service 信息,可看到 TYPE 已变为 NodePort,以及映射的节点端口 32082。 ### 2. 访问 Grafana 并配置数据源 通过以下 URL 访问 Grafana:http://\:32082。 默认登录账号密码为 admin/admin,首次登录会提示修改密码,可选择跳过。 ### Grafana 默认已配置 Prometheus 数据源,若需手动配置: ### 单击首页左侧的 "Add your first data source"。 选择 Prometheus 数据源。 在 HTTP 配置项下的 URL 填写 "http://prometheus - k8s:9090"(prometheus - k8s 为 K8s 集群内的 Service 名),点击 "Save \& Test" 保存并测试。 3. 导入监控模板 导入 Node 节点监控模板步骤: ### 单击首页左侧 "+" 按钮,选择 "Import"。 输入模板 ID:13105,单击 "Load" 加载。 最后单击 "Import" 完成导入,即可在 Dashboard 查看 Node 节点监控数据。 其他常用模板可在 Grafana 官网(https://grafana.com/grafana/dashboards/)查找,如 Kubernetes Cluster(7249)、Docker and system monitoring(893)等。 ### 五、Prometheus 访问配置 1. 修改 Prometheus Service 类型 同样将 Prometheus 的 Service 类型修改为 NodePort: ### \[root@k8s - master \~\]# kubectl edit svc prometheus - k8s -n monitoring 在编辑界面中,将type: ClusterIP修改为type: NodePort,并指定 nodePort(如 9090 对应 32370)。 ### 查看修改后的 Prometheus Service 信息: ### \[root@k8s - master \~\]# kubectl get svc -n monitoring prometheus - k8s 输出示例: ### NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE prometheus - k8s NodePort 10.105.187.25 \ 9090:32370/TCP 33m 2. 访问 Prometheus 并查看监控目标 通过 URLhttp://\:32370访问 Prometheus。在 Prometheus 界面中,点击 "Status"-\>"Targets" 可查看所有监控目标的状态,确认各 ServiceMonitor 对应的目标是否正常(up 状态)。 ### Prometheus 告警规则有三个状态: ### inactive:未被触发。 pending:已触发但未达到 for 设定时间。 firing:触发且达到设定时间,会发送告警。 六、监控 MySQL 数据库 1. 部署 MySQL 在 Kubernetes 中部署 MySQL: ### \[root@k8s - master \~\]# kubectl create deploy mysql --image=mysql:5.7.23 命令解释:kubectl create deploy用于创建 Deployment,mysql为 Deployment 名称,--image=mysql:5.7.23指定使用的镜像及版本。 ### 设置 MySQL 密码: ### \[root@k8s - master \~\]# kubectl set env deploy/mysql MYSQL_ROOT_PASSWORD=pd123 命令解释:kubectl set env为 Deployment 设置环境变量,deploy/mysql指定 Deployment,MYSQL_ROOT_PASSWORD=pd123设置 root 用户密码。 ### 查看 MySQL Pod 状态: ### \[root@k8s - master \~\]# kubectl get pod 输出示例: ### NAME READY STATUS RESTARTS AGE mysql - 58dd9c4df4 - 17fgd 1/1 Running 0 2m53s 创建 Service 暴露 MySQL 端口: ### \[root@k8s - master \~\]# kubectl expose deployment mysql --type NodePort --port=3306 命令解释:kubectl expose deployment为 Deployment 创建 Service,--type NodePort指定 Service 类型,--port=3306指定服务端口。 ### 查看 MySQL Service 信息: ### \[root@k8s - master \~\]# kubectl get svc -l app=mysql 输出示例: ### NAME TYPE CLUSTER - IP EXTERNAL - IP PORT(S) AGE mysql NodePort 10.96.116.184 \ 3306:31152/TCP 37s 访问测试 MySQL: ### \[root@k8s - master \~\]# dnf -y install mysql # 安装MySQL客户端 \[root@k8s - master \~\]# mysql -u root -ppwd123 -h 192.168.207.137 -P31152 # 连接测试,IP为K8S节点IP,端口为映射的NodePort 设置 MySQL 访问权限: ### \[root@k8s - master \~\]# grant all on \*.\* to exporter@'%' identified by 'exporter'; 命令解释:创建 exporter 用户并授权,允许其从任意主机(%)访问所有数据库,密码为 exporter,供 exporter 采集数据使用。 ### 2. 部署 MySQL Exporter 创建 mysql - exporter.yaml 配置文件: ### apiVersion: apps/v1 kind: Deployment metadata: name: mysql - exporter namespace: monitoring spec: replicas: 1 selector: matchLabels: k8s - app: mysql - exporter template: metadata: labels: k8s - app: mysql - exporter spec: containers: - name: mysql - exporter image: registry.cn - beijing.aliyuncs.com/dotbalo/mysqld - exporter env: - name: DATA_SOURCE_NAME value: "exporter:exporter@(mysql.default:3306)/" # 数据库连接信息,格式为用户名:密码@(服务名:端口)/ imagePullPolicy: IfNotPresent ports: - containerPort: 9104 # exporter暴露指标的端口 --- apiVersion: v1 kind: Service metadata: name: mysql - exporter namespace: monitoring labels: k8s - app: mysql - exporter spec: type: ClusterIP selector: k8s - app: mysql - exporter ports: - name: api port: 9104 protocol: TCP ### 部署 MySQL Exporter: ### \[root@k8s - master \~\]# kubectl create -f mysql - exporter.yaml 命令解释:kubectl create -f根据配置文件创建 Deployment 和 Service 资源。 ### 查看部署结果: ### \[root@k8s - master \~\]# kubectl get -f mysql - exporter.yaml 测试能否获取 metrics 数据: ### \[root@k8s - master \~\]# curl 10.109.16.46:9104/metrics \| tail -n 5 # 10.109.16.46为mysql - exporter Service的ClusterIP 若能获取到指标数据,说明 Exporter 工作正常。 ### 3. 配置 ServiceMonitor 监控 MySQL 创建 mysql - sm.yaml 配置文件: ### apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: mysql - exporter namespace: monitoring labels: k8s - app: mysql - exporter spec: jobLabel: k8s - app endpoints: - port: api # 对应Service中定义的端口名 interval: 30s # 抓取间隔 scheme: http selector: matchLabels: k8s - app: mysql - exporter # 匹配mysql - exporter Service的标签 namespaceSelector: matchNames: - monitoring # 监控的命名空间 ### 创建 ServiceMonitor: ### \[root@k8s - master \~\]# kubectl create -f mysql - sm.yaml 在 Prometheus 的 "Targets" 页面中,可查看 mysql - exporter 的监控目标是否正常(up 状态)。 ### 4. 在 Grafana 中添加 MySQL 监控模板 导入 MySQL 监控模板,模板 ID:6239,步骤同 Node 节点模板导入,完成后即可查看 MySQL 监控数据。 ### 七、对接钉钉报警 1. 部署 DingTalk 组件 下载 Prometheus Webhook DingTalk: ### wget https://github.com/timonwong/prometheus - webhook - dingtalk/releases/download/v2.0.0/prometheus - webhook - dingtalk - 2.0.0.linux - amd64.tar.gz 解压并部署: ### tar -xf prometheus - webhook - dingtalk - 2.0.0.linux - amd64.tar.gz mv prometheus - webhook - dingtalk - 2.0.0.linux - amd64 /usr/local/dingtalk 2. 修改 DingTalk 配置文件 进入配置目录并修改配置: ### cd /usr/local/dingtalk mv config.example.yml config.yml vi config.yml 配置文件内容示例(关键部分): ### targets: webhook1: url: https://oapi.dingtalk.com/robot/send?access_token=你的机器人access_token secret: 你的机器人secret(可选) # 可配置多个webhook 配置解释:url为钉钉机器人的 Webhook 地址,需替换为实际创建的机器人地址;secret用于签名验证,增强安全性。 ### 3. 启动 DingTalk 服务 创建系统服务配置: ### cat \> /etc/systemd/system/prometheus - webhook - dingtalk.service \<\< 'EOF' \[Unit

Description=Prometheus Webhook DingTalk
After=network.target

Service

User=root
Group=root
WorkingDirectory=/usr/local/dingtalk
ExecStart=/usr/local/dingtalk/prometheus - webhook - dingtalk
Restart=always
RestartSec=5
Environment="CONFIG_FILE=/usr/local/dingtalk/config.yml"

Install

WantedBy=multi - user.target

启动服务并设置开机自启:

sudo systemctl daemon - reload

sudo systemctl start prometheus - webhook - dingtalk
sudo systemctl enable prometheus - webhook - dingtalk
查看服务状态:

sudo systemctl status prometheus - webhook - dingtalk

确认服务处于 Running 状态,同时可通过ss -n1pt | grep 8060查看 8060 端口是否被监听(默认端口)。

4. 配置 Alertmanager 对接 DingTalk

编辑 Alertmanager 配置文件:

cd /root/kube - prometheus/manifests/

vi alertmanager - secret.yaml
修改配置文件中的 receivers 和 route 部分,示例如下:

stringData:

alertmanager.yml: |
global:
resolve_timeout: 5m
inhibit_rules:

  • equal:
  • namespace
  • alertname
    source_matchers:
  • severity = critical
    target_matchers:
  • severity =~ info
  • equal:
  • namespace
  • alertname
    source_matchers:
  • severity = info
    target_matchers:
  • severity = info
    receivers:
  • name: webhook
    webhook_configs:
  • url: http://192.168.207.137:8060/dingtalk/webhook2/send # DingTalk服务地址
    send_resolved: true
    route:
    group_by:
  • namespace
    group_interval: 50s
    group_wait: 30s
    receiver: webhook
    repeat_interval: 1h
    routes:
  • matchers:
  • alertname = Watchdog
    receiver: webhook
  • matchers:
  • severity = critical
    receiver: webhook
  • matchers:
  • alertname = TargetDown
    receiver: webhook

配置解释:receivers定义接收者为 webhook,指定 DingTalk 服务的 URL;route定义告警路由规则,将各类告警发送到 webhook 接收者。

应用配置:

kubectl replace -f alertmanager - secret.yaml

若配置修改后未生效,可删除后重新创建:

kubectl delete -f alertmanager - secret.yaml

kubectl create -f alertmanager - secret.yaml
修改 Alertmanager 的 Service 类型为 NodePort 以便访问:

kubectl edit svc -n monitoring alertmanager - main

查看 Alertmanager Service 信息:

kubectl get svc -n monitoring alertmanager - main

通过http://<K8S集群任意节点的IP>:<NodePort>访问 Alertmanager 页面。

5. 测试钉钉报警

停止 MySQL 服务模拟故障:

kubectl scale deployment mysql --replicas=0

命令解释:kubectl scale deployment用于调整 Deployment 的副本数量,--replicas=0表示停止所有 MySQL Pod。

等待一段时间后,若报警规则触发,钉钉机器人会发送报警信息,确认报警功能正常后,可恢复 MySQL 服务:

kubectl scale deployment mysql --replicas=1