目录
一、基于 Kubernetes 的 Prometheus 监控方案概述
1. 核心组件及功能
2. 监控流程详解
3. 关键监控指标说明
二、Prometheus 与相关组件部署
1. 克隆项目代码
2. 安装 Prometheus Operator
3. 安装 Prometheus Stack
4. 查看容器运行状态
三、ServiceMonitor 配置与应用
1. ServiceMonitor 作用与查看
2. ServiceMonitor 工作原理
四、Grafana 配置与访问
1. 修改 Grafana Service 类型
2. 访问 Grafana 并配置数据源
3. 导入监控模板
五、Prometheus 访问配置
1. 修改 Prometheus Service 类型
2. 访问 Prometheus 并查看监控目标
六、监控 MySQL 数据库
1. 部署 MySQL
2. 部署 MySQL Exporter
3. 配置 ServiceMonitor 监控 MySQL
4. 在 Grafana 中添加 MySQL 监控模板
七、对接钉钉报警
1. 部署 DingTalk 组件
2. 修改 DingTalk 配置文件
3. 启动 DingTalk 服务
4. 配置 Alertmanager 对接 DingTalk
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 <none> 3000:32082/TCP 28m 命令解释:kubectl get svc用于获取 Service 信息,可看到 TYPE 已变为 NodePort,以及映射的节点端口 32082。
2. 访问 Grafana 并配置数据源 通过以下 URL 访问 Grafana:http://<K8S集群任意节点的IP>: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 <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 - 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