简介

在传统架构中,Zabbix、Nagios 等监控工具占据主流,但面对 Kubernetes 这类云原生平台,它们在容器集群监控方面显得力不从心。本文将介绍基于 Kubernetes 的 Prometheus 监控方案,从环境部署到实际应用,带您一步步搭建完整的企业级监控体系,包括 Prometheus 与 Grafana 部署、服务监控配置、MySQL 监控集成以及钉钉报警对接等核心功能。

一、基于 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 集群的监控流程清晰且有序,主要分为以下步骤:

  1. 数据采集层部署:在 Kubernetes 集群的每个节点上安装 Cadvisor 和 node - exporter,其中 Cadvisor 负责容器级指标采集,node - exporter 负责节点级指标采集。
  2. 数据存储与处理:部署 Prometheus,通过配置使其能够抓取 Cadvisor 和 node - exporter 的 Metrics 接口数据,将容器(containers)和节点(nodes)的时序数据妥善存储。
  3. 可视化展示:利用 Grafana 构建监控仪表盘,选择 Prometheus 作为数据源,通过编写 PromQL 查询语句,直观展示 K8S 集群的各类监控指标。
  4. 报警机制设置:根据监控需求设置 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     <none>          3000:32082/TCP   28m

命令解释kubectl get svc用于获取 Service 信息,可看到 TYPE 已变为 NodePort,以及映射的节点端口 32082。

2. 访问 Grafana 并配置数据源

通过以下 URL 访问 Grafana:http://<K8S集群任意节点的IP>:32082
默认登录账号密码为 admin/admin,首次登录会提示修改密码,可选择跳过。

Grafana 默认已配置 Prometheus 数据源,若需手动配置:

  1. 单击首页左侧的 “Add your first data source”。
  2. 选择 Prometheus 数据源。
  3. 在 HTTP 配置项下的 URL 填写 “http://prometheus - k8s:9090”(prometheus - k8s 为 K8s 集群内的 Service 名),点击 “Save & Test” 保存并测试。

3. 导入监控模板

导入 Node 节点监控模板步骤:

  1. 单击首页左侧 “+” 按钮,选择 “Import”。
  2. 输入模板 ID:13105,单击 “Load” 加载。
  3. 最后单击 “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     <none>          9090:32370/TCP   33m

2. 访问 Prometheus 并查看监控目标

通过 URLhttp://<K8S集群任意节点的IP>: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    <none>          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 - exporternamespace: monitoring
spec:replicas: 1selector:matchLabels:k8s - app: mysql - exportertemplate:metadata:labels:k8s - app: mysql - exporterspec:containers:- name: mysql - exporterimage: registry.cn - beijing.aliyuncs.com/dotbalo/mysqld - exporterenv:- name: DATA_SOURCE_NAMEvalue: "exporter:exporter@(mysql.default:3306)/"  # 数据库连接信息,格式为用户名:密码@(服务名:端口)/imagePullPolicy: IfNotPresentports:- containerPort: 9104  # exporter暴露指标的端口
---
apiVersion: v1
kind: Service
metadata:name: mysql - exporternamespace: monitoringlabels:k8s - app: mysql - exporter
spec:type: ClusterIPselector:k8s - app: mysql - exporterports:- name: apiport: 9104protocol: 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 - exporternamespace: monitoringlabels:k8s - app: mysql - exporter
spec:jobLabel: k8s - appendpoints:- port: api  # 对应Service中定义的端口名interval: 30s  # 抓取间隔scheme: httpselector: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_tokensecret: 你的机器人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
EOF

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

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: 5minhibit_rules:- equal:- namespace- alertnamesource_matchers:- severity = criticaltarget_matchers:- severity =~ info- equal:- namespace- alertnamesource_matchers:- severity = infotarget_matchers:- severity = inforeceivers:- name: webhookwebhook_configs:- url: http://192.168.207.137:8060/dingtalk/webhook2/send  # DingTalk服务地址send_resolved: trueroute:group_by:- namespacegroup_interval: 50sgroup_wait: 30sreceiver: webhookrepeat_interval: 1hroutes:- matchers:- alertname = Watchdogreceiver: webhook- matchers:- severity = criticalreceiver: webhook- matchers:- alertname = TargetDownreceiver: 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

总结

本文介绍了在 Kubernetes 环境中搭建 Prometheus 企业级监控体系的流程,从核心组件部署、ServiceMonitor 配置、Grafana 可视化展示,到 MySQL 数据库监控集成以及钉钉报警对接。通过这套方案,能够监控 Kubernetes 集群及应用的运行状态,及时发现并预警潜在问题,为云原生应用的稳定运行提供有力保障。在实际应用中,可根据具体需求调整监控指标和报警阈值,进一步优化监控策略。