1、Prometheus基本使用

1.1 Prometheus介绍

https://prometheus.io

https://github.com/prometheus

Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,

拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基

金会(CNCF),成为继Kubernetes之后的第二个托管项目。

  1. Prometheus 特点:
  2. 多维数据模型:由度量名称和键值对标识的时间序列数据
  3. PromQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
  4. 不依赖分布式存储,单个服务器节点可直接工作
  5. 基于HTTPpull方式采集时间序列数据
  6. 推送时间序列数据通过PushGateway组件支持
  7. 通过服务发现或静态配置发现目标
  8. 多种图形模式及仪表盘支持(grafana

1.2 Prometheus组件与架构

https://prometheus.io/docs/introduction/overview/

Prometheus(一) - 图1

  1. Prometheus Server:收集指标和存储时间序列数据,并提供查询接口
  2. ClientLibrary:客户端库
  3. Push Gateway:短期存储指标数据。主要用于临时性的任务
  4. Exporters:采集已有的第三方服务监控指标并暴露metrics
  5. Alertmanager:告警
  6. Web UI:简单的Web控制台

1.3 Prometheus部署

1.3.1 部署方式

• 二进制部署

https://prometheus.io/docs/prometheus/latest/getting_started/

• Docker部署

https://prometheus.io/docs/prometheus/latest/installation/

访问地址:http://IP:9090

  1. ./premetheus -h 命令行常用参数:
  2. --config.file="prometheus.yml" # 指定配置文件
  3. --web.listen-address= "0.0.0.0:9090" # 监听地址和端口
  4. --log.level=info # 日志级别
  5. --alertmanager.timeout=10s # 与报警组件的超时时间
  6. --storage.tsdb.path="data/ " # 数据目录
  7. --storage.tsdb.retention.time=15d # 数据保存时间,默认15天
  • promtool 检查Prometheus语法
  1. # 检查配置文件是否正确
  2. ./promtool check config prometheus.yaml

1.3.2 使用systemd服务管理Prometheus

  1. 配置为系统服务管理:
  2. # vi /usr/lib/systemd/system/prometheus.service
  3. [Unit]
  4. Description=prometheus
  5. [Service]
  6. ExecStart=/opt/monitor/prometheus/prometheus --config.file=/opt/monitor/prometheus/prometheus.yml
  7. ExecReload=/bin/kill -HUP $MAINPID
  8. KillMode=process
  9. Restart=on-failure
  10. [Install]
  11. WantedBy=multi-user.target
  12. # systemctl daemon-reload
  13. # systemctl start prometheus
  14. # systemctl enable prometheus
Prometheus添加访问时账号认证
  1. 查看prometheus相关参数

:::info —web.config.file=

:::

  1. ./prometheus --help
  2. usage: prometheus [<flags>]
  3. The Prometheus monitoring server
  4. Flags:
  5. -h, --help Show context-sensitive help (also try --help-long and --help-man).
  6. --version Show application version.
  7. --config.file="prometheus.yml"
  8. Prometheus configuration file path.
  9. --web.listen-address="0.0.0.0:9090"
  10. Address to listen on for UI, API, and telemetry.
  11. --web.config.file="" [EXPERIMENTAL] Path to configuration file that can enable TLS or authentication.
  12. ...
  1. 加密basic_auth
  1. #安装工具包
  2. yum install -y httpd-tools
  3. #生成加密密码
  4. htpasswd -nBC 12 '' | tr -d ':\n'
  5. New password: # 这里设置密码为SZ_mssq@2022,实际使用请按照自己的集群需求定义密码
  6. Re-type new password:
  7. #生成的密码信息
  8. $2y$12$Ny/LBvgnADZpCZzHIg1CQOOlvnCpPZweZd/ULT9BS159BUAQKijqq
  1. 将秘钥写入配置文件
  1. cat /data/prometheus/config.yml
  2. basic_auth_users:
  3. # 当前设置的用户名为admin, 可以设置多个
  4. admin: $2y$12$Ny/LBvgnADZpCZzHIg1CQOOlvnCpPZweZd/ULT9BS159BUAQKijqq
  1. 修改Prometheus配置文件
  1. cat prometheus.yml
  2. scrape_configs:
  3. - job_name: 'prometheus'
  4. basic_auth:
  5. username: admin
  6. password: SZ_mssq@2022
  7. static_configs:
  8. - targets: ['prometheus:9090']
  1. 添加启动环境变量
修改/usr/lib/systemd/system/prometheus.service文件,在ExecStart后面追加–web.config.file=/xx/xx/xx/config.yml
  1. ExecStart=/data/prometheus/prometheus --config.file=/data/prometheus/prometheus.yml --web.config.file=/data/prometheus/config.yml

1.3.3 docker部署

  1. 进入到加压目录或者配置文件目录
  2. docker run -d --restart always\
  3. -p 9090:9090 \
  4. --name prometheus \
  5. -v $PWD/prometheus.yml:/etc/prometheus/prometheus.yml \
  6. bitnami/prometheus
  7. # 或者
  8. docker run -d --restart always\
  9. -p 9090:9090 \
  10. --name prometheus \
  11. -v $PWD/prometheus.yml:/opt/prometheus/conf/prometheus.yml \
  12. geray/prometheus:2.36.1

1.4 Prometheus配置文件

prometheus.yml

  1. # 全局配置
  2. global:
  3. scrape_interval: 15s # 采集数据时间间隔,默认15秒
  4. evaluation_interval: 15s # 评估告警规则时间间隔,默认1分钟
  5. # scrape_timeout # 采集数据超时时间,默认10秒
  6. # 告警规则
  7. alerting: # 告警配置
  8. alertmanagers:
  9. - static_configs:
  10. - targets:
  11. # - alertmanager:9093
  12. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
  13. rule_files: # 告警规则
  14. # - "first_rules.yml"
  15. # - "second_rules.yml"
  16. # A scrape configuration containing exactly one endpoint to scrape:
  17. # Here it's Prometheus itself.
  18. scrape_configs:
  19. # 配置被监控端,称为target,每个target用job_name分组管理,又分为静态配置和服务发现
  20. - job_name: 'prometheus' # 分组管理,又分为静态配置和服务发现
  21. # metrics_path defaults to '/metrics' # 暴露接口的地址
  22. # scheme defaults to 'http'.
  23. static_configs:
  24. - targets: ['localhost:9090']
  • 每次向配置文件中配置后,重启服务开销比较大,可以使用kill热加载(signal
  1. # 检查配置文件是否正确
  2. $ ./promtool check config prometheus.yml
  3. Checking ./prometheus.yml
  4. SUCCESS: 0 rule files found
  5. # 热加载配置文件
  6. $ kill -HUP <pid>

1.5 配置文件解析

1.5.1 配置文件

参考文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/

Prometheus(一) - 图2

  1. global:全局配置
  2. scrape_interval: 15s # 采集数据时间间隔
  3. evaluation_interval: 15s # 评估告警规则时间间隔,默认1分钟
  4. scrape_timeout 5s # 采集数据超时时间,默认10秒
  5. rule_files:告警规则
  6. scrape_configs:配置被监控端,称为target,每个target
  7. job_name分组管理,又分为静态配置和服务发现
  8. alerting:告警配置
  9. remote_write/remote_read:从远程数据库读写

1.5.2 配置被监控端

Prometheus(一) - 图3

  1. 目标(targets):被监控端
  2. 实例(Instances):每个被监控端称为实例
  3. 作业(Job):具有相同目标的实例集合称为作业
  4. scrape_configs:
  5. - job_name: 'prometheus'
  6. metrics_path: '/metrics'
  7. scheme: 'http'.
  8. static_configs:
  9. - targets: ['localhost:9090']

1.5.3 监控指标数据模型

  1. 数据模型:
  2. Prometheus将所有数据存储为时间序列;
  3. 具有相同度量名称以及标签属于同一个指标;
  4. 每个时间序列都由度量标准名称和一组键值对(称为标签)唯一标识,
  5. 通过标签查询指定指标。
  6. 指标格式:
  7. <metric name>{<label name>=<label value>,...}

Prometheus(一) - 图4

Prometheus(一) - 图5

2、监控案例

2.1 如何监控服务

exporter列表:

https://prometheus.io/docs/instrumenting/exporters

Prometheus(一) - 图6

如果要想监控,前提是能获取被监控端指标数据,并且这个数据格式必须遵循Prometheus数据模型,这样才能识别和采集,一般使用exporter提供监控指标数据。

2.2 Grafana部署

Grafana是一个开源的度量分析和可视化系统。

部署文档:https://grafana.com/grafana/download

访问地址:http://IP:3000

用户名/密码:admin/admin

  • 第一次需要重置密码
  1. ./grafana-cli admin reset-admin-password admin@123

1. 解压配置

  1. tar -xf grafana-enterprise-8.5.5.linux-amd64.tar.gz
  2. ln -s grafana-8.5.5/ grafana
  3. # 创建用户授权(-M不创建用户的主目录)
  4. useradd -s /sbin/nologin -M grafana
  5. chown -R grafana:grafana /opt/grafana/
  6. mkdir /opt/grafana/{data,logs}
  7. # 修改配置文件
  8. vim /opt/grafana/conf/defaults.ini
  9. data = /opt/grafana/data
  10. logs = /opt/grafana/logs
  11. plugins = /opt/grafana/plugins
  12. provisioning = /opt/grafana/conf/provisioning

2. 使用systemd服务管理

  1. 配置为系统服务管理:
  2. vi /usr/lib/systemd/system/grafana.service
  3. [Unit]
  4. Description=grafana
  5. [Service]
  6. User=grafana
  7. Group=grafana
  8. ExecStart=/opt/grafana/bin/grafana-server -homepath=/opt/grafana
  9. ExecReload=/bin/kill -HUP $MAINPID
  10. KillMode=process
  11. Restart=on-failure
  12. [Install]
  13. WantedBy=multi-user.target
  14. systemctl daemon-reload
  15. systemctl start grafana
  16. systemctl status grafana
  17. systemctl enable grafana

Grafana只用于展示数据,但这个数据从哪里来?

需要你根据提供数据的服务选择,支持的数据源如下:(选择Prometheus,只需要指定URL即可)

添加认证如下

Prometheus(一) - 图7

3. docker部署

admin/admin

  1. docker run \
  2. --user root \
  3. -d \
  4. -p 3000:3000 \
  5. --name=grafana \
  6. -v /docker/grafana/:/var/lib/grafana \
  7. -v grafana_conf:/etc/grafana/ \
  8. grafana/grafana

2.3 监控Linux服务

使用文档:https://prometheus.io/docs/guides/node-exporter/

GitHub:https://github.com/prometheus/node_exporter

  1. node_exporter:用于监控Linux系统的指标采集器。
  2. 常用指标:
  3. CPU
  4. 内存
  5. 硬盘
  6. 网络流量
  7. 文件描述符
  8. 系统负载
  9. 系统服务
  10. 数据接口:http://IP:9100

使用systemd服务管理:

  1. wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
  2. # 配置为系统服务管理:
  3. # vi /usr/lib/systemd/system/node_exporter.service
  4. [Unit]
  5. Description=node_exporter
  6. [Service]
  7. ExecStart=/usr/local/node_exporter/node_exporter --web.listen-address=192.168.6.10:9100
  8. ExecReload=/bin/kill -HUP $MAINPID
  9. KillMode=process
  10. Restart=on-failure
  11. [Install]
  12. WantedBy=multi-user.target
  13. # systemctl daemon-reload
  14. # systemctl start node_exporter
  15. # systemctl enable node_exporter

2.3.1 添加Prometheus配置

  1. # 添加监控
  2. - job_name: 'k8s-host'
  3. metrics_path: '/metrics'
  4. scheme: 'http'
  5. static_configs:
  6. - targets: ['192.168.6.31:9100','192.168.6.32:9100']

2.3.2 添加grafana仪表盘(仪表盘ID: 9276)

https://grafana.com/grafana/dashboards/

Prometheus(一) - 图8

仪表盘ID: 9276

Prometheus(一) - 图9

Prometheus(一) - 图10

2.3.3 网络无数据 - 监控指标的设备名称不合适

例如我的是ens32网卡名称

Prometheus(一) - 图11

Prometheus(一) - 图12

2.3.4 启用HTTP认证暴露指标接口

加密:

  1. # 安装加密工具
  2. apt install apache2-utils -y
  3. yum install httpd-tools y
  4. $ htpasswd -nBC 12 '' | tr -d ':\n'
  5. New password:
  6. Re-type new password:
  7. $2y$12$8K7NFVCXqygXELVsX4mtqO2dHfoxb3CTkU2qkB/P5jAY7JgoGRLC2
  • $2y$12$8K7NFVCXqygXELVsX4mtqO2dHfoxb3CTkU2qkB/P5jAY7JgoGRLC2 (123456加密后的内容)
  1. # 启用HTTP认证
  2. $ vi /usr/local/node_exporter/config.yml
  3. basic_auth_users:
  4. # 用户名: 密码
  5. prometheus: $2y$12$8K7NFVCXqygXELVsX4mtqO2dHfoxb3CTkU2qkB/P5jAY7JgoGRLC2

指定ExecStart参数,使node_export加载该配置:

  1. ExecStart=/usr/local/node_exporter/node_exporter --web.config=/usr/local/node_exporter/config.yml
  2. systemctl daemon-reload
  3. systemctl restart node_exporter.service

Prometheus(一) - 图13

  • 用户名密码就是config.yml配置文件中的(prometheus/123456)

Prometheus监控添加认证

Prometheus(一) - 图14

  1. - job_name: 'k8s-host'
  2. metrics_path: '/metrics'
  3. scheme: 'http'
  4. basic_auth: # 添加认证
  5. username: prometheus
  6. password: 123456
  7. static_configs:
  8. - targets: ['192.168.6.31:9100','192.168.6.32:9100']

2.4 监控监控系统服务运行状态

使用node_exporter,添加相关服务启动参数

https://github.com/prometheus/node_exporter

  1. # 可以使用一下命令查看参数
  2. ./node_exporter --help
  3. ExecStart=/usr/local/node_exporter/node_exporter --web.config=/usr/local/node_exporter/config.yml --collector.systemd --collector.systemd.unit-whitelist=(docker|sshd|nginx|kubelet).service

使用PromSQL过滤查询想要的服务指标

  1. # 获取服务名称是kubelet,状态为active的指标
  2. node_systemd_unit_state{name="kubelet.service",state="active"}
  • 后面的Value值可以看到是否处于启动状态

Prometheus(一) - 图15

2.5 监控Docker服务

项目地址:https://github.com/google/cadvisor

cAdvisor (Container Advisor) :用于收集正在运行的容器资源使用和性能信息。

  1. # Docker部署cAdvisor:
  2. docker run -d --restart always \
  3. --volume=/:/rootfs:ro \
  4. --volume=/var/run:/var/run:ro \
  5. --volume=/sys:/sys:ro \
  6. --volume=/var/lib/docker/:/var/lib/docker:ro \
  7. --volume=/dev/disk/:/dev/disk:ro \
  8. --publish=8080:8080 \
  9. --detach=true \
  10. --name=cadvisor \
  11. --privileged=true \
  12. google/cadvisor:latest
  • 访问地址:ip:8080
  1. docker logs -f cadvisor
  2. W0816 09:41:28.976241 1 manager.go:349] Could not configure a source for OOM detection, disabling OOM events: open /dev/kmsg: no such file or directory
  • 该问题是由于配置权限导致,需要配置特权--privileged=true

Prometheus(一) - 图16

2.5.1 添加Prometheus配置

  1. - job_name: 'docker'
  2. static_configs:
  3. - targets: ['192.168.6.31:8080']

2.5.2 添加grafana仪表盘(仪表盘ID:193)

Prometheus(一) - 图17

2.5.3 添加多个docker导航栏

Prometheus(一) - 图18

Prometheus(一) - 图19

Prometheus(一) - 图20

Prometheus(一) - 图21

使用正则只匹配对应监控指标

Prometheus(一) - 图22

使监控对应的node指标,而不是所有的

添加过滤指标

Prometheus(一) - 图23

2.6 监控MySQL服务

项目地址:https://github.com/prometheus/mysqld_exporter

mysql_exporter:用于收集MySQL性能信息。监听端口:9104

  1. wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.14.0/mysqld_exporter-0.14.0.linux-amd64.tar.gz
  2. # docker run -d --name db -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  3. # docker exec -it db bash
  4. mysql -uroot -p123456
  5. # 设置exporter用户权限权限,查看进程,主从复制等
  6. mysql> grant PROCESS, REPLICATION CLIENT, SELECT ON *.* to 'exporter'@'%' identified by '123456';
  7. # 配置文件获取mysql服务信息
  8. # vi /usr/local/mysqld_exporter/.my.cnf
  9. [client]
  10. host=127.0.0.1
  11. port=3306
  12. user=exporter
  13. password=123456
  14. # ./mysqld_exporter --config.my-cnf=.my.cnf

.my.cnf完整配置文件:

  1. [client]
  2. host=127.0.0.1
  3. port=3306
  4. user=exporter
  5. password=123456

mysql8.0版本创建账号并赋权:

  1. # 创建账号密码
  2. create user 'exporter'@'%' identified by '123456';
  3. # 授权
  4. grant PROCESS, REPLICATION CLIENT, SELECT on *.* to 'exporter'@'%';
  5. # 刷新
  6. FLUSH PRIVILEGES;

使用systemd服务管理:

  1. # vi /usr/lib/systemd/system/mysqld_exporter.service
  2. [Unit]
  3. Description=mysqld_exporter
  4. [Service]
  5. ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf
  6. ExecReload=/bin/kill -HUP $MAINPID
  7. KillMode=process
  8. Restart=on-failure
  9. [Install]
  10. WantedBy=multi-user.target

2.6.1 添加Prometheus配置

  1. - job_name: 'mysql'
  2. static_configs:
  3. - targets: [''192.168.6.32:9104']

2.6.2 添加grafana仪表盘(仪表盘ID:7362)

  • 设置时间,默认时间太长,可能无数据

Prometheus(一) - 图24

3、Prometheus自动化监控

3.1 Prometheus服务发现概述

Prometheus添加被监控端支持两种方式:

  • 静态配置:手动配置
  • 服务发现:动态发现需要监控的Target实例

支持服务发现的来源:

• azure_sd_configs

• consul_sd_configs

• dns_sd_configs

• ec2_sd_configs

• openstack_sd_configs

• file_sd_configs

• gce_sd_configs

• kubernetes_sd_configs

• marathon_sd_configs

• nerve_sd_configs

• serverset_sd_configs

• triton_sd_configs

3.2 基于文件的服务发现

3.2.1 添加Prometheus配置

  1. # 启用基于文件的服务发现:
  2. - job_name: 'file_sd'
  3. file_sd_configs:
  4. - files: ['/opt/monitor/prometheus/sd_config/*.yml']
  5. refresh_interval: 5s # 每隔5秒检查一次

3.2.2 添加被监控端

  1. 添加被监控端:
  2. cd /opt/monitor/prometheus/sd_config/
  3. vi test.yml
  4. - targets: ['192.168.6.31:9100']

Prometheus(一) - 图25

  • 由于该服务使用了用户名密码认证,所有获取不到数据可以添加认证信息
  1. - job_name: 'file_sd'
  2. basic_auth: # 添加认证
  3. username: prometheus
  4. password: 123456
  5. file_sd_configs:
  6. - files: ['/opt/monitor/prometheus/sd_config/*.yml']
  7. refresh_interval: 5s # 每隔5秒检查一次

Prometheus(一) - 图26

3.3 基于consul的服务发现

Consul是一个分布式的服务发现和键/值存储系统。

Prometheus(一) - 图27

https://releases.hashicorp.com/consul/

3.3.1 部署consul

  1. Docker部署Consul
  2. docker run --name consul -d -p 8500:8500 consul
  3. Consul注册服务:
  4. curl -X PUT -d '{"id": "Linux-1","name": "Linux","address": "192.168.6.31","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.6.31:9100","interval": "5s"}]}' http://192.168.6.31:8500/v1/agent/service/register
  • id 相当于Prometheus配置文件中的一个实例,也就是一个监控单元
  • name 相当于一个job,也就是分组
  • tags 也就是注册的一个服务标签
  • checks 健康检查
  • 最后是一个借口地址

Prometheus(一) - 图28

Prometheus(一) - 图29

  • 由于9100启用了认证所以显示红叉

3.3.2 添加Prometheus配置 - 启用consul服务发现

  1. 启用基于consul的服务发现:
  2. - job_name: 'consul_sd'
  3. basic_auth: # 添加认证
  4. username: prometheus
  5. password: 123456
  6. consul_sd_configs:
  7. - server: 192.168.6.31:8500
  8. services: ['Linux']

Prometheus(一) - 图30

添加Linux-2

  1. curl -X PUT -d '{"id": "Linux-2","name": "Linux","address": "192.168.6.32","port": 9100,"tags": ["service"],"checks": [{"http": "http://192.168.6.32:9100","interval": "5s"}]}' http://192.168.6.31:8500/v1/agent/service/register

Prometheus(一) - 图31

3.4 Ansible+Consul实现100台主机自动监控

Prometheus(一) - 图32

Prometheus(一) - 图33

注:环境已清理

Prometheus(一) - 图34

修改Prometheus配置文件

  1. # my global config
  2. global:
  3. scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  4. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  5. # scrape_timeout is set to the global default (10s).
  6. # Alertmanager configuration
  7. alerting:
  8. alertmanagers:
  9. - static_configs:
  10. - targets:
  11. # - alertmanager:9093
  12. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
  13. rule_files:
  14. # - "first_rules.yml"
  15. # - "second_rules.yml"
  16. # A scrape configuration containing exactly one endpoint to scrape:
  17. # Here it's Prometheus itself.
  18. scrape_configs:
  19. # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  20. - job_name: 'webservers'
  21. consul_sd_configs:
  22. - server: 192.168.6.31:8500
  23. services: ['webservers']
  24. - job_name: 'dbservers'
  25. consul_sd_configs:
  26. - server: 192.168.6.31:8500
  27. services: ['dbservers']

3.4.1 准备环境清单

Prometheus(一) - 图35

清理之前环境

  1. systemctl disable node_exporter.service
  2. systemctl stop node_exporter.service
  3. rm -rf /etc/systemd/system/node_exporter.service
  4. rm -rf /usr/local/node_exporter

systed服务管理node_exporter

  1. vi /opt/monitor/ansible/node_exporter.service
  2. [Unit]
  3. Description=node_exporter
  4. [Service]
  5. ExecStart=/usr/local/node_exporter/node_exporter
  6. ExecReload=/bin/kill -HUP $MAINPID
  7. KillMode=process
  8. Restart=on-failure
  9. [Install]
  10. WantedBy=multi-user.target
  1. vi mysqld_exporter.service
  2. [Unit]
  3. Description=mysqld_exporter
  4. [Service]
  5. ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf="/usr/local/mysqld_exporter/.my.cnf"
  6. ExecReload=/bin/kill -HUP $MAINPID
  7. KillMode=process
  8. Restart=on-failure
  9. [Install]
  10. WantedBy=multi-user.target

主机清单

  1. vi /opt/monitor/ansible/hosts
  2. [webservers]
  3. 192.168.6.31 name=web1
  4. [dbservers]
  5. 192.168.6.32 name=db1
  • 两个组中有相同的ip会导致出现问题

consul-register.sh

  1. vi /opt/monitor/ansible/consul-register.sh
  2. #!/bin/bash
  3. service_name=$1
  4. instance_id=$2
  5. ip=$3
  6. port=$4
  7. echo $service_name
  8. echo $instance_id
  9. echo $ip
  10. echo $port
  11. curl -X PUT -d '{"id": "'"$instance_id"'","name": "'"$service_name"'","address": "'"$ip"'","port": '"$port"',"tags": ["service"],"checks": [{"http": "http://'"$ip"':'"$port"'","interval": "5s"}]}' http://192.168.6.31:8500/v1/agent/service/register

认证文件

  1. vi /opt/monitor/ansible/config.yml
  2. basic_auth_users:
  3. # 用户名: 密码
  4. prometheus: $2y$12$8K7NFVCXqygXELVsX4mtqO2dHfoxb3CTkU2qkB/P5jAY7JgoGRLC2

playbook.yaml

  1. vi /opt/monitor/ansible/playbook.yaml
  2. - hosts: webservers
  3. # remote_user: root
  4. gather_facts: no
  5. # 定义变量
  6. vars:
  7. port: 9100
  8. tasks:
  9. - name: 推送二进制文件
  10. unarchive: src=node_exporter-0.17.0.linux-amd64.tar.gz dest=/usr/local
  11. - name: 重命名
  12. shell: |
  13. cd /usr/local/
  14. if [ ! -d node_exporter ];then
  15. mv node_exporter-0.17.0.linux-amd64 node_exporter
  16. fi
  17. # - name: 推送认证配置文件
  18. # copy: src=config.yml dest=/usr/local/node_exporter
  19. - name: 推送systemd服务管理配置
  20. copy: src=node_exporter.service dest=/etc/systemd/system/
  21. - name: 启动服务
  22. systemd: name=node_exporter state=started enabled=yes daemon_reload=yes
  23. - name: 推送注册脚本
  24. copy: src=consul-register.sh dest=/usr/local/bin/
  25. - name: 注册当前节点
  26. # 服务名 实例名 ip port
  27. shell: /bin/bash /usr/local/bin/consul-register.sh {{ group_names[0] }} {{ name }} {{ inventory_hostname }} {{ port }}
  • mysqld_exporter-0.11.0.linux-amd64.tar.gz 暂未使用
  • {{ group_names[0] }} 返回的是- hosts: webservers值
  • {{ name }} 返回的是hosts清单中的name
  • {{ inventory_hostname }} 当前的ip
  • {{ port }} 使用的是变量port

3.4.2 检查playbook清单,并执行

  1. ansible-playbook -v --syntax-check playbook.yaml -i hosts

执行

  1. ansible-playbook -i hosts playbook.yaml -uroot -k

Prometheus(一) - 图36

Prometheus(一) - 图37

Prometheus(一) - 图38

Prometheus(一) - 图39

3.5 监控kubernetes

  • ubuntu测试没有添加正确的token.k8s导致找不到监控指标

参考文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config

3.5.1 监控k8s概述

监控指标

Kubernetes本身监控

• Node资源利用率

• Node数量

• Pods数量(Node)

• 资源对象状态

Pod监控

• Pod数量(项目)

• 容器资源利用率

• 应用程序

Prometheus(一) - 图40

Prometheus(一) - 图41

Prometheus(一) - 图42

参考文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config

3.5.2 配置k8s服务发现 - 监控pod

1)授权

rbac.yaml

  1. kubectl apply -f rbac.yaml

2)获取Token并保存到文件

  1. kubectl get sa prometheus -n kube-system -o yaml
  2. kubectl describe secret <prometheus-token-xxx | secret名称> -n kube-system
  3. # 例如
  4. kubectl describe secret prometheus-token-ghtr9 -n kube-system | grep token: | awk '{print $2}' > /opt/prometheus/token.k8s
  • 将结果保存到指定文件中,token.k8s(Prometheus需要该token获取信息)

3、创建Job和kubeconfig_sd_configs - 添加Prometheus配置

prometheus.yml

  1. # k8s监控 配置》》》》》》》》》》》》》》》》》》》》》》》》》》》
  2. - job_name: kubernetes-nodes-cadvisor
  3. metrics_path: /metrics
  4. scheme: https
  5. kubernetes_sd_configs:
  6. - role: node
  7. api_server: https://192.168.6.20:6443
  8. bearer_token_file: /opt/prometheus/token.k8s
  9. tls_config:
  10. insecure_skip_verify: true
  11. bearer_token_file: /opt/prometheus/token.k8s
  12. tls_config:
  13. insecure_skip_verify: true
  14. relabel_configs:
  15. # 将标签(.*)作为新标签名,原有值不变
  16. - action: labelmap
  17. regex: __meta_kubernetes_node_label_(.*)
  18. # 修改NodeIP:10250为APIServerIP:6443
  19. - action: replace
  20. regex: (.*)
  21. source_labels: ["__address__"]
  22. target_label: __address__
  23. replacement: 192.168.6.20:6443
  24. # 实际访问指标接口 https://NodeIP:10250/metrics/cadvisor 这个接口只能APISERVER访问,故此重新标记标签使用APISERVER代理访问
  25. - action: replace
  26. source_labels: [__meta_kubernetes_node_name]
  27. target_label: __metrics_path__
  28. regex: (.*)
  29. replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
  30. - job_name: kubernetes-service-endpoints
  31. kubernetes_sd_configs:
  32. - role: endpoints
  33. api_server: https://192.168.6.20:6443
  34. bearer_token_file: /opt/prometheus/token.k8s
  35. tls_config:
  36. insecure_skip_verify: true
  37. bearer_token_file: /opt/prometheus/token.k8s
  38. tls_config:
  39. insecure_skip_verify: true
  40. # Service没配置注解prometheus.io/scrape的不采集
  41. relabel_configs:
  42. - action: keep
  43. regex: true
  44. source_labels:
  45. - __meta_kubernetes_service_annotation_prometheus_io_scrape
  46. # 重命名采集目标协议
  47. - action: replace
  48. regex: (https?)
  49. source_labels:
  50. - __meta_kubernetes_service_annotation_prometheus_io_scheme
  51. target_label: __scheme__
  52. # 重命名采集目标指标URL路径
  53. - action: replace
  54. regex: (.+)
  55. source_labels:
  56. - __meta_kubernetes_service_annotation_prometheus_io_path
  57. target_label: __metrics_path__
  58. # 重命名采集目标地址
  59. - action: replace
  60. regex: ([^:]+)(?::\d+)?;(\d+)
  61. replacement: $1:$2
  62. source_labels:
  63. - __address__
  64. - __meta_kubernetes_service_annotation_prometheus_io_port
  65. target_label: __address__
  66. # 将K8s标签(.*)作为新标签名,原有值不变
  67. - action: labelmap
  68. regex: __meta_kubernetes_service_label_(.+)
  69. # 生成命名空间标签
  70. - action: replace
  71. source_labels:
  72. - __meta_kubernetes_namespace
  73. target_label: kubernetes_namespace
  74. # 生成Service名称标签
  75. - action: replace
  76. source_labels:
  77. - __meta_kubernetes_service_name
  78. target_label: kubernetes_service_name
  79. - job_name: kubernetes-pods
  80. kubernetes_sd_configs:
  81. - role: pod
  82. api_server: https://192.168.6.20:6443
  83. bearer_token_file: /opt/prometheus/token.k8s
  84. tls_config:
  85. insecure_skip_verify: true
  86. bearer_token_file: /opt/prometheus/token.k8s
  87. tls_config:
  88. insecure_skip_verify: true
  89. # 重命名采集目标协议
  90. relabel_configs:
  91. - action: keep
  92. regex: true
  93. source_labels:
  94. - __meta_kubernetes_pod_annotation_prometheus_io_scrape
  95. # 重命名采集目标指标URL路径
  96. - action: replace
  97. regex: (.+)
  98. source_labels:
  99. - __meta_kubernetes_pod_annotation_prometheus_io_path
  100. target_label: __metrics_path__
  101. # 重命名采集目标地址
  102. - action: replace
  103. regex: ([^:]+)(?::\d+)?;(\d+)
  104. replacement: $1:$2
  105. source_labels:
  106. - __address__
  107. - __meta_kubernetes_pod_annotation_prometheus_io_port
  108. target_label: __address__
  109. # 将K8s标签(.*)作为新标签名,原有值不变
  110. - action: labelmap
  111. regex: __meta_kubernetes_pod_label_(.+)
  112. # 生成命名空间标签
  113. - action: replace
  114. source_labels:
  115. - __meta_kubernetes_namespace
  116. target_label: kubernetes_namespace
  117. # 生成Service名称标签
  118. - action: replace
  119. source_labels:
  120. - __meta_kubernetes_pod_name
  121. target_label: kubernetes_pod_name
  122. # k8s监控 结束》》》》》》》》》》》》》》》》》》》》》》》》》》》

4、Grafana导入仪表盘

K8S集群资源监控-2020.json

3.5.3 配置k8s服务发现 - 监控资源对象

1、部署kube-state-metrics

kube-state-metrics.yaml

  1. kubectl create -f kube-state-metrics.yaml
  2. kubectl get -f kube-state-metrics.yaml | grep service | grep -i clusterIP | awk '{print $3}'
  3. metrics_ip=$(kubectl get -f kube-state-metrics.yaml | grep service | grep -i clusterIP | awk '{print $3}')
  4. echo $metrics_ip
  5. curl $metrics_ip:8080/metrics

检查是否可以被监听到

2、添加prometheus配置

prometheus.yml

改文件和上面的配置一样

3、Grafana导入仪表盘 K8S资源对象状态监控-2020.json

Prometheus(一) - 图43

Prometheus(一) - 图44

3.5.4 集群外部署问题解决

  • 以上Prometheus都是在k8s集群的节点中部署的,所以不存在访问pod内部ip问题
  • 集群之外部署会存在PodIP无法获取问题

1、开启路由转发

  • 这里是同网段,可以直接添加路由表
  • 如果是跨网段,需要在上层添加路由表
  1. # Prometheus节点添加路由表
  2. ip route add 10.244.0.0/16 via 192.168.31.71 dev ens33
  3. # 查看添加的路由表
  4. ip route
  • 192.168.31.71 是k8s集群master地址

Prometheus(一) - 图45