Kubernetes 使用 Kube-Prometheus 构建指标监控 +飞书告警
1 介绍
Prometheus Operator 为 Kubernetes 提供了对 Prometheus 机器相关监控组件的本地部署和管理方案,该项目的目的是为了简化和自动化基于 Prometheus 的监控栈配置,主要包括以下几个功能:
- Kubernetes 自定义资源:使用 Kubernetes CRD 来部署和管理 Prometheus、Alertmanager 和相关组件。
- 简化的部署配置:直接通过 Kubernetes 资源清单配置 Prometheus,比如版本、持久化、副本、保留策略等等配置。
- Prometheus 监控目标配置:基于熟知的 Kubernetes 标签查询自动生成监控目标配置,无需学习 Prometheus 特地的配置。
2 安装配置
2.1 兼容性
通过 Prometheus Operator 可以利用 Operator 编写一整套的监控资源清单。以下是各个版本 Kubernetes 和 kube-prometheus 的兼容:
kube-prometheus stack | Kubernetes 1.22 | Kubernetes 1.23 | Kubernetes 1.24 | Kubernetes 1.25 | Kubernetes 1.26 | Kubernetes 1.27 | Kubernetes 1.28 |
---|---|---|---|---|---|---|---|
release-0.10 | ✔ | ✔ | ✗ | ✗ | x | x | x |
release-0.11 | ✗ | ✔ | ✔ | ✗ | x | x | x |
release-0.12 | ✗ | ✗ | ✔ | ✔ | x | x | x |
release-0.13 | ✗ | ✗ | ✗ | x | ✔ | ✔ | ✔ |
main | ✗ | ✗ | ✗ | x | x | ✔ | ✔ |
最新兼容性可参考: https://github.com/prometheus-operator/kube-prometheus/tree/main?tab=readme-ov-file#compatibility
2.2 Kube-Prometheus 的下载
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
2.3 初始化 Kube-Prometheus ( CRDs 资源对象)
manifests/setup 中包含内容为 operator 所需的 命名空间 和 CRDs 初始化组件
kubectl apply -f manifests/setup
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
namespace/monitoring created
The CustomResourceDefinition "prometheuses.monitoring.coreos.com" is invalid: metadata.annotations: Too long: must have at most 262144 bytes
安装过程中可能看到提示 Too long: must have at most 262144 bytes,变更为 kubectl create 即可:
kubectl create -f manifests/setup
创建成功后资源会存放在名为 monitoring 的命名空间。
2.4 通过 Kube-Prometheus 创建资源
manifests 目录下存放着一套 Prometheus的部署规则、模板与配置,包括:Prometheus-operator、Node-exporter、Kube-state-metrics、Grafana、Prometheus-adapter 以及 Prometheus 和 Alertmanager 等大量组件.
kubectl apply -f manifests/
*注意:默认manifests的svc不提供外部访问,如果希望暴露服务,需要调整 -service.yaml 配置 或 通过 Ingress 完成控制.
# 示例为 manifests/grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 10.2.2
name: grafana
namespace: monitoring
spec:
ports:
- name: http
port: 3000
targetPort: http
type: LoadBalancer **# SVC -> LoadBalancer 类型**
selector:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
*注意:默认manifests的Prometheus和其他组件默认为临时存储, 可以调整 -deployment.yaml 或 prometheus-prometheus.yaml 修改挂载模式.
# manifests/prometheus-prometheus.yaml 挂载 OCI BlockVolume 示例
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.48.1
name: k8s
namespace: monitoring
spec:
alerting:
alertmanagers:
- apiVersion: v2
name: alertmanager-main
namespace: monitoring
port: web
enableFeatures: []
externalLabels: {}
image: quay.io/prometheus/prometheus:v2.48.1
nodeSelector:
kubernetes.io/os: linux
# ... 其他配置
storage: **# Storage -> OCI StorageClass 类型, oci-bv**
volumeClaimTemplate:
spec:
storageClassName: oci-bv
resources:
requests:
storage: 50Gi
# ... 其他配置
部署成功后可在 monitoring 命名空间下查看对应的资源
Pods 资源
Services 资源
3 请求飞书告警
3.1 初始化飞书机器人
3.1.1 创建飞书聊天群组
点击左上 “+” 按钮, 创建新的组, 此处可以添加相关的业务同事
3.1.2 添加机器人
进入聊天群组, 右上部分,点击 “…” —> “Settings”, 添加机器人;
在 Settings 中点击 Bots 选项卡, “Add Bot”
添加自定义机器人
设置机器人基础信息, 设置完成后点击 “Add”
设置安全机器人相关信息,确认后机器人配置完成
3.2 prometheusalert 部署
PrometheusAlert是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus、Zabbix,日志系统Graylog2,Graylog3、数据可视化系统Grafana、SonarQube。阿里云-云监控,以及所有支持WebHook接口的系统发出的预警消息,支持将收到的这些消息发送到钉钉,微信,email,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,百度云短信,容联云电话,七陌短信,七陌语音,TeleGram,百度Hi(如流)等。
3.2.1 下载 prometheusalert yaml
wget https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/example/kubernetes/PrometheusAlert-Deployment.yaml
3.2.2 开启飞书告警通道
修改YAML文件中的 configmap app.conf 部分配置
# vim PrometheusAlert-Deployment.yaml
# 83行, 打开 feishu 配置
#是否开启飞书告警通道,可同时开始多个通道0为关闭,1为开启
open-feishu=1
#默认飞书机器人地址, 可以不修改,通过 alertmanager 进行配置
fsurl=https://open.feishu.cn/open-apis/bot/hook/xxxxxxxxx
3.2.3 部署
kubectl apply -n monitoring -f https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/example/kubernetes/PrometheusAlert-Deployment.yaml
3.3 prometheusalert 配置模板与告警
使用自定义模板中的默认模板或创建新的模板,配置飞书告警模板
自定义模板信息
3.4 配置 Alertmanager 对接 PrometheusAlert
注意:默认manifests的alertManager不会加载客户自定义 AlertmanagerConfig,需要配置加载项
3.4.1 加载自定义告警规则
# manifests/alertmanager-alertmanager.yaml
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
labels:
app.kubernetes.io/component: alert-router
app.kubernetes.io/instance: main
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 0.26.0
name: main
namespace: monitoring
spec:
image: quay.io/prometheus/alertmanager:v0.26.0
# 其他配置 .....
alertmanagerConfigSelector: # 通过Label匹配告警规则
matchLabels:
alertmanagerConfig: feishuhook
# 其他配置 .....
3.4.2 创建自定义告警规则
# vim manifests/alertmanager-config.yaml
# alertmanager-config.yaml
# 'http://prometheus-alert-center:8080/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=<飞书机器人地址>'
# prometheus-alert-center:8080 -> PrometheusAlert 请求地址
# type=fs -> 飞书告警
# tpl=prometheus-fs -> 您在PrometheusAlert中配置的飞书告警模板,我的示例为 prometheus-fs ,您可以自行修改
# fsurl=<飞书机器人地址>
apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
name: feishuhook
namespace: monitoring
labels:
alertmanagerConfig: feishuhook
spec:
receivers:
- name: Critical
webhookConfigs:
- url: 'http://prometheus-alert-center:8080/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=<飞书机器人地址>'
sendResolved: true
route:
groupBy: ['namespace']
groupWait: 30s
groupInterval: 6m
repeatInterval: 12h
receiver: Critical
routes:
- receiver: Critical
match:
severity: critical
3.5 查看飞书告警
当出现指标达到告警阈值时,飞书聊天组即可收到报警
4 参考资料
kube-Prometheus 安装:https://github.com/prometheus-operator/kube-prometheus/tree/main?tab=readme-ov-file#quickstart
kube-Prometheus k8s平台兼容性: https://github.com/prometheus-operator/kube-prometheus/tree/main?tab=readme-ov-file#compatibility
PrometheusAlert安装: https://github.com/feiyu563/PrometheusAlert/blob/master/doc/readme/base-install.md#安装部署prometheusalert
飞书机器人添加: https://www.feishu.cn/hc/zh-CN/articles/360024984973-如何在群组中使用机器人