第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警

Prometheus Operator实现Ceph集群企业微信告警

实现方案

我们的k8s集群与ceph集群是部署在不同的服务器上,因此实现方案如下:

(1) ceph集群开启mgr内置的exporter服务,用于获取ceph集群的metrics

(2) k8s集群通过 Service + Endponit + ServiceMonitor建立ceph集群metrics与Prometheus之间的联系

  1. 建立一个 ServiceMonitor 对象,用于 Prometheus 添加监控项;
  2. 为 ServiceMonitor 对象关联 metrics 数据接口的一个 Service 对象;
  3. 确保 Service 对象可以正确获取到 Metrics 数据;

(3) 通过grafana监控ceph集群

(4) 配置企业微信告警

ceph集群开启内置exporter

Ceph Luminous 12.2.1的mgr中自带了Prometheus插件,内置了 Prometheus ceph exporter,可以使用Ceph mgr内置的exporter作为Prometheus的target。

在ceph集群机器上启动ceph exporter

ceph mgr module enable prometheus

查看Prometheus的服务端口是否启动, prometues exporter启动的端口是9283

netstat -nltp | grep mgr

通过 ceph -s可以看到ceph mgr进程是在哪台机器上启动的

(base) Ceph3 ➜  ~ ceph -scluster:id:     21217f8a-8597-4734-acf6-05e9251ce7behealth: HEALTH_OKservices:mon: 3 daemons, quorum Ceph1,Ceph3,Ceph2 (age 10d)mgr: Ceph3(active, since 2w), standbys: Ceph2, Ceph1mds: cephfs:1 {0=Ceph2=up:active} 2 up:standbyosd: 24 osds: 24 up (since 2w), 24 in (since 10M)rgw: 2 daemons active (Ceph1, Ceph2)task status:data:pools:   11 pools, 857 pgsobjects: 27.06M objects, 71 TiBusage:   216 TiB used, 133 TiB / 349 TiB availpgs:     856 active+clean1   active+clean+scrubbing+deepio:client:   1.3 MiB/s rd, 867 KiB/s wr, 7 op/s rd, 23 op/s wr

这里我们可以看到ceph mgr进程在Ceph3上启动, 在浏览器中输入对应的IP跟9283端口即可访问
在这里插入图片描述

点击蓝色Metrics后,可以看到所有的搜集的指标信息
在这里插入图片描述

k8s集群配置ServiceMonitor

k8s通过 Service + Endpoints 方式, 明确将外部ceph exporter服务映射为内部 Service.

Endpoints

Endpoints是将ceph exporter服务的节点所指向的服务映射到k8s内部服务,yaml配置文件如下

apiVersion: v1
kind: Endpoints
metadata:name: ceph-monitornamespace: monitoringlabels:app: monitor-ceph
subsets:
- addresses:- ip: 10.32.0.15ports:- name: httpport: 9283protocol: TCP

这里本质上获取服务的IP与Port

Service

Service是k8s内部的服务,可供k8s集群其他服务访问。这里yaml配置文件如下:

apiVersion: v1
kind: Service
metadata:name: ceph-monitornamespace: monitoringlabels:app: monitor-ceph
spec:type: ClusterIP clusterIP: Noneports:- name: httpport: 9283protocol: TCPtargetPort: 9283

这里需要注意:Service与Endpoints的name要保持一样,另外labels的命名要与name区分开,不要设置成一样,否则会导致咱们的服务无法访问。

ServiceMonitor

通过配置ServiceMonitor可以让Prometheus自动识别到ceph target. yaml文件如下:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: ceph-monitornamespace: monitoringlabels:release: prometheus
spec:endpoints:- port: httpinterval: 30sselector:matchLabels:app: monitor-cephnamespaceSelector:matchNames:- monitoring

这里的labels设置要与Prometheus对象中一致,否则可能会导致ceph的服务无法被Prometheus识别。

将上面三个配置写入到ceph-monitor.yaml文件,然后执行下述命令即可。

kubectl apply -f ceph-monitor.yaml

在这里插入图片描述

打开Prometheus网站可以发现Targets中已经可以监控到ceph集群了,接下来开始配置具体的监控内容和告警。

grafana配置ceph监控告警

配置监控规则方法

prometheus的监控规则文件在prometheus Pod中的路径:/etc/prometheus/rules/prometheus-prometheus-kube-prometheus-prometheus-rulefiles-0/
在这里插入图片描述

而这些文件都是通过一个叫PrometheusRule的k8s资源生成的,PrometheusRule用于配置Promtheus的 Rule 规则文件,包括 recording rules 和 alerting,可以自动被 Prometheus 加载。

至于为什么 Prometheus 能够识别这个 PrometheusRule 资源对象呢?这就需要查看我们创建的 prometheus 这个资源对象了,里面有非常重要的一个属性 ruleSelector,用来匹配 rule 规则的过滤器,我们这里没有过滤,所以可以匹配所有的,假设要求匹配具有 prometheus=k8s 和 role=alert-rules 标签的 PrometheusRule 资源对象,则可以添加下面的配置:

ruleSelector:matchLabels:prometheus: k8srole: alert-rules

为了监控ceph集群,我们需要自定义一些报警规则,其实就是创建一个PrometheusRule的对象即可,然后Prometheus会自动识别。接下来我们重点关注我们需要创建的规则内容。

配置ceph监控规则

首先我们需要整理一下ceph集群一些非常重要的监控内容:

  • ceph 几个重要的服务进程:mon, mgr, mds, osd, rgw
  • ceph osd 的使用率
  • ceph集群的状态
  • ceph集群IO效率

PrometheusRule

PrometheusRule defines recording and alerting rules for a Prometheus instance

FieldDescription
apiVersion stringmonitoring.coreos.com/v1
kind stringPrometheusRule
metadata Kubernetes meta/v1.ObjectMetaRefer to the Kubernetes API documentation for the fields of the metadata field.
spec PrometheusRuleSpecSpecification of desired alerting rule definitions for Prometheus.

配置ceph监控规则

目前网上配置ceph的规则文章基本都没有用,大家都不懂什么意思,这里建议大家弄懂规则的制定方法。

这里有一些注意事项需要说一下:

  • PrometheusRule的metadata下的标签一定要配置一个与k8s集群中prometheus: ruleSelector下定义的相同的标签,否则配置的Rule无法被Prometheus识别

    • 获取prometheus的yaml文件:kubectl get prometheus -n monitoring -o yaml > prometheus.yaml

    • 找到ruleSelector section下的配置信息,例如:

      ruleSelector:matchLabels:release: prometheus
      

      这里我们找到了标签:release,在配置rule时,填入即可。

  • 配置的规则涉及的指标要从ceph exporter服务中获取。规则的设置方法如下:

    - alert: CephClusterexpr: ceph_health_status > 0  # 规则的计算公式,需要使用相应的metrics,从ceph exporer服务中获取for: 3mlabels:severity: criticalstatus: 非常严重annotations:summary: "{{$labels.instance}}: Ceph集群状态异常"description: "{{$labels.instance}}:Ceph集群状态异常,当前状态为{{ $value }}"
    

expr的设计规则

PrometheusRule中的 expr字段用于定义监控规则的表达式。该表达式使用PromQL(Prometheus查询语言)来指定要监控的指标以及触发警报的条件。以下是PromQL的一些常用语法和使用方法的详细介绍:

  1. 指标选择器:

    • 使用 <metric_name>选择特定的指标,例如:cpu_usage
    • 使用 <metric_name>{<label_name>="<label_value>"}选择带有特定标签值的指标,例如:cpu_usage{instance="server1", job="web"}
  2. 二元操作符:

    • ==:等于
    • !=:不等于
    • >:大于
    • >=:大于等于
    • <:小于
    • <=:小于等于
  3. 逻辑操作符:

    • and:逻辑与
    • or:逻辑或
    • unless:逻辑非
  4. 函数:

    • rate(<metric_name>[<time_range>]):计算指标的速率,例如:rate(cpu_usage[5m])
    • sum(<vector>):对指标向量进行求和,例如:sum(cpu_usage)
    • avg(<vector>):对指标向量进行平均值计算,例如:avg(cpu_usage)
  5. 时间范围:

    • [<duration>]:指定一个时间范围,例如:[5m]表示过去5分钟的数据

ceph的监控规则

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:labels:prometheus: k8srole: alert-rulesrelease: prometheusname: ceph-rulesnamespace: monitoring
spec:groups:- name: cephrules:- alert: CephClusterexpr: ceph_health_status > 0for: 3mlabels:severity: criticalstatus: 非常严重annotations:summary: "{{$labels.instance}}: Ceph集群状态异常"description: "{{$labels.instance}}:Ceph集群状态异常,当前状态为{{ $value }}"- alert: CephOSDDownexpr: count(ceph_osd_up{} == 0.0) > 0for: 3mlabels:severity: criticalstatus: 非常严重annotations:summary: "{{$labels.instance}}: 有{{ $value }}个OSD挂掉了"description: "{{$labels.instance}}:{{ $labels.osd }}当前状态为{{ $labels.status }}"- alert: CephOSDOutexpr: count(ceph_osd_up{}) - count(ceph_osd_in{}) > 0for: 3mlabels:severity: criticalstatus: 非常严重annotations:summary: "{{$labels.instance}}: 有{{ $value }}个OSD Out"description: "{{$labels.instance}}:{{ $labels.osd }}当前状态为{{ $labels.status }}"- alert: CephOverSpaceexpr: ceph_cluster_total_used_bytes / ceph_cluster_total_bytes * 100 > 80for: 3mlabels:severity: criticalstatus: 非常严重annotations:summary: "{{$labels.instance}}:集群空间不足"description: "{{$labels.instance}}:当前空间使用率为{{ $value }}"- alert: CephMonDownexpr: count(ceph_mon_quorum_status{}) < 3for: 3mlabels:severity: criticalstatus: 非常严重annotations:summary: "{{$labels.instance}}:Mon进程异常"description: "{{$labels.instance}}: Mon进程Down"- alert: CephMgrDownexpr: sum(ceph_mgr_status{}) < 1.0for: 3mlabels:severity: criticalstatus: 非常严重annotations:summary: "{{$labels.instance}}:Mgr进程异常"description: "{{$labels.instance}}: Mgr进程Down"- alert: CephMdsDownexpr: sum(ceph_mds_metadata{}) < 3.0for: 3mlabels:severity: warningstatus: 告警annotations:summary: "{{$labels.instance}}:Mds进程异常"description: "{{$labels.instance}}: Mds进程Down"- alert: CephRgwDownexpr: sum(ceph_rgw_metadata{}) < 2.0for: 3mlabels:severity: warningstatus: 告警annotations:summary: "{{$labels.instance}}:Rgw进程异常"description: "{{$labels.instance}}: Rgw进程Down"- alert: CephOsdOverexpr: sum(ceph_osd_stat_bytes_used / ceph_osd_stat_bytes > 0.8) by (ceph_daemon) > 0for: 3mlabels:severity: warningstatus: 告警annotations:summary: "{{$labels.instance}}:High OSD Usage Alert"description: "{{$labels.instance}}: Some OSDs have usage above 80%"

在k8s集群中配置生效,然后检查是否生效。如果没有生效,回去检查ruleSelector的标签是否配置正确

kubectl apply -f ceph_rules.yaml -n monitoring

在这里插入图片描述

说明我们的配置生效了,接下来开始在grafana中配置企业微信告警

Grafana配置企业微信告警

配置企业微信机器人

这里很简单,就不展开了。具体操作流程:找一个自己是群主的群聊,然后点击企业微信右上角的 ...并点击添加机器人,点击 新创建一个机器人,输入机器人名称及配置图片就生成好了。最后会得到一个链接: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx

这里我配置了,但是无法直接在Grafana中配置webhook进行发送告警信息,这里需要使用第三方服务进行信息中转才能将消息发送到企业微信机器人。

部署中转服务

我在github上找到了两个项目:

第一个是 g2ww 我尝试了,并没有发送成功,总是报 40038, url长度错误。这里pass掉

第二个是 cloopy, 这个项目我测试成功。下面是我的处理流程:

step1 首先下载项目

git clone https://github.com/liozzazhang/message-transfer.git

step2 由于我使用的是k8s部署,所以这里要生成镜像部署,下面是生成的Dockerfile

FROM golang:latest AS buildCOPY .  /go/src
WORKDIR /go/srcRUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /go/bin/cloopy *.goFROM alpineCOPY --from=build /go/bin/cloopy /cloopy
ENV TZ=Asia/Shanghai
CMD ["/cloopy"]

根据dockerfile生成镜像

docker build -t cloopy:latest .

step3 测试验证:镜像生成之后可以直接在本机上进行部署测试验证是否可以转发告警信息

docker run --rm -d -p 12345:12345 cloopy:latest

docker启动成功后,可以通过 docker logs -f $container_id 进行查看服务启动日志。

在grafana网页的添加Contact Points页面添加URL, URL格式为:http://10.66.17.96:12345/cloopy/grafana?webhook=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx

在这里插入图片描述

step4 测试通过后,开始编写k8s部署的yaml文件,如果使用域名的话,还需配置ingress

---
apiVersion: apps/v1
kind: Deployment
metadata:name: cloopynamespace: monitoringlabels:app: cloopy
spec:replicas: 1 selector:matchLabels:app: cloopytemplate:metadata:labels:app: cloopyspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- master01- master02- master03containers:- name: cloopyimage: cloopy:latest# command:#   - /bin/bash #   - "./bin/monitor.sh"ports:- containerPort: 12345---
apiVersion: v1
kind: Service
metadata:name: cloopy namespace: monitoringlabels:app: cloopy 
spec:ports:- name: httpport: 12345protocol: TCPtargetPort: 12345selector:app: cloopy type:LoadBalancer
------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: cloopy namespace: monitoring
spec:ingressClassName: nginxrules:- host: webhook.com http:paths:- path: /pathType: Prefixbackend:service:name: cloopyport: number: 12345 path: /

然后在k8s上进行部署即可: kubectl apply -f development.yaml。部署完成后,将grafana里URL测试环境的服务地址换成生产环境的域名或者IP再验证一下就可以了。

http://webhook.com/cloopy/grafana?webhook=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx

至此企业微信的Webhook便配置成功了。
在这里插入图片描述

配置企业微信

需要创建企业微信应用程序,并得到corp_id, secret_id, app_id。这几个变量要配置好。

然后将这几个变量配置到webcam下对应的变量就可以使用了,这个比较简单,但是其灵活性不如企业微信机器人。

配置告警规则

在配置告警规则时,我遇到了另外一个问题:通过AlertManager配置的rule无法在datasource Prometheus下进行告警,配置Alert时找不到这些告警内容,这里只能重新创建Alert Rule,然后再通过label进行绑定。
在这里插入图片描述

所以我将ceph下的规则又重新配置了一遍,我目前还没有找到好的方法进行yaml文件配置,等以后发现了再补充,目前是手动添加告警规则。

参考

如何用 Prometheus Operator 监控 K8s 集群外服务? - 掘金 (juejin.cn)

使用Operator管理Prometheus · Prometheus中文技术文档

Getting Started - Prometheus Operator (prometheus-operator.dev)

K8S集群部署kube-Prometheus监控Ceph(版本octopus)集群、并实现告警。_promethus基于ceph相关的告警规则_石头-豆豆的博客-CSDN博客

Prometheus Operator 配置PrometheusRule告警规则_prometheus runbook_url_富士康质检员张全蛋的博客-CSDN博客

prometheus-operator/Documentation/api.md at main · prometheus-operator/prometheus-operator · GitHub

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/26111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VALSE2023】0610 胡瀚《视觉自监督学习年度进展评述》

from&#xff1a; https://www.bilibili.com/video/BV1J44y1w79r 文章目录 自监督学习年度进展技术进展趋势一&#xff1a;掩码图像建模的改进技术进展二&#xff1a;发现掩码图像建模对**大模型**比较友好技术进展三&#xff1a;针对**小模型**的掩码图像建模训练技术进展四&a…

Unity Shader编辑器工具类ShaderUtil 常用函数和用法

Unity Shader编辑器工具类ShaderUtil 常用函数和用法 Unity的Shader编辑器工具类ShaderUtil提供了一系列函数&#xff0c;用于编译、导入和管理着色器。本文将介绍ShaderUtil类中的常用函数和用法。 编译和导入函数 CompileShader 函数签名&#xff1a;public static bool C…

web前端转正工作总结范文5篇

web前端转正工作总结&#xff08;篇1&#xff09; 来到__有限公司已经三个月了&#xff0c;目前的工作是前端开发&#xff0c;我是一名应届毕业生&#xff0c;之前没有过工作经验&#xff0c;在刚来到__这个大家庭的时候&#xff0c;我就被这里的工作气氛深深地吸引&#xff0…

Elastic的下载

文章目录 ElasticSearch的下载扩展1&#xff08;ElasticSearch 与 JDK 版本 适配&#xff09;扩展2&#xff08;访问 http://192.168.1.200:9200 没有显示信息&#xff09;扩展3&#xff08;免密登录&#xff09; ElasticSearch的下载 官方下载网址&#xff1a;https://www.el…

在 Ubuntu 上安装 Docker 桌面

Ubuntu 22.04 (LTS) 安装 Docker 桌面 要成功安装 Docker Desktop&#xff0c;您必须&#xff1a; 满足系统要求拥有 64 位版本的 Ubuntu Jammy Jellyfish 22.04 (LTS) 或 Ubuntu Impish Indri 21.10。对于非 Gnome 桌面环境&#xff0c;必须安装 gnome-terminal&#xff1a;…

数字孪生技术的实用价值体现在哪?

随着科技的不断进步&#xff0c;数字孪生技术已成为引领未来发展的重要驱动力。数字孪生是将现实世界与数字世界紧密结合的技术&#xff0c;通过创建虚拟的物理模型&#xff0c;实时模拟和分析真实世界中的物体和过程&#xff0c;让数字孪生在各个领域都展现出了巨大的潜力&…

nvm下载node导致npm报错无法使用

有个依赖库需要更新下node&#xff0c;用nvm下载后项目跑不起来了&#xff0c;npm -v 还报错 其实一开始是npm下载不来&#xff0c;然后换了淘宝镜像后还是报错 然后就只能手动下载下了 进入node.js官网 https://nodejs.org/en/download 下载后注意要安装在你nvm目录中&#x…

Dockerfile构建LNMP镜像

建立工作目录 [rootlocalhost ~]# mkdir lnmp [rootlocalhost ~]# cd lnmp/ 编写Dockerfile文件 [rootlocalhost lnmp]# vim Dockerfile [rootlocalhost lnmp]# ll 总用量 4 -rw-r--r--. 1 root root 774 8月 3 14:54 Dockerfile [rootlocalhost lnmp]# vim Dockerfile #基础…

【Spring Boot】(三)深入理解 Spring Boot 日志

文章目录 前言一、日志文件的作用二、Spring Boot 中的日志2.1 查看输出的日志信息2.2 日志格式二、Spring Boot 中的日志2.1 查看输出的日志信息2.2 日志格式 三、自定义日志输出3.1 日志框架3.2 日志对象的获取3.3 使用日志对象打印日志 四、日志级别4.1 日志级别的作用4.2 日…

人到中年不得已,保温杯里泡枸杞--送程序员

目录 一&#xff1a;你现在身体的体能状况如何&#xff1f;你有身体焦虑吗&#xff1f; 二&#xff1a;如何保持规律性运动&#xff1f; 三&#xff1a;你有哪些健康生活的好习惯&#xff1f; 大厂裁员&#xff0c;称35岁以后体能下滑&#xff0c;无法继续高效率地完成工作&…

Gof23设计模式之组合模式

1.定义 ​组合模式又名部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#xff0c;它创建了对象组的树形结构。 2.结构 组合模式主要包含三种…

无涯教程-Perl - endgrent函数

描述 此功能告诉系统您不再希望使用getgrent从groups文件中读取条目。 语法 以下是此函数的简单语法- endgrent返回值 此函数不返回任何值。 Perl 中的 endgrent函数 - 无涯教程网无涯教程网提供描述此功能告诉系统您不再希望使用getgrent从groups文件中读取条目。 语法以…

STM32——LED内容补充(寄存器点灯及反转的原理)

文章目录 点灯流程开时钟配置IO关灯操作灯反转宏定义最后给自己说 本篇文章使用的是STM32F103xC系列的芯片&#xff0c;四个led灯在PE2,PE3,PE4,PE5上连接 点灯流程 1.开时钟 2.配置IO口 &#xff08;1&#xff09;清零指定寄存器位 &#xff08;2&#xff09;设置模式为推挽输…

最新2024届【海康威视】内推码【GTK3B6】

最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网&#xff0c;选择岗位投递简历&#xff1b; 2.投递过程中填写内推码完成内推步骤&#xff0c;即可获得内推特权。 内推码&#xff1a;GTK3B6 内推码&#xff1a;GTK3B6 内推码&…

【广州华锐视点】海上石油钻井VR在线实训平台

随着科技的不断发展&#xff0c;VR元宇宙平台已经成为了越来越多领域的培训工具。在海上石油钻井实训中&#xff0c;VR元宇宙平台也能够发挥重要的作用&#xff0c;为学员提供更加真实、直观的培训体验。 首先&#xff0c;VR元宇宙平台可以模拟真实的海上钻井作业环境。通过VR眼…

【嵌入式学习笔记】嵌入式入门6——定时器TIMER

1.定时器概述 1.1.软件定时原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xff08;延时&#xff09;功能有诸多缺点&#xff0c;如CPU死等、延时不精准。 void delay_us(uint32_t us) {us * 72;while(us--); }1.2.定时器定时原理 使用精准的时基&#…

uniapp点击图片放大预览

阐述 有些时候我们在用uniapp显示图片时&#xff0c;有的不宜全部显示到屏幕上&#xff0c;uniapp提供了一个非常好用的api。 实现方式如下&#xff1a; <template><view class"content"><image class"logo" src"/static/images/a.…

Unity限制在一个范围内移动

Unity限制在一个范围内移动 这个例子中&#xff0c;我们学习Vector3.ClampMagnitude的用法&#xff0c;限制小球在范围内移动。 在地图上放了一个小球&#xff0c;让他移动&#xff0c;但是不想让他掉下去&#xff0c;限制在一个球星范围内&#xff0c;就好像绳子拴住了一样&…

ChatGPT 作为 Python 编程助手

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 简单的数据处理脚本 我认为一个好的起点是某种数据处理脚本。由于我打算让 ChatGPT 之后使用各种 Python 库编写一些机器学习脚本&#xff0c;这似乎是一个合理的起点。 目标 首先&#xff0c;我想尝试…

kubeadml 安装 k8s

目录 一&#xff1a;kubeadml 安装 k8s 1、网络环境 2、 环境准备 3、 所有节点安装docker 4、所有节点安装kubeadm&#xff0c;kubelet和kubectl ​5、部署K8S集群 6、测试 二&#xff1a; 部署 Dashboard 一&#xff1a;kubeadml 安装 k8s 1、网络环境 master&am…