Kubernetes监控Prometheus

Kubernetes监控Prometheus

Prometheus概述

Prometheus是一个开源系统监控和警报工具包,最初是在SoundCloud上构建的。自2012年成立以来,许
多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发者和用户社区。
Prometheus现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并澄清项目的治
理结构,Prometheus于2016年加入云原生计算基金会,作为继Kubernetes之后的第二个托管项目。
我们可以简单的理解Prometheus是一个监控系统同时也是一个时间序列数据库。
推荐阅读:
官网地址:
https://prometheus.io
官方文档:
https://prometheus.io/docs/introduction/overview/
GitHub地址:
https://github.com/prometheus

image-20231006134059950

如下图所示,展示了普罗米修斯(prometheus)的建筑和它的一些生态系统组成部分。
    (1)#Prometheus server:
        prometheus的服务端,负责收集指标和存储时间序列数据,并提供查询接口。

    (2)#exporters:
        如果想要监控,前提是能获取被监控端数据,并且这个数据格式必须遵循Prometheus数据模型,这样才能识别和采集,一般使用exporter数据采集器(类似于zabbix_agent端)提供监控指标数据。
        exporter数据采集器,除了官方和GitHub提供的常用组件exporter外,我们也可以为自己自研的产品定制exporters组件哟。

    (3)#Pushgateway:
        短期存储指标数据,主要用于临时性的任务。比如备份数据库任务监控等。
        本质上我们可以理解为Pushgateway可以帮咱们监控自定义的监控项,这需要咱们自己编写脚本来推送到Pushgateway端,而后由Prometheus server从Pushgateway去pull监控数据。
        换句话说,请不要被官方的架构图蒙骗了,咱们完全可以基于Pushgateway来监控咱们自定义的监控项哟,这些监控项完全可以是长期运行的呢!

    (4)#Service discovery:
        服务发现,例如我们可以配置动态的服务监控,无需重启Prometheus server实例就能实现动态监控。

    (5)#Alertmanager:
        支持报警功能,比如可以支持基于邮件,微信,钉钉报警。
        据网友反馈该组件在生产环境中存在缺陷,因此我们可以考虑使用Grafana来展示并实现报警功能。
    (6)#Prometheus Web UI
        Prometheus比较简单的Web控制台,通常我们可以使用grafana来集成做更漂亮的Web展示哟。    

#温馨提示:
大多数Prometheus组件都是用Go编写的,这使得它们易于构建和部署为静态二进制文件。

Prometheus安装方式

1)docker docker-compose
2)K8S资源清单
3)Prometheus-operator
4)二进制

prometheus部署 Kubernetes资源清单方式

cat > prom-cm.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
 name: prom-config
 namespace: prom
data:
 prometheus.yml: |
  global:             #全局配置
   scrape_interval: 15s      #抓取数据间隔时间
   scrape_timeout: 15s      #抓取数据超时时间
  scrape_configs:         #抓取配置
  - job_name: 'prometheus'     #任务名称
   static_configs:        #静态配置
   - targets: ['localhost:9090'] #抓取数据节点的IP端口
EOF

PV和PVC

cat > prom-pv-pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolume
metadata:
 name: prom-localhost
 labels:
  app: prometheus
spec:
 capacity:
  storage: 10Gi
 accessModes:
  - ReadWriteOnce
 storageClassName: local-storage
 local:
  path: /data/k8s/prometheus
 nodeAffinity:
  required:
   nodeSelectorTerms:
   - matchExpressions:
    - key: kubernetes.io/hostname
     operator: In
     values:
     - elkstack02
 persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: prom-data
 namespace: prom
spec:
 selector:
  matchLabels:
   app: prometheus
 accessModes:
 - ReadWriteOnce
 resources:
  requests:
   storage: 10Gi
 storageClassName: local-storage
EOF

RBAC

cat > prom-rbac.yml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
 name: prometheus
 namespace: prom
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
 name: prometheus
rules:
- apiGroups:
 - ""
 resources:
 - nodes
 - services
 - endpoints
 - pods
 - nodes/proxy
 verbs:
 - get
 - list
 - watch
- apiGroups:
 - "extensions"
 resources:
 - ingresses
 verbs:
 - get
 - list
 - watch
- apiGroups:
 - ""
 resources:
 - configmaps
 - nodes/metrics
 verbs:
 - get
- nonResourceURLs:
 - /metrics
 verbs:
 - get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
 name: prometheus
roleRef:
 apiGroup: rbac.authorization.k8s.io
 kind: ClusterRole
 name: prometheus
subjects:
- kind: ServiceAccount
 name: prometheus
 namespace: prom
EOF

Deployment

cat > prom-dp.yaml <<EOF
apiVersion: apps/v1
kind: Deployment 
metadata:
 name: prometheus
 namespace: prom
 labels:
  app: prometheus
spec:
 selector:
  matchLabels:
   app: prometheus
 template:
  metadata:
   labels:
    app: prometheus
  spec:
   serviceAccountName: prometheus
   volumes:
   - name: data
    persistentVolumeClaim:
     claimName: prom-data
   - name: config-volume
    configMap:
     name: prom-config
   initContainers:
   - name: fix-permissions
    image: busybox
    command: [chown, -R, "nobody:nobody", /prometheus]
    volumeMounts:
    - name: data
     mountPath: /prometheus
   containers:
   - name: prometheus
    image: prom/prometheus:v2.24.1
    args:
    - "--config.file=/etc/prometheus/prometheus.yml" # 配置文件路径
    - "--storage.tsdb.path=/prometheus"        # 数据保存路径
    - "--storage.tsdb.retention.time=24h"       # 数据保留,默认15天
    - "--web.enable-admin-api"            # 控制对admin HTTP API访问
    - "--web.enable-lifecycle"            # 支持热更新
    ports:
    - containerPort: 9090
    volumeMounts:
    - name: config-volume
     mountPath: /etc/prometheus
    - name: data
     mountPath: /prometheus
    resources:
     requests:
      cpu: 100m
      memory: 512Mi
     limits:
      cpu: 100m
      memory: 512Mi
EOF

Service

cat > prom-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
 name: prometheus
 namespace: prom
 labels:
  app: prometheus
spec:
 selector: 
  app: prometheus
 ports:
 - name: web
  port: 9090
  targetPort: http
 type: ClusterIP
EOF

ingress

cat > prom-ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: prometheus
 namespace: prom
 labels:
  app: prometheus
spec:
 rules:
 - host: prom.drz.com
  http:
   paths:
   - path: /
    pathType: ImplementationSpecific
    backend:
     service:
      name: prometheus
      port:
       number: 9090
EOF

二进制部署prometheus

环境准备

主机 IP 角色 应用
nfs 10.0.0.91 服务端 Prometheus-server、grafana、node_export、alertmanager、pushgateway
master-1 10.0.0.110 客户端 node_exporter
node-1 10.0.0.111 客户端 node_exporter
node-2 10.0.0.112 客户端 node_exporter

部署prometheus

下载地址TP

# 下载应用
pushgateway-1.6.2.linux-amd64.tar.gz
alertmanager-0.26.0.linux-amd64.tar.gz
node_exporter-1.6.1.linux-amd64.tar.gz
prometheus-2.47.0.linux-amd64.tar.gz

# 创建站点目录
[root@nfs ~]# mkdir /app

# 解压
[root@nfs ~]# tar xf prometheus-2.47.0.linux-amd64.tar.gz -C /app/
[root@nfs ~]# tar xf alertmanager-0.26.0.linux-amd64.tar.gz -C /app/
[root@nfs ~]# tar xf node_exporter-1.6.1.linux-amd64.tar.gz -C /app/
[root@nfs ~]# tar xf pushgateway-1.6.2.linux-amd64.tar.gz -C /app/

# 改名
[root@nfs app]# mv alertmanager-0.26.0.linux-amd64/ alertmanager-0.26.0
[root@nfs app]# mv node_exporter-1.6.1.linux-amd64/ node_exporter-1.6.1
[root@nfs app]# mv prometheus-2.47.0.linux-amd64/ prometheus-2.47.0
[root@nfs app]# mv pushgateway-1.6.2.linux-amd64/ pushgateway-1.6.2

# 软链接
[root@nfs app]# ln -s /app/prometheus-2.47.0/ /app/prometheus

# 修改配置文件
[root@nfs ~]# vim /app/prometheus/prometheus.yml 
global: ## 全局配置模块
  scrape_interval: 15s ### 静态配置,获取后端数据的间隔时间 15s获取一次
  evaluation_interval: 15s ### 数据与触发器值进行匹配(数据评估)15s评估一次

alerting: ## 告警模块
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

rule_files: ## 告警规则(触发器)
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs: ## 后端静态配置
  - job_name: "prometheus" ### 任务名称
    static_configs: ### 静态配置
      - targets: ["10.0.0.91:9090"] ### 目标地址和端口

# 启动普罗米修斯
[root@nfs prometheus-2.47.0]# ./prometheus --config.file="prometheus.yml"

QQ图片20230928100158

浏览器访问10.0.0.91:9090

image-20230928094115361

查看后端数据

image-20230928100425837

image-20230928100437486

部署node_exporter(所有客户端都需要执行)

# 下载
node_exporter-1.6.1.linux-amd64.tar.gz

# 创建站点目录
[root@master-1 ~]# mkdir /app

# 解压
[root@master-1 ~]# tar xf node_exporter-1.6.1.linux-amd64.tar.gz -C /app/

# 改名
[root@master-1 ~]# mv /app/node_exporter-1.6.1.linux-amd64/ /app/node_exporter-1.6.1

# 软连接
[root@master-1 ~]# ln -s /app/node_exporter-1.6.1/ /app/node_exporter

# 启动node_exporter
[root@master-1 node_exporter]# ./node_exporter

image-20230928101727483

prometheus关联node_exporter

[root@nfs ~]# vim /app/prometheus/prometheus.yml 
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["10.0.0.91:9090"]

  - job_name: "master_node_exporter"
    static_configs:
      - targets: ["10.0.0.110:9100"]

 # 重新启动
 [root@nfs prometheus-2.47.0]# ./prometheus --config.file="prometheus.yml"

image-20230928102336161

prometheus动态发现

动态发现官网:TP

# 修改配置文件
[root@nfs ~]# vim /app/prometheus/prometheus.yml 
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["10.0.0.91:9090"]

  - job_name: "master_node_exporter"
    static_configs:
      - targets: ["10.0.0.110:9100"]

  - job_name: "dong tai fa xian"
    file_sd_configs:
    - files:
      - /app/prometheus/file_sd/all.yml
      refresh_interval: 5s

# 创建目录
[root@nfs ~]# mkdir /app/prometheus/file_sd/

# 编辑动态发现文件
[root@nfs ~]# vim /app/prometheus/file_sd/all.yml
[
  {
    "targets":  ["10.0.0.111:9100","10.0.0.112:9100"]
  }
]

# 重新启动
[root@nfs prometheus]# ./prometheus --config.file="prometheus.yml"

image-20230928105151940

docker部署cadvisor并使用prometheus动态发现

# 编辑动态发现文件
[root@nfs ~]# vim /app/prometheus/file_sd/all.yml
[
  {
    "targets":  ["10.0.0.111:9100","10.0.0.112:9100"],
    "labels": {
      "name": "node_exporter"
    }
  },
  {
    "targets":  ["10.0.0.111:8080"],
    "labels": {
      "name": "cAdvisor"
    }
  }
]

# docker启动cadvisor
[root@node-1 node_exporter]# docker run --volume=/:/rootfs:ro  --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/zls/data/:/var/lib/docker:ro  --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest

image-20230928110911387

Prometheus管理接口

## 健康状态
[root@node-1 ~]# curl -XGET http://10.0.0.91:9090/-/healthy
Prometheus Server is Healthy.

## 查看redy
[root@node-1 ~]# curl -XGET http://10.0.0.91:9090/-/ready
Prometheus Server is Ready.

## 启动Prometheus
[root@web01 prometheus]# ./prometheus --config.file="prometheus.yml" --web.enable-lifecycle

## 重新加载配置
[root@node-1 ~]# curl -XPUT http://10.0.0.91:9090/-/reload

## 退出
[root@node-1 ~]# curl -XPUT http://10.0.0.91:9090/-/quit

prometheus自定义监控

# 下载应用
pushgateway-1.6.2.linux-amd64.tar.gz

# 解压
[root@nfs ~]# tar xf pushgateway-1.6.2.linux-amd64.tar.gz -C /app/

# 改名
[root@nfs app]# mv pushgateway-1.6.2.linux-amd64/ pushgateway-1.6.2

# 软链接
[root@nfs app]# [root@nfs ~]# ln -s /app/pushgateway-1.6.2/ /app/pushgateway

# 启动
[root@nfs pushgateway]# ./pushgateway 

image-20230928112417065

配置prometheus拉取pushgateway数据

# 编辑动态发现文件
[root@nfs file_sd]# vim /app/prometheus/file_sd/all.yml
[
  {
    "targets":  ["10.0.0.111:9100","10.0.0.112:9100"],
    "labels": {
      "name": "node_exporter"
    }
  },
  {
    "targets":  ["10.0.0.111:8080"],
    "labels": {
      "name": "cAdvisor"
    }
  },
  {
    "targets":  ["10.0.0.91:9091"],
    "labels": {
      "name": "pushgateway"
    }
  }
]

image-20230928112722865

Prometheus自定义监控脚本

[root@master-1 ~]# mkdir script
-----------------------------------------------------------------------------------------------
## 单行数据版
cat > tcp_conn.sh <<'EOF'
#!/bin/bash
#instance_name=`hostname -i` # 该指令要求hosts文件必须有解析
# instance_name=`hostname -f | cut -d '.' -f 1` # 以点号作为分割只取第一段作为本机的主机标签
INSTANCE_NAME=`hostname -s`
# 要求机器名不能是"localhost"不然标签就没有区分了
if [ $INSTANCE_NAME == "localhost" ]
    then
        echo "Must FQDN hostname"
        exit
fi

# 定义Prometheus抓取的KEY值,用于保存TCP的wait状态相关的连接(connections)
METRICS_NAME="ljy_tcp_conn"

# 通过netstat工具抓取connected链接的数量
TCP_CONN_VALUE=`netstat -an| grep -i connected | wc -l`

# 发送数据
echo "$METRICS_NAME $TCP_CONN_VALUE" | curl --data-binary @- http://10.0.0.91:9091/metrics/job/sh-linux/instance/$INSTANCE_NAME
EOF
-----------------------------------------------------------------------------------------------

## 多行数据
#!/bin/bash

instance_name=`hostname -f | cut -d '.' -f 1` # 以点号作为分割只取第一段作为本机的主机标签

# 要求机器名不能是"localhost"不然标签就没有区分了
if [ $instance_name == "localhost" ]
    then
        echo "Must FQDN hostname"
        exit
fi

# 获取所有运行的容器名称
allname=`docker ps --format "{{.Names}}"`

function dockerruntime(){
    # 获取各个容器的启动时间
    t=`docker inspect -f '{{.State.StartedAt}}' $1`
    # 将时间转成时间戳
    t1=`date +%s -d "$t"`
    # 获取当前时间的时间戳
    t2=`date +%s`
    # 计算运行时间
    let tt=$t2-$t1
    echo $tt
    return $tt
}

# 将需要往pushgateway上传的数据写入"ljy_temp.log"文件
echo """# TYPE docker_runtime gauge
# HELP docker_runtime time sec""" > ljy_temp.log
for i in ${allname}
do
    t=`dockerruntime $i`
    echo "ljy_docker_runtime{name=\"$i\"} $t" >> ljy_temp.log # 格式化写入数据
done

# 修改地址和参数名向特定的url上传数据,数据在ljy_temp.log文件中
curl --data-binary "@ljy_temp.log" http://10.0.0.91:9091/metrics/job/docker_runtime/instance/$instance_name

# 清空临时文件
rm -f ljy_temp.log
-------------------------------------------------------------------------------------

systemd管理prometheus

vim /lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=simple
User=root
ExecStart=/app/prometheus/prometheus --config.file=/app/prometheus/prometheus.yml
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

systemd管理Pushgateway

vim /lib/systemd/system/pushgateway.service
[Unit]
Description=Pushgateway
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=simple
User=root
ExecStart=/app/pushgateway/pushgateway
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

systemd管理node_exporter

vim /lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
Type=simple
User=root
ExecStart=/app/node_exporter/node_exporter
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

获取TCP11种状态

#!/bin/bash

# 获取所有运行的容器名称
allname=

# 获取TCP11种状态的函数
tcp_status(){
  netstat -ant|grep -ci "$1"
}

# 将需要往pushgateway上传的数据写入"ljy_temp.log"文件
echo """# TYPE docker_runtime gauge
# HELP docker_runtime time sec""" > ljy_temp.log
for i in ${allname[*]};do
    count=`tcp_status $1`
    echo "tcp_status{name=\"$i\"} $count" >> ljy_tcp.log # 格式化写入数据
done

# 修改地址和参数名向特定的url上传数据,数据在ljy_temp.log文件中
curl --data-binary "@ljy_temp.log" http://10.0.0.91:9091/metrics/job/docker_runtime/instance/$HOSTNAME

# 清空临时文件
rm -f ljy_tcp.log

redis info

#!/bin/bash
allname=`redis-cli info|grep "^[a-z]"|awk -F: '{print $1}'`

echo """# TYPE tcp_status gauge
# HELP tcp_status time sec""" > zls_redis.log

for i in ${allname};do
    value=`redis-cli info|grep -w "$i"|awk -F: '{print $2}'`
    echo "redis_info{name=\"$i\"} $value" >> zls_redis.log # 格式化写入数据
done

# 修改地址和参数名向特定的url上传数据,数据在ljy_redis.log文件中
curl --data-binary "@ljy_redis.log" http://10.0.0.7:9091/metrics/job/tcp_status/instance/$HOSTNAME

通过CPU认识prometheus语法(PQL)

node_cpu_seconds_total{mode='idle'}

node_cpu_seconds_total{mode=~'i.*'}

node_cpu_seconds_total{mode!='idle'}

node_cpu_seconds_total{mode!~'i.*'}

>
<
<=
>=

指标类型

prometheus监控中对于采集过来的数据统一称为metrics数据。
metrics是一种对采样数据的总称,其并不代表一种具体的数据格式,而是一种对于度量计算单位的抽象。
当我们需要为某个系统或者某个服务做监控,统计时,就需要用到metrics。

gauge: 瞬时值,跟zabbix last()(瞬间状态)
    Gauges是最简单的度量指标,只有一个简单的返回值,或者叫瞬时状态。例如,我们想衡量一个待处理队列中任务的个数,这个个数是会变化的
    当我们要监控硬盘容量或者内存的使用量,那么就应该使用Gauges的metrics格式来衡量,因为硬盘的容量或者内存的使用量是随时间的推移,不断瞬时且无规则变化的。
    这种变化没有规律,当前是多少,采集回来就是多少
counter: 计数器类型
    Counters就是计数器,从数据量0开始积累计算,在理想情况下,只能是永远的增长,不会降低(一些特殊情况另说,比如说粉丝数,未必就是只增不减。)
    比如统计一小时,一天,一周,一个月的用户的访问量,这就是一个累加的操作。
histograms: 统计数据分布情况。
    比如最小值,最大值,中间值,还有中位数,75百分位,90百分位,95百分位,98百分位,99百分位和99.9百分位的值。
    很显然,这是一种特殊的metrics数据类型,代表的是一种近似百分比估算数值。
summary: 统计数据分布情况
    因为histogram在客户端就是简单的分桶计数,在prometheus服务端基于这么有限的数据做百分位估算,所以的确不是很准确,summary就是解决百分位准确的问题而来的。
    我们可以简单理解summary是Histogram的扩展类型,如果想要清楚的了解histograms和summary的更多细节,可自行查阅相关的文档。

promQL数据类型

即时向量:特定或全部的时间序列集合上,具有相同时间戳的一组样本称为即时向量。
范围向量:特定或全部的时间序列集合上,在指定的同一范围内的所有样本值。
标量:一个浮点型的数据值
字符串:支持使用单引号,双引号或反引号进行引用,但反引号中不会转移字符进行转义。

Prometheus函数

增量函数(counter类型)

node_cpu_seconds_total
# 在prometheus中是用来针对Counter这种持续增长的数值,截取其中的一段时间的增量。

# 一分钟内所有机器的cpu内核态增长量
increase(node_cpu_seconds_total{mode="system"}[1m])

sum函数(求和)

# cpu运行时间总和
sum(node_cpu_seconds_total{instance="10.0.0.110:9100"})

# cpu一分钟内运行时间增量总和
sum(increase(node_cpu_seconds_total{instance="10.0.0.110:9100"}[1m]))

by函数(分组)

group by

sum(increase(node_cpu_seconds_total[1m])) by(instance)
{instance="10.0.0.110:9100"}
58.133333333281726
{instance="10.0.0.111:9100"}
59.06666666666579
{instance="10.0.0.112:9100"}
59.14666666666904

rate函数(平均值)

# 获取CPU总使用时间在一分钟内的增加总量并除以60秒,计算的是每秒的增量。
rate(node_cpu_seconds_total[1m])

# 获取主机为10.0.0.111:9100的CPU总使用时间在一分钟内的增加总量并除以60秒,计算的是每秒的增量。
rate(node_cpu_seconds_total{instance="10.0.0.111:9100"}[1m])
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="idle", name="node_exporter"}
0.9482222222221833
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="iowait", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="irq", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="nice", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="softirq", name="node_exporter"}
0.00022222222222221746
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="steal", name="node_exporter"}
0
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="system", name="node_exporter"}
0.009111111111111667
{cpu="0", instance="10.0.0.111:9100", job="dong tai fa xian", mode="user", name="node_exporter"}
0.02688888888888717

topk函数(排名)

# 取出CPU平均每秒增量的前三名
topk(3,rate(node_cpu_seconds_total[1m]))

count函数(统计)

把数值符合条件的,输出数目进行累加。一般用它进行一些模糊的监控判断。
比如说企业有100台服务器,那么只有10台服务器CPU使用率高于80%的时候,这个时候不需要报警,当符合条件时,才需要报警

# 统计运行中的容器数量
count(container_last_seen{job=~"$job",instance=~"$instance",image!=""})

安装grafana

[root@nfs system]# yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-10.1.4-1.x86_64.rpm

部署alertmanager

# 下载
alertmanager-0.26.0.linux-amd64.tar.gz

# 创建站点目录
[root@master-1 ~]# mkdir /app

# 解压
[root@master-1 ~]# tar xf alertmanager-0.26.0.linux-amd64.tar.gz -C /app/

# 改名
[root@master-1 ~]# mv /app/alertmanager-0.26.0.linux-amd64 /app/alertmanager-0.26.0

# 软连接
[root@master-1 ~]# ln -s /app/alertmanager-0.26.0 /app/alertmanager

# 编写alertmanager告警配置
global:
  resolve_timeout: 5m
  smtp_from: 'xxxxxxxx@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: 'xxxxxxxx@qq.com'
  smtp_auth_password: 'xxxxxxxxxxxxxxx'
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: 'xxxxxxxx@qq.com'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

# 启动node_exporter
[root@master-1 node_exporter]# ./alertmanager --config.file=alertmanager.yml

alertmanager告警配置

global:
  resolve_timeout: 5m
  smtp_from: 'xxxxxxxx@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: 'xxxxxxxx@qq.com'
  smtp_auth_password: 'xxxxxxxxxxxxxxx'
  smtp_require_tls: false
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: 'xxxxxxxx@qq.com'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

# 相关参数说明:
global:
## 解析超时时间
  resolve_timeout: 5m
## 发件人邮箱地址
  smtp_from: 'xxxxxxxx@qq.com'
## 邮箱的服务器的地址及端口,例如'smtp.qq.com:465'  
  smtp_smarthost: 'smtp.qq.com:465'
## 发送人的邮箱用户名
  smtp_auth_username: 'xxxxxxxx@qq.com'
## 发件人的邮箱密码
  smtp_auth_password: 'xxxxxxxxxxxxxxx'
## 是否基于tls加密
  smtp_require_tls: false
## 邮箱服务器,例如: 'qq.com'
  smtp_hello: 'qq.com'
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
## 重复报警的间隔时间,如果没有解决报警问题,则会间隔指定时间一直触发报警,比如:5m。
  repeat_interval: 5m
  receiver: 'email'
receivers:
## 定义接收者的名称,注意这里的name要和上面的route对应,例如:'email'
- name: 'email'
  email_configs:
## 邮箱发给谁
  - to: 'xxxxxxxx@qq.com'
    send_resolved: true
inhibit_rules:
  - source_match:
## 匹配报警级别,例如:'critical'
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

# 启动node_exporter
[root@master-1 node_exporter]# ./alertmanager --config.file=alertmanager.yml

修改prometheus配置

[root@nfs alertmanager]# vim /app/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 10.0.0.91:9093

rule_files:
  - "/app/prometheus/gaojing/mem_rules.yml"
  - "/app/prometheus/gaojing/cpu_rules.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["10.0.0.91:9090"]

  - job_name: "master_node_exporter"
    static_configs:
      - targets: ["10.0.0.110:9100"]

  - job_name: "dong tai fa xian"
    file_sd_configs:
    - files:
      - /app/prometheus/file_sd/all.yml
      refresh_interval: 5s

## 重启prometheus
[root@nfs alertmanager]# systemctl restart prometheus

## 编写告警规则文件
groups:
- name: node-up
  rules:
  - alert: node-up
    expr: user_count{instance='10.0.0.91:9091'} > 3
    for: 15s
    labels:
      severity: 1
      team: node
    annotations:
      summary: "{{ $labels.instance }}用户超过3个"

## CPU使用率
(1- (sum(node_cpu_seconds_total{cpu='0',instance='10.0.0.110:9100',mode='idle'})/sum(node_cpu_seconds_total{cpu='0',instance='10.0.0.110:9100'}))) * 100

image-20231008205608743

image-20231008205616638

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇