01-prometheus

prometheus

使用prometheus监控Linux主机:

1.部署prometheus server:

[root@k8s151 ~]# docker run -d --network host --restart always --name prometheus_server prom/prometheus:v2.37.0

启动之后再查看暴露的端口

[root@k8s151 ~]# docker history prom/prometheus:v2.37.0
IMAGE               CREATED             CREATED BY                                      SIZE         
<missing>           9 months ago        /bin/sh -c #(nop)  EXPOSE 9090                  0B    

2.部署node exporter:

node exporter是监控linux结点的一个服务,还有别的类型的exporter根据自己的需要进行选择即可

# 这个是部署在被监控端的服务器上。想要被prometheus监控就必须部署exporter。
[root@k8s152 ~]# docker  run -d --network host --restart always --name node-exporter  prom/node-exporter:v1.3.1

查看他的配置

[root@k8s152 ~]# docker history prom/node-exporter:v1.3.1
IMAGE               CREATED             CREATED BY                                      SIZE         
<missing>           16 months ago       /bin/sh -c #(nop)  EXPOSE 9100                  0B   

3.修改prometheus server的配置文件

[root@k8s151 ~]# docker exec -it prometheus_server sh
/prometheus $ vi /etc/prometheus/prometheus.yml
global:  # 通用配置。
  scrape_interval: 5s  # 指定抓取数据的间隔时间为5秒,默认是1分钟。
  evaluation_interval: 15s # 间隔多长时间去检查规则,默认是1分钟。

# 抓取数据的配置
scrape_configs:
  - job_name: "prometheus"  # 指定job的名称,会打上一个标签job="prometheus"。

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    
    static_configs: # 静态配置
      - targets: ["localhost:9090"]   # 指定要监控的目标,默认的协议是http,默认的metrics_path是'/metrics'.
      
   # 注意格式
  - job_name: "oldboyedu-linux82-nodes"
    static_configs: # 配置被监控端
      - targets: ["10.0.0.152:9100"] 

4.重启服务

[root@k8s151 ~]# docker restart prometheus_server 
prometheus_server

5.查看节点是否被监控

		5.1 验证监控目标
Status ---> Targets
		5.2 验证数据
node_cpu_seconds_total

配置服务的动态发现(基于二进制部署,不建议使用官方的镜像,有问题!)

1.基于二进制的方式部署prometheus服务端

[root@k8s151 ~]# wget http://192.168.11.253/Docker/day06-/softwares/prometheus-2.36.0.linux-amd64.tar.gz
[root@k8s151 ~]# mkdir /oldboyedu/softwares/prometheus
[root@k8s151 ~]# tar xf prometheus-2.36.0.linux-amd64.tar.gz -C /oldboyedu/softwares/prometheus

2.编写配置文件

[root@k8s151 ~]# vim /oldboyedu/softwares/prometheus/prometheus-2.36.0.linux-amd64/prometheus.yml 
...
scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "oldboyedu-linux82-nodes"
    static_configs:                    
    - targets: ["10.0.0.152:9100"]
  - job_name: "oldboyedu-linux82-dongtaifaxian"
    file_sd_configs:
    - files:
      - /tmp/linux82.yml

3.启动node

# 想要监控哪个结点就部署在哪个结点
[root@k8s151 ]# docker run -dp 19100:9100  --restart unless-stopped  -v "/:/host:ro,rslave"   --name=node_exporter   prom/node-exporter:v1.3.1   --path.rootfs /host

[root@k8s152 ~]# docker run -dp 19100:9100  --restart unless-stopped  -v "/:/host:ro,rslave"   --name=node_exporter   prom/node-exporter:v1.3.1   --path.rootfs /host

4.动态服务发现脚本

[root@k8s151 prometheus-2.36.0.linux-amd64]# cat > /tmp/linux82.yml <<EOF
> [
>   {
>     "targets": ["10.0.0.152:9100","10.0.0.151:19100","10.0.0.152:19100"]
>   }
> ]
> EOF

5.启动服务

[root@k8s151 prometheus-2.36.0.linux-amd64]# ./prometheus

6.查看webUI

PromQL语句

1.prometheus metrics type

prometheus监控中采集过来的数据统一称为Metrics数据,其并不是代表具体的数据格式,而是一种统计度量计算单位。

当我们需要为某个系统或者某个服务做监控是,就需要使用到metrics。

prometheus支持的metrics包括但不限于以下几种数据类型:
    guage: *****
        最简单的度量指标,只是一个简单的返回值,或者叫瞬时状态。
        比如说统计硬盘,内存等使用情况。
    
    couter: *****
        就是一个计数器,从数据量0开始累积计算,在理想情况下,只能是永远的增长,不会降低(有特殊情况,比如粉丝量)。
        比如统计1小时,1天,1周,1一个月的用户访问量,这就是一个累加的操作。
        
    histograms:
        是统计数据的分布情况,比如最小值,最大值,中间值,中位数等,代表的是一种近似百分比估算数值。
        通过histograms可以分别统计处在一个时间段(1s,2s,5s,10s)内nginx访问用户的响应时间。
        
    summary:
        summary是histograms的扩展类型,主要弥补histograms不足。

2.初识PromQL

node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.102:9100"}
    使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,空闲状态使用的总时间。
    
node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.102:9100"}[1m]
    统计1分钟内,使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,空闲状态使用的总时间。
    
node_cpu_seconds_total{mode!="idle",cpu="0", instance="10.0.0.102:9100"}[1m]
    统计1分钟内,使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,非空闲状态使用的总时间。
    
node_cpu_seconds_total{mode=~"i.*",cpu="0", instance="10.0.0.102:9100"}[1m]
    统计1分钟内,使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,mode名称以字母"i"开头的所有CPU核心。

node_cpu_seconds_total{mode!~"i.*",cpu="0", instance="10.0.0.102:9100"}[1m]
    统计1分钟内,使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,mode名称不是以字母"i"开头的所有CPU核心。

CPU讲解

计算机组成部分:
 - 输入设备
 - 输出设备
 - 控制器
	- CPU 
	
	
	
	
一台电脑中:
	只有一个CPU。
	
	
	CPU ---> 多个应用程序。
	
	
	QQ , 微信, LOL
	10ns	10ns 	10ns
	10ns	10ns	10ns
	10ns	10ns	10ns
	
---> CPU 
	1秒 ---> 1000000 ns ----> 10ns ---> 100000
		---> cpu时间分片。
	

	0.5秒 ---> 
	
	1秒---》眨一次眼睛, CPU切换了10w次。
	
	
---> 

	1 ---> 
	QQ ---> 10ns + 10ns +10ns ....
	微信  ---> 10ns + 10ns +10ns ....
	
	空闲状态 ---> 10ns + 10ns +10ns ....

	----> id , user ,system, iowait , ....

Prometheus常用的函数

increase

increase函数:
    用来针对counter数据类型,截取其中一段时间总的增量。
    
    
举个例子:
    increase(node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.152:9100"}[1m])
        统计1分钟内,使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,空闲状态使用的总时间增量。

一分钟内cpu空闲世界为58秒,58秒都在闲着

sum

sum函数:
    加和的作用。
    
    
举个例子:
    sum(increase(node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.152:9100"}[1m]))
        统计1分钟内,使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,空闲状态使用的总时间增量,并将返回结果累加。

把这两个空闲的值相加等于117秒

by

by函数:
    将数据进行分组,类似于MySQL的"GROUP BY"。
    
    
举个例子:
    sum(increase(node_cpu_seconds_total{mode="idle",cpu="0"}[1m])) by (instance)
        统计1分钟内,使用标签过滤器查看第0颗CPU空闲状态,并将结果进行累加,基于instance进行分组。

根据instance进行分组,查看cpu一分钟的空闲相加的值

rate

rate函数:
    它的功能是按照设置的时间段,取counter在这个时间段中平均每秒的增量。
    
    
举个例子:
    rate(node_cpu_seconds_total{mode="idle",cpu="0", instance="10.0.0.152:9100"}[1m])
        统计1分钟内,使用标签过滤器查看"10.0.0.102:9100"节点的第0颗CPU,空闲状态使用的每秒的增量。
        
        
increase和rate如何选择:
    (1)对于采集数据频率较低的场景建议使用increase函数,因为使用rate函数可能会出现断点,比如针对硬盘容量监控。
    (2)对于采集数据频率较高的场景建议使用rate函数,比如针对CPU,内存,网络流量等都是可以基于rate函数来采集等。

就是做了一个空闲值的百分比

topk

topk函数:
    取前几位的最高值,实际使用的时候一般会用该函数进行瞬时报警,而不是为了观察曲线图。
    
举个例子:
    topk(3, rate(node_cpu_seconds_total{mode="idle",cpu="0"}[1m]))
        统计1分钟内,使用标签过滤器查看第0颗CPU,空闲状态使用的每秒的增量,只查看前3个节点。

查看前三个空闲的结点

count

count函数:
    把数值符合条件的,输出数目进行累加加和,一般用它进行一些某户的监控判断。
    比如说企业中有100台服务器,如果只有10台服务器CPU使用率高于80%时候是不需要报警的,但是数量操作70台时就需要报警了。
    
举个例子:
    count(oldboyedu_tcp_wait_conn > 500):
        假设oldboyedu_tcp_wait_conn是咱们自定义的KEY。
        整改成果一大部分去啊吧TCP等待数量大于500的机器数量。

其他函数

推荐阅读:
    https://prometheus.io/docs/prometheus/latest/querying/functions/

监控CPU的使用情况案例

统计各个节点CPU的使用率

    (1)我们需要先找到CPU相关的KEY
node_cpu_seconds_total

    (2)过滤出CPU的空闲时间({mode='idle'})和全部CPU的时间('{}')
node_cpu_seconds_total{mode='idle'}
    过滤CPU的空闲时间。
node_cpu_seconds_total{}
    此处的'{}'可以不写,因为里面没有任何参数,代表获取CPU的所有状态时间。
    
    (3)统计1分钟内CPU的增量时间
increase(node_cpu_seconds_total{mode='idle'}[1m])
    统计1分钟内CPU空闲状态的增量。
increase(node_cpu_seconds_total[1m])
    统计1分钟内CPU所有状态的增量。
    
    (4)将结果进行加和统计
sum(increase(node_cpu_seconds_total{mode='idle'}[1m]))
    将1分钟内所有CPU空闲时间的增量进行加和计算。
sum(increase(node_cpu_seconds_total[1m]))
    将1分钟内所有CPU空闲时间的增量进行加和计算。
    
    (5)按照不同节点进行分组
sum(increase(node_cpu_seconds_total{mode='idle'}[1m])) by (instance)
    将1分钟内所有CPU空闲时间的增量进行加和计算,并按照机器实例进行分组。
sum(increase(node_cpu_seconds_total[1m])) by (instance)
    将1分钟内所有CPU空闲时间的增量进行加和计算,并按照机器实例进行分组。
    
    (6)计算1分钟内CPU空闲时间的百分比
sum(increase(node_cpu_seconds_total{mode='idle'}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance)

    (7)统计1分钟内CPU的使用率,计算公式: (1 - CPU空闲时间的百分比) * 100%。
(1 - sum(increase(node_cpu_seconds_total{mode='idle'}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance)) * 100

    (8)统计1小时内CPU的使用率,计算公式: (1 - CPU空闲时间的百分比) * 100%。
(1 - sum(increase(node_cpu_seconds_total{mode='idle'}[1h])) by (instance) / sum(increase(node_cpu_seconds_total[1h])) by (instance)) * 100

计算CPU用户态的1分钟内百分比

(sum(increase(node_cpu_seconds_total{mode='user'}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance)) * 100


温馨提示:
    可以使用stress命令来进行压测CPU,即执行"stress -c 2 -v"命令即可。

计算CPU内核态的1分钟内百分比

(sum(increase(node_cpu_seconds_total{mode='system'}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance)) * 100

计算CPU IO等待时间的1分钟内百分比

(sum(increase(node_cpu_seconds_total{mode='iowait'}[1m])) by (instance) / sum(increase(node_cpu_seconds_total[1m])) by (instance)) * 100

通过top指令查看CPU

请自行对比咱们的数据和Linux系统的top命令数据是否有太大的差距。

使用Grafana展示数据

安装grafana

这里我们选择使用容器的方式运行

(1)基于rpm方式安装
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.5.4-1.x86_64.rpm
sudo yum install grafana-enterprise-8.5.4-1.x86_64.rpm


(2)基于docker方式部署
docker run -d --name=grafana -p 3000:3000 grafana/grafana-enterprise
账号:admin
密码:admin

参考链接:
    https://grafana.com/grafana/download

选择添加数据源

添加prometheus数据源

设置名称和URL地址

出现这个说明已经配置成功了

创建一个新的面板

添加想要监控的PQL语言

cadvisor:

1、通过容 器启动cadvisor

cadvisor监控当前结点有多少个容器,这些容器的信息,监控容器

node_exports是监控linux主机的指标,内存,磁盘,网络

docker run --volume=/:/rootfs:ro  --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro  --publish=8090:8080 --detach=true --name=cadvisor google/cadvisor:latest

温馨提示:
    --volume=/:/rootfs:ro
        相当于"-v /:/rootfs:ro"。

    --publish=8080:8080
        相当于"-p 8080:8080"。

    --detach=true
        相当于"-d"。
        

参考链接:
    https://github.com/google/cadvisor
    https://github.com/google/cadvisor/blob/master/deploy/Dockerfile

访问8090查看cadvisor监控的内容

在URL后面加metrics衡量指标

2.动态加载配置

[root@k8s151 ~]# cat /tmp/linux82.yml 
[
  {
    "targets": ["10.0.0.151:8090","10.0.0.152:9100","10.0.0.151:19100","10.0.0.152:19100"]
  }
]

配置变量指标

点击设置

点击添加变量

自定义变量

设置的监控指标

修改指标

加入我们设置的变量值即可,instance="$oldboyedu_linux82"

3.grafana手动定制PQL

# 上图就是根据这些指标进行监控的
参考PQL:
    # 监控容器的内存使用量
	container_memory_usage_bytes{image!="",name="cadvisor"}
	# 监控容器的内存最大使用量
	container_memory_max_usage_bytes{image!="",name="cadvisor"}
	# 监控容器的启动时间
	container_start_time_seconds{image!="",name="cadvisor"}
	# 监控容器的文件系统使用的inode数量
	container_fs_inodes_total{image != "", name="cadvisor"}
	# 监控容器的网络接受数据的总数
	container_network_receive_bytes_total{image != "", name="cadvisor"}
	# 监控容器的网络数据包传输总数
	container_network_transmit_packets_total{image != "", name="cadvisor"}

优秀模板的参考:
    count(container_last_seen{image!=""})
        监控有多少个容器。
        
    sum(container_memory_usage_bytes{image!=""})/1024/1024
        监控容器总的使用内存,并换算成MB。
        
    time() - process_start_time_seconds{job="prometheus"}
        查询Prometheus启动的时间,dashboard选择"Stat"类型。
        
    (sum(node_memory_MemTotal_bytes) - sum(node_memory_MemFree_bytes +node_memory_Buffers_bytes + node_memory_Cached_bytes) ) / sum(node_memory_MemTotal_bytes) * 100
        查询内存的使用率,dashboard选择"Gauge"类型。
        
    sum(sum by (container_name)( rate(container_cpu_usage_seconds_total[1m] ) )) / count(node_cpu_seconds_total{mode="system"}) * 100
        查询CPU的使用率,dashboard选择"Gauge"类型。
        
    sum(up)
        查询有多少个监控目标在线,dashboard选择"Stat"类型。

4.验证

从grafana官方进行拿去定义好的监控

1、搜索grafana.com---》dashboard下搜索你想要监控的内容,下图是搜索的docker

2、复制ID号

3、import导入id号

4、设置名字,数据源是选择prometheus数据源

各种好的仪表盘

不错的仪表盘

比较不错的仪表盘ID:
    179
    193
    395
    893
    10566
    10619
    11600
    

参考链接:
    https://grafana.com/grafana/dashboards/179
    https://grafana.com/grafana/dashboards/193
    https://grafana.com/grafana/dashboards/395
    https://grafana.com/grafana/dashboards/893
    https://grafana.com/grafana/dashboards/10566
    https://grafana.com/grafana/dashboards/10619
    https://grafana.com/grafana/dashboards/11600
    
    
推荐阅读:
    https://grafana.com/grafana/dashboards/

grafana迁移

1、152结点部署grafana

[root@k8s152 ~]# docker run -d --name=grafana -p 3000:3000 grafana/grafana-enterprise

部署完成

2、配置数据源

选择数据源,添加prometheus数据源,然后把prometheus的网址复制过来,起个名字即可。

需要导入内容

这个是151结点的仪表盘--点击设置

点击json格式,把这一串复制下来

拿到152这个结点搭建的grafana进行load导入

这里的folder数据源记得选择prometheus我的没选所以后面是空白,不过edit进行选可以。

除了官网导入和json导入,还有一种导入方式

基于文件导入

导入即可

今日作业:
	(1)完成课堂的所有练习并完善思维导图;
	(2)调研使用grafana实现邮件告警;
	(3)准备3台干净的环境,2核心4GB,不允许使用交换分区(不然K8S集群起不来); 拍快照!干净的环境!
cat >> /etc/hosts <<EOF
10.0.0.151 k8s151.oldboyedu.com
10.0.0.152 k8s152.oldboyedu.com
10.0.0.153 k8s153.oldboyedu.com
EOF

关闭swap

1.查看swapon分区
swapon -s
2.关闭swapoff
swapoff /dev/sda2
3.再查看一下
swapon -s
4.删除swapon路径
rm -rf /dev/sda2
5.在开机自启里删除swapon
vim /etc/fstab
posted @ 2023-06-18 16:02  猛踢瘸子nei条好腿  阅读(121)  评论(0)    收藏  举报