《云原生监控》-prometheus监测技术方案

部署环境

A主机**:**

系统: CentOS 7

应用:

Docker( Prometheus + Grafana + Alertmanager + CAdvisor )

主机( Node Exporter + Consul + Confd )

B主机:

系统: CentOS 7

应用:

Docker( CAdvisor )

主机( Node Exporter )

总体图

下载:

Confd链接(0.16.0)Consul链接(1.16.1)Prometheus链接(2.4.6)

组件总压缩包:

链接:https://pan.baidu.com/s/1UdjXhSwZkujWtj8FMccl_g?pwd=8w41 
提取码:8w41 

应用介绍

介绍Prometheus

Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目,并且有公司来运作。Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。

Prometheus****现有的支持的 Exporter

Node Exporter:Node Exporter用于监控操作系统的硬件和操作系统层面的指标。它会暴露CPU利用率、内存使用率、磁盘空间、网络流量等指标给Prometheus。 下载链接

Blackbox Exporter: Blackbox Exporter用于对外部系统和服务进行主动性能、可用性和正确性的检测。它可以执行HTTP、TCP、ICMP等网络探针,通过配置的模块来监控目标的响应时间、状态码、SSL证书有效性等指标。 下载链接

Consul Exporter: Consul Exporter用于将Consul中的服务和健康检查信息导出到Prometheus中。它可以将Consul的服务、节点、健康状态等指标暴露给Prometheus进行监控和报警。 下载链接

Graphite Exporter: Graphite Exporter用于将Graphite中的指标数据导出到Prometheus中。它提供了一种将现有的Graphite监控系统和Prometheus进行整合的方式。 下载链接

Memcached Exporter: Memcached Exporter用于监控Memcached缓存服务器的性能指标。它会将Memcached的连接数、命中率、缓存大小等指标暴露给Prometheus。下载链接

MySQL Exporter: MySQL Exporter用于监控MySQL数据库的性能和状态。它会暴露MySQL的连接数、查询性能、事务状态等指标给Prometheus进行监控和告警。 下载链接

PromLens: PromLens是Prometheus的智能查询编辑器,它提供了一个可视化和交互式的方式来编写和优化Prometheus的查询语句。 下载链接

Pushgateway: Pushgateway用于持久化和集中管理临时性的指标数据。它允许非持久性的作业将指标推送到Pushgateway中,并由Prometheus进行采集,并支持批量和瞬时性的指标数据。 下载链接

StatsD Exporter: StatsD Exporter用于将StatsD格式的指标数据导出到Prometheus中。它允许现有的StatsD监控系统和Prometheus进行整合。 下载链接

介绍Consul

Consul是一个开源的服务网格和分布式一致性解决方案,由HashiCorp公司开发。它为可扩展的分布式系统提供了服务发现、健康检查、键值存储、多数据中心部署等核心功能。Consul的设计目标是简化分布式系统的构建和管理,同时提供了高可用性、可靠性和安全性。

架构图

介绍Confd

Confd是一个轻量级的配置管理工具,用于将配置文件和数据以可管理的方式保存和分发给多个应用程序或服务。它由Kong公司开发,专为构建和管理现代基础设施环境而设计。

架构图

介绍Grafana

Grafana是一个开源的数据可视化和监控平台,用于实时展示和分析各种数据源的指标、日志和事件。它提供了丰富的图表和仪表盘,使用户可以以直观和可视化的方式监控系统、应用程序、基础设施等

组件介绍

介绍CAdvisor

CAdvisor(Container Advisor)是一个开源的容器资源使用和性能分析工具,它专注于监控Docker容器以及其他容器化平台上的容器。cAdvisor可以提供关于容器 CPU、内存、磁盘和网络等资源使用情况的实时统计信息,并提供容器的历史性能数据。

介绍Alertmanager

Alertmanager是一个开源的告警处理器和路由器,用于集中管理和处理来自不同监控系统的告警通知。它是Prometheus生态系统的一部分,设计用于处理Prometheus服务器生成的告警,并提供灵活的路由和通知机制。

架构图

安装部署

注: 安装应用前先检查端口是否被占有, 端口查询命令netstat -anpt

安装Docker

1.卸载旧的版本

yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate    docker-logrotate docker-engine

2、更新yum软件包索引(安装前的工作,非必须)

yum makecache fast

yum makecache: error: argument timer: invalid choice: 'fast' (choose from 'timer')

安装报错了,yum makecache fast是centOS7的命令, 不使用8,可以直接使用

yum makecache  或者  dnf makecache

如有需要,可以安装gcc

yum -y install gcc

以及gcc-c++

yum -y install gcc-c++

需要的安装包

yum install -y yum-utils

设置镜像仓库

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

建议使用阿里云的镜像,十分快

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker docker-ce:社区版的,docker-ee:企业版的

sudo yum install docker-ce docker-ce-cli containerd.io

启动Docker

systemctl start docker 

设置Docker为开机自启

systemctl enable docker 

安装Prometheus

1.创建配置文件

mkdir  /home/prometheus
cd   /home/prometheus/
vim  prometheus.yml

文件内容如下:

global:
  scrape_interval:     15s #抓取数据的时间间隔
  evaluation_interval: 15s #触发告警检测的时间
scrape_configs:
  - job_name: prometheus  #任务名称
    static_configs:  #静态配置节点
      - targets: ['主机IP:9090']
        labels:
          instance: prometheus  #实例名称
	# Consul配置管理
  - job_name: consul-exporter
    consul_sd_configs:
      - server: '主机IP:8500'
# 告警服务配置
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['主机IP:9093']
# 告警规则加载文件
rule_files:
  - "*rule.yml"

注意: Prometheus.yml配置文件格式必须遵循yml格式

docker启动

docker run -d \
	--name=prometheus \
	--restart=always \
	-p 9090:9090 \
	-v /home/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
	-v /home/prometheus/data:/prometheus \
	prom/Prometheus

挂载这个如果把错,直接删掉这行 -v /home/prometheus/data:/prometheus \

安装 Consul

  1. 找到适合你系统的包下载他 链接 ZIP
  2. 下载后解开压缩包.拷贝Consul到你的PATH路径中 /usr/local/bin
  3. 完成安装后,检查consul安装是否成功.通过执行 consul你应该看到类似下面的输出

注: 如果你得到一个consul not be found的错误,你的PATH可能没有正确设置.请返回检查你的consul的安装路径是否包含在PATH中.

运行Agent

完成Consul的安装后,必须运行agent. agent可以运行为server或client模式.每个数据中心至少必须拥有一台server . 建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失.

其他的agent运行为client模式.一个client是一个非常轻量级的进程.用于注册服务,运行健康检查和转发对server的查询.agent必须在集群中的每个主机上运行.

启动 Consul Server

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=0.0.0.0 \
-client=0.0.0.0 \
-node=consul-server02 &> /var/log/consul.log &

运行cosnul agent以server模式,

-server : 定义agent运行在server模式

-bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用

-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0,(这里替换为主机IP)

-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名

-ui-dir: 提供存放web ui资源的路径,该目录必须是可读的

-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。

-config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载

-client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0

查看集群成员 consul members

启动成功

注:如果访问ip:8500访问不了,请检查防火墙是否开启端口

# 注册服务
curl -X PUT -d '{"id": "consul","name": "consul-node-exporter","address": "192.168.0.77","port": 8080,"tags": ["jvm-exporter"],"checks": [{"http": "http://192.168.0.77:8080/metrics","interval":"5s"}]}'  http://192.168.0.77:8500/v1/agent/service/register

name:consul的service注册名称

id:consul的实例名称

address:监控地址ip

port:监控的端口号

tags:标签名

checks:检查的节点的路径

删除

curl -v -X PUT http://192.168.0.77:8500/v1/agent/service/deregister/服务名( consul中的ID )

添加K/V

http://ip:8500/v1/kv/prometheus/rules/mysql-status

{
    "alert": "MysqlTooManyConnections(>80%)",
    "expr": "avg by (instance) (rate(mysql_global_status_threads_connected[1m])) / avg by (instance) (mysql_global_variables_max_connections) * 100 > 80",
    "for": "1m",
    "labels": {
        "severity": "warning"
    },
    "annotations": {
        "summary": "'MySQL too many connections (> 80%)'",
        "description": "'Mysql实例: 【{{ $labels.instance }}】, More than 80% of MySQL connections are in use, Current Value: {{ $value }}%'"
    }
}

注: 告警规则中有双引号的请换成单引号,否则Prometheus会识别不到

安装 Confd

  1. 下载confd二进制文件 链接 文件
  2. 重命名二进制文件,并移动到PATH的目录下

mv confd-0.16.0-linux-amd64 /prometheus目录/confd

chmod +x /prometheus目录/confd

  1. 验证是否安装成功 confd --help
  2. 创建confdir

confdir底下包含两个目录:

conf.d: confd的配置文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。

templates: 配置模板Template,即基于不同组件的配置,修改为符合 Golang text templates的模板文件。

命令: mkdir -p /etc/confd/{conf.d,templates}

注: 创建Conf.d和Templates目录时请注意名称是否正确,如不正确confd会读取不到文件.

创建confd配置文件

vim  /etc/confd/conf.d/config.toml



[template]
# 模板文件的来源路径( src要与templates中的文件名称对应 )
src = "alerts.conf.tmpl"
# 生成的配置文件的路径和名称
dest = "/home/prometheus/node-alerts-rule.yml"
# 指定需要访问和操作的配置数据的键路径
keys = [
        "/prometheus"
]
# 在模板生成配置文件之前执行的命令
check_cmd = "touch /tmp/check"
# 在配置文件发生变化并重新生成后,执行的命令
reload_cmd = "docker restart prometheus"

创建模板文件 名字自定义

vim  /etc/confd/templates/alerts.conf.tmpl

# 告警规则分组列表的开始
groups:     
# 分组名称为node-alerts               
- name: node-alerts        
# 规则列表的开始,并进入循环
  rules:                   
  # 遍历以"/prometheus/rules/"开头的所有键
  {{range gets "/prometheus/rules/*"}}  
  # 将当前键对应的值解析为JSON格式,并赋值给$data变量
  {{$data := json .Value}}  
  # 使用$data变量的alert字段的值生成alert规则
  - alert: {{$data.alert}}  
  # 使用$data变量的expr字段的值赋给expr表达式
    expr: {{$data.expr}}    
	# 使用$data变量的for字段的值赋给规则的持续时间
    for: {{$data.for}}      
	# 定义标签部分
    labels:                 
	# 使用$data变量的labels.severity字段的值作为severity标签的值
      severity: {{$data.labels.severity}}  
	  # 定义注释部分
    annotations:            
	# 使用$data变量的annotations.summary字段的值作为summary注释的值
      summary: {{$data.annotations.summary}}        
	  # 使用$data变量的annotations.description字段的值作为description注释的值
      description: {{$data.annotations.description}}  
	  # 结束循环
  {{end}}    

注: range gets "/prometheus/rules/*" 为Consul中K/V的目录地址

,其中的值必须与Consul中的Value相对于.

在Prometheus目录下启动confd

nohup ./confd -interval 3 -log-level debug -backend consul -node 192.168.0.77:8500 &

如果报错执行:nohup confd -interval 3 -log-level debug -backend consul -node 192.168.0.77:8500 &

Interval: 去后端拉取配置数据频率

log-level: 日志级别

Backend: 指定后端

Node: 节点地址

安装 Grafana

创建本地目录

mkdir /home/grafana
mkdir /home/grafana/config
mkdir /home/grafana/data

需要授权相关文件夹权限

chmod -R 777  /home/grafana
chmod -R 777  /home/grafana/config
chmod -R 777  /home/grafana/data

注:如不给文件夹授权Grafana会找不到文件夹

Docker启动Grafana

docker run -d -p 3000:3000 --name=grafana grafana/grafana:9.2.0

复制Docker容器文件到本地,复制完后删除容器中的grafana

docker cp grafana:/etc/grafana/grafana.ini /home/grafana/config
docker cp grafana:/var/lib/grafana/plugins /home/grafana/
docker cp grafana:/var/lib/grafana/grafana.db /home/grafana/data
docker rm -f grafana

再启动grafana

docker run -d \
    -p 3000:3000 \
    --name=grafana \
--restart=always \
    -v /etc/localtime:/etc/localtime:ro \
    -v /home/grafana/data:/var/lib/grafana \
    -v /home/grafana/plugins/:/var/lib/grafana/plugins \
    -v /home/grafana/config/grafana.ini:/etc/grafana/grafana.ini \
    -e "GF_SECURITY_ADMIN_PASSWORD=admin" \
    -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,grafana-piechart-panel" \
    grafana/grafana:9.2.0

(如果报错把 -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,grafana-piechart-panel" 删掉)

启动成功访问ip:3000进入Grafana登录页面, 账号admin,密码admin

1.chmod -R 777 /home/tehc/grafana/ #[这是挂载的父目录,不给权限后面修改密码也不会生效]

  1. sqlite3 /home/tech/grafana/data/grafana.db

3.进入数据库

  1. update user set password = '59acf18b94d7eb0694c61e60ce44c110c7a683ac6a8f09580d626f90f4a242000746579358d77dd9e570e83fa24faa88a8a6', salt = 'F3FAxVm33R' where login = 'admin';

  2. .exit;

6.重启Grafana容器

登录成功后会让你修改密码, 修不修改都可. (如不修改登录一次会再次跳转到此页面.)

设置Prometheus数据源

模板链接, 下面是模板页面,想要监控什么去搜索栏查询就行

安装 Node Exporter

  • 解压tar压缩包 tar
  • 将解压后的文件移到 /usr/local/bin
  • mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
  • 创建自定义Node Exporter服务
  • vim /etc/systemd/system/node_exporter.service
  • 文件内容如下
  • [Unit]
  • Description=Node Exporter
  • After=network.target
  • [Service]
  • User=root
  • Type=simple
  • ExecStart=/usr/local/bin/node_exporter
  • [Install]
  • WantedBy=multi-user.target
  • 重新加载系统守护进程并启动Node Exporter服务。
  • systemctl daemon-reload
  • systemctl start node_exporter
  • 检查Node Exporter状态,确保其处于正常运行状态。
  • systemctl status node_exporter
  • 开启服务器开机自启动Node Exporter服务。
  • systemctl enable node_exporter
  • 将node_exporter注册到consul中去

http://ip:8500/v1/agent/service/register

{
    "id": "node-exporter",
    "name": "node-exporter",
    "address": "主机IP",
    "port": 9100,
    "tags": [
        "node-exporter"
    ],
    "checks": [
        {
            "http": "http://主机IP:9100/metrics",
            "interval": "5s"
        }
    ]
}

安装 CAdvisor

Docker启动

docker run \
-v /:/rootfs:ro \
-v /var/run:/var/run:rw \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
-v /dev/disk/:/dev/disk:ro \
-p 8080:8080 \
-d --name=cadvisor \
 --restart=always \
 google/cadvisor:latest

访问ip:8080端口进入页面,如访问不到请查看是否开放端口, ​​​​​​指标含义

将CAdvisor注册到Consul服务中去

http://192.168.0.77:8500/v1/agent/service/register

{
    "id": "cadvisor-node-exporter-1",
    "name": "cadvisor-node-exporter",
    "address": "ip",
    "port": 9100,
    "tags": [
        "cadvisor"
    ],
    "checks": [
        {
            "http": "http://ip:8500/metrics",
            "interval": "5s"
        }
    ]
}

安装 Alertmanager

  • 创建目录
  • mkdir -p /home/a++lertmanager++
  • mkdir -p /home/a++lertmanager/conf++
  • mkdir -p /home/a++lertmanager/conf/tmpl++
  • 创建文件
  • vim /home/a++lertmanager/++a++lertmanager.yml++
  • vim /home/alertmanager/conf/tmpl/e-mail.tmpl
  • Docker 启动
  • docker run -d --restart=always \
  • --name=alertmanager \
  • -p 9093:9093 \
  • -v /home/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  • -v /home/alertmanager/conf/tmpl:/etc/alertmanager/template \
  • prom/alertmanager
  • 访问ip:9093页面查看是否启动成功

告警规则

相关推荐
aherhuo5 小时前
kubevirt网络
linux·云原生·容器·kubernetes
catoop5 小时前
K8s 无头服务(Headless Service)
云原生·容器·kubernetes
小峰编程6 小时前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
小马爱打代码6 小时前
云原生服务网格Istio实战
云原生
Mitch3117 小时前
【漏洞复现】CVE-2021-45788 SQL Injection
sql·web安全·docker·prometheus·metersphere
运维小文7 小时前
K8S中的PV、PVC介绍和使用
docker·云原生·容器·kubernetes·存储
ζั͡山 ั͡有扶苏 ั͡✾8 小时前
Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
云原生·容器·kubernetes
Hadoop_Liang8 小时前
Kubernetes ConfigMap的创建与使用
云原生·容器·kubernetes
老猿讲编程9 小时前
技术发展历程:从 CORBA 到微服务
微服务·云原生·架构
小诸葛的博客14 小时前
istio-proxy不打印访问日志怎么解决?
云原生·istio