Prometheus 部署

Prometheus 配置

1、yaml配置文件

Prometheus 是一个开源的系统监控和警报工具包,它通过抓取目标系统的指标来收集数据。为了配置 Prometheus,你需要编辑其配置文件,通常这个文件名为 prometheus.yml

下面是一个基本的 Prometheus 配置文件的示例结构:

global:
  scrape_interval:     15s # 设置抓取间隔时间
  evaluation_interval: 15s # 设置规则评估间隔时间

# 这个部分定义了如何从目标中抓取指标
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090'] # 监控 Prometheus 自身的指标

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100'] # 假设 node_exporter 在 localhost 的 9100 端口运行

  # 更多的 job 定义可以添加在这里...

# 这个部分定义了如何将警报发送给 Alertmanager(如果配置了)
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - localhost:9093 # 假设 Alertmanager 在 localhost 的 9093 端口运行

# 这个部分定义了 PromQL 查询规则,可以用于生成警报或可视化
rule_files:
  - "/usr/local/prometheus/rules/*.yml"

scrape_configs 部分,你可以定义不同的 job_name,每个 job 代表一组要抓取的指标源。static_configs 是一种简单的配置方式,适用于固定的目标列表。你还可以使用 file_sd_configs 或者 consul_sd_configs 等动态服务发现机制来自动发现目标。

alerting 部分,你可以指定如何将警报发送到 Alertmanager,Alertmanager 负责处理警报并将其路由到正确的接收器。

rule_files 部分,你可以指定包含 PromQL 查询规则的文件,这些规则用于基于收集的数据生成警报。

请根据你的具体需求调整这些配置项,并确保 Prometheus 有权限读取配置文件。通常,配置文件会被放在 /etc/prometheus/ 目录下,并且可以通过 Prometheus 的启动参数 -config.file 来指定配置文件的路径。例如:

prometheus --config.file=/etc/prometheus/prometheus.yml

2、Prometheus 设置密码

为 Prometheus 设置密码通常涉及到使用 HTTP Basic Authentication 来保护其 Web 界面和 API 接口。这可以通过在 Prometheus 的配置文件 prometheus.yml 中添加相应的设置来完成。以下是具体步骤:

  1. 编辑 Prometheus 配置文件
    打开你的 Prometheus 配置文件 prometheus.yml,通常位于 /etc/prometheus/ 目录下。

  2. 添加 HTTP Basic Auth 设置
    在配置文件中找到或添加 web 配置段,并在其中添加 tls_configbasic_auth 设置。tls_config 可用于 HTTPS 加密,而 basic_auth 则用于用户名和密码身份验证。

    以下是一个示例配置:

    web:
      external_url: "http://your-prometheus-url:9090"
      tls_config:
        enabled: false
      basic_auth:
        enabled: true
        users:
          - names: ["admin"]
            hashed_passwords: ["$2a$10$Xm1eH8J3qKbIzRZt9UQnXu1234567890abcdefABCDEF"]
    

    在这里,hashed_passwords 字段包含了使用 bcrypt 算法加密后的密码。你需要使用一个 bcrypt 密码哈希工具来生成这个值。例如,使用 openssl 命令行工具,你可以这样做:

    echo -n "yourpassword" | openssl passwd -apr1 -salt "your_salt"
    

    注意,上面的命令使用的是 APR1 算法,而 Prometheus 需要 bcrypt 格式的哈希,所以你应该使用一个支持 bcrypt 的工具,如 htpasswd(Apache HTTP Server 的工具)或其他类似的工具来生成密码哈希。

    例如,使用 htpasswd 工具:

    htpasswd -Bbn admin yourpassword
    

    输出将是 bcrypt 格式的哈希字符串,可以复制并粘贴到 Prometheus 的配置文件中。

  3. 重启 Prometheus 服务
    修改配置文件后,记得重启 Prometheus 服务以应用新的设置。在大多数 Linux 系统上,你可以使用以下命令:

    sudo systemctl restart prometheus
    
  4. 测试访问
    当你尝试通过 Web 浏览器或 API 请求访问 Prometheus 时,你将被要求输入用户名和密码。输入你在配置文件中设定的凭证。

请注意,使用 HTTP Basic Authentication 并不加密传输过程中的用户名和密码,除非你同时启用了 TLS/SSL 加密(通过配置 tls_config)。因此,在公共网络上,你应该始终使用 TLS 来保护 Prometheus 的通信。

Prometheus docker 部署

在 Docker 中部署 Prometheus 可以非常方便地完成,以下是基本的步骤和命令:

1、拉取 Prometheus 镜像

docker pull prom/prometheus:v2.34.0

这里以版本 v2.34.0 为例,你应该选择一个适合你需求的稳定版本。

2、创建配置目录和配置文件

在宿主机上创建一个目录来存放 Prometheus 的配置文件和数据,例如 /opt/prometheus,并在其中创建 prometheus.yml 文件。

3、编写配置文件

编写 prometheus.yml 文件,设置抓取目标、报警规则等。

4、运行 Prometheus 容器

使用 docker run 命令来启动 Prometheus 容器,记得挂载配置文件和数据目录,以及映射端口。例如:

docker run \
--privileged=true \
-u root \
--name prometheus \
--restart=always \
-p 9090:9090 \
-v /home/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /home/prometheus/data:/prometheus \
-v /home/prometheus/rules:/usr/local/prometheus/rules \
prom/prometheus:latest \
--storage.tsdb.retention.time=180d \
--config.file=/etc/prometheus/prometheus.yml

这里 -v 选项用于挂载卷,第一个参数是宿主机目录,第二个是容器内目录;--config.file 参数指定了配置文件的路径。

如果你想要 Prometheus 容器在后台运行,可以加上 -d 参数:

docker run -d ... # 其他参数保持不变

5、验证 Prometheus 是否正常运行

通过浏览器访问 http://<Docker_Host_IP>:9090,应该能看到 Prometheus 的 Web UI。

6、额外配置

如果你想要配置 Grafana、Alertmanager 或其他组件,你还需要按照类似的方式部署它们,并进行相应的配置和连接。

注意,当涉及到需要访问宿主机资源的情况时,如使用 node_exporterwindows_exporter,直接在 Docker 容器内部运行可能不是最佳实践,因为这些 exporter 需要直接访问底层系统的信息。在这种情况下,考虑在宿主机上直接运行 exporter 或者使用 host networking 和 volume mounts 来实现必要的功能。

如果你打算在多个节点上部署 Prometheus 的监控,可以考虑使用更高级的编排工具如 Docker Compose 或 Kubernetes 来管理你的 Prometheus 集群。这样可以更容易地扩展和维护你的监控基础设施。

Alertmanager 部署

部署 Alertmanager 通常涉及以下几个步骤:

1、拉取 Alertmanager 镜像

从 Docker Hub 获取 Alertmanager 的镜像。例如,你可以使用最新版本的 Alertmanager 镜像:

docker pull prom/alertmanager:v0.24.0

2、准备配置文件

创建 Alertmanager 的配置文件,通常是 alertmanager.yml。这个文件定义了接收警报的接收器(如电子邮件、Slack、企业微信等)、警报抑制规则、警报路由逻辑等。

下面是一个简单的 Alertmanager 配置文件示例:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: team-x

receivers:
- name: team-x
  webhook_configs:
  - url: "http://your-webhook-url"

inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'dev', 'instance']

3、运行 Alertmanager 容器

使用 Docker Compose 或直接用 docker run 命令启动 Alertmanager 容器。如果使用 Docker Compose,你可以在 docker-compose.yml 文件中添加一个服务条目。如果直接使用 docker run,命令如下:

docker run \
  --name=alertmanager \
  -p 9093:9093 \
  -v /path/to/your/config:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager:v0.24.0

这里 -v 参数用于挂载配置文件,确保替换 /path/to/your/config 为你的配置文件实际路径。

如果你使用 Docker Compose,你的配置可能会类似这样:

version: '3.8'

services:
  alertmanager:
    image: prom/alertmanager:v0.24.0
    container_name: alertmanager
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager:/etc/alertmanager
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
    networks:
      - monitoring

networks:
  monitoring:

4、验证 Alertmanager 是否正常运行

一旦 Alertmanager 运行起来,你可以通过浏览器访问 http://<Docker_Host_IP>:9093 来查看 Alertmanager 的 Web UI。

5、配置 Prometheus

在 Prometheus 的配置文件 prometheus.yml 中,添加对 Alertmanager 的引用,这样 Prometheus 才能向 Alertmanager 发送警报。例如,在 alerting 部分添加:

alerting:
  alertmanagers:
  - static_configs:
    - targets: ['alertmanager:9093']

确保所有相关的服务都运行在同一网络中,这样它们才能互相通信。如果需要,你也可以在 Docker Compose 中定义网络来连接 Prometheus 和 Alertmanager。

以上步骤完成后,Alertmanager 就应该能够接收到 Prometheus 发送的警报,并根据你的配置文件中的规则进行处理和转发。

Prometheus 客户端部署

node_exporter docker部署

在 Docker 中部署 node_exporter 相对简单,以下是一些基本的步骤和命令:

1、拉取 node_exporter 的 Docker 镜像:
docker pull prom/node-exporter:v1.3.1
2、 运行 node_exporter 容器:

为了使 node_exporter 能够收集宿主机的指标,你需要在容器启动时挂载一些关键目录,如 /proc, /sys/boot。同时,你可能还需要使用 --net=host 参数来让 node_exporter 直接监听在宿主机的网络接口上。

以下是一个示例命令:

docker run -d \
  --name=node_exporter \
  --net=host \
  -v /proc:/host/proc:ro \
  -v /sys:/host/sys:ro \
  -v /:/rootfs:ro \
  -v /boot:/host/boot:ro \
  prom/node-exporter:v1.3.1

这个命令做了以下事情:

  • -d 表示在后台运行容器。
  • --name=node_exporter 给容器命名为 node_exporter
  • --net=host 指定容器使用宿主机的网络栈。
  • -v 选项用于挂载宿主机的目录到容器中:
    • /proc:/host/proc:ro:挂载 /proc 目录,只读权限。
    • /sys:/host/sys:ro:挂载 /sys 目录,只读权限。
    • /:/rootfs:ro:挂载整个根文件系统,只读权限。
    • /boot:/host/boot:ro:挂载 /boot 目录,只读权限。

注意:这些挂载点是 node_exporter 收集指标所必需的,而且使用只读权限是为了提高安全性。

3、验证 node_exporter 是否正常运行:

你可以在浏览器中访问 http://<Docker_Host_IP>:9100/metrics,应该能看到一系列的系统指标输出。这些指标会被 Prometheus 服务器抓取。

4、配置 Prometheus 以抓取 node_exporter 的数据:

在 Prometheus 的配置文件 prometheus.yml 中,你需要添加一个 scrape 配置,指向 node_exporter 的地址和端口。例如:

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['<Docker_Host_IP>:9100']

这里 <Docker_Host_IP> 应该替换成你的 Docker 主机的实际 IP 地址。

请记住,挂载宿主机的关键目录到容器中会带来一定的安全风险,确保在生产环境中采取适当的安全措施,比如限制哪些用户可以访问这些数据,以及定期检查系统安全。另外,使用 --net=host 也会降低隔离性,可能会影响到容器间的网络通信。

mysql_exporter部署

在 Docker 中部署 mysql_exporter主要包括以下几个步骤:

1、 拉取 mysql_exporter 的 Docker 镜像

首先,你需要从 Docker Hub 拉取 mysql_exporter 的 Docker 镖像。在终端中执行以下命令:

docker pull prom/mysqld-exporter
2、 创建配置文件

mysql_exporter 需要一个配置文件来连接到 MySQL 数据库。创建一个 cnf 格式的配置文件,例如命名为 my.cnf。在这个文件中,你可以指定数据库的连接信息、收集的指标等。

例如:

[client]
host=mysql_db_host
port=port
user=username
password=your_password

确保替换 "mysql_db_host""username"、"port" 和 "your_password" 为你的实际 MySQL 数据库的主机名、用户名、端口和密码。

3、 运行 mysql_exporter 的 Docker 容器

使用以下命令运行 mysql_exporter 的 Docker 容器,并将配置文件挂载到容器中,默认端口为9104:

docker run -d --name mysql-exporter \
    --net host \
    -v /path/mysql_exporter/my.yml:/etc/mysql/my.yml \
    prom/mysqld-exporter \
    --config.my-cnf /etc/mysql/my.yml \
    --collect.info_schema.tables \
    --collect.info_schema.clientstats \
    --collect.info_schema.processlist

额外收集的信息需要添加mysqld-exporter命令行参数,mysqld-exporter参数如下表所示

名称 MySQL版本 描述
collect.auto_increment.columns 5.1 从information_schema收集auto_increment列及其最大值。
collect.binlog_size 5.1 收集所有注册binlog文件的当前大小。
collect.engine_innodb_status 5.1 从SHOW ENGINE INNODB STATUS收集信息。
collect.engine_tokudb_status 5.6 从SHOW ENGINE TOKUDB STATUS收集信息。
collect.global_status 5.1 从SHOW GLOBAL STATUS收集信息。(默认启用)
collect.global_variables 5.1 从SHOW GLOBAL VARIABLES收集信息。(默认启用)
collect.heartbeat 5.1 从心跳收集信息。
collect.heartbeat.database 5.1 收集心跳数据的数据库。(默认:heartbeat)
collect.heartbeat.table 5.1 收集心跳数据的表。(默认:heartbeat)
collect.heartbeat.utc 5.1 使用UTC作为当前服务器的时间戳(调用pt-heartbeat时使用--utc)。(默认:false)
collect.info_schema.clientstats 5.5 如果使用userstat=1运行,则设置为true以收集客户端统计信息。
collect.info_schema.innodb_metrics 5.6 从information_schema.innodb_metrics收集指标。
collect.info_schema.innodb_tablespaces 5.7 从information_schema.innodb_sys_tablespaces收集指标。
collect.info_schema.innodb_cmp 5.5 从information_schema.innodb_cmp收集InnoDB压缩表指标。
collect.info_schema.innodb_cmpmem 5.5 从information_schema.innodb_cmpmem收集InnoDB缓冲池压缩指标。
collect.info_schema.processlist 5.1 从information_schema.processlist收集线程状态计数。
collect.info_schema.processlist.min_time 5.1 线程必须处于每个状态的最小时间才能被计数。(默认:0)
collect.info_schema.query_response_time 5.5 如果query_response_time_stats开启,则收集查询响应时间分布。
collect.info_schema.replica_host 5.6 从information_schema.replica_host_status收集指标。
collect.info_schema.tables 5.1 从information_schema.tables收集指标。
collect.info_schema.tables.databases 5.1 要收集表统计信息的数据库列表,或'*'表示全部。
collect.info_schema.tablestats 5.1 如果使用userstat=1运行,设置为true以收集表统计信息。
collect.info_schema.schemastats 5.1 如果使用userstat=1运行,设置为true以收集模式统计信息。
collect.info_schema.userstats 5.1 如果使用userstat=1运行,设置为true以收集用户统计信息。
collect.mysql.user 5.5 从mysql.user表收集数据。
collect.perf_schema.eventsstatements 5.6 从performance_schema.events_statements_summary_by_digest收集指标。
collect.perf_schema.eventsstatements.digest_text_limit 5.6 归纳语句文本的最大长度。(默认:120)
collect.perf_schema.eventsstatements.limit 5.6 根据响应时间限制事件语句摘要的数量。(默认:250)
collect.perf_schema.eventsstatements.timelimit 5.6 限制'last_seen'事件语句可以有多旧,单位秒。(默认:86400)
collect.perf_schema.eventsstatementssum 5.7 从performance_schema.events_statements_summary_by_digest收集汇总指标。
collect.perf_schema.eventswaits 5.5 从performance_schema.events_waits_summary_global_by_event_name收集指标。
collect.perf_schema.file_events 5.6 从performance_schema.file_summary_by_event_name收集指标。
collect.perf_schema.file_instances 5.5 从performance_schema.file_summary_by_instance收集指标。
collect.perf_schema.file_instances.remove_prefix 5.5 在performance_schema.file_summary_by_instance中删除路径前缀。
collect.perf_schema.indexiowaits 5.6 从performance_schema.table_io_waits_summary_by_index_usage收集指标。
collect.perf_schema.memory_events 5.7 从performance_schema.memory_summary_global_by_event_name收集指标。
collect.perf_schema.memory_events.remove_prefix 5.7 在performance_schema.memory_summary_global_by_event_name中删除仪器前缀。
collect.perf_schema.tableiowaits 5.6 从performance_schema.table_io_waits_summary_by_table收集指标。
collect.perf_schema.tablelocks 5.6 从performance_schema.table_lock_waits_summary_by_table收集指标。
collect.perf_schema.replication_group_members 5.7 从performance_schema.replication_group_members收集指标。
collect.perf_schema.replication_group_member_stats 5.7 从performance_schema.replication_group_member_stats收集指标。
collect.perf_schema.replication_applier_status_by_worker 5.7 从performance_schema.replication_applier_status_by_worker收集指标。
collect.slave_status 5.1 从SHOW SLAVE STATUS收集信息。(默认启用)
collect.slave_hosts 5.1 从SHOW SLAVE HOSTS收集信息。
collect.sys.user_summary 5.7 从sys.x$user_summary收集指标。(默认禁用)

请注意,某些特性可能仅适用于特定版本的MySQL,因此在使用这些选项时应确保你的MySQL版本兼容。

4、 验证 mysql_exporter 是否运行正常

你可以通过访问 http://localhost:9104/metrics 来检查 mysql_exporter 是否正常运行并导出了指标。如果一切设置正确,你应该能看到一系列与 MySQL 相关的指标。

5、 配置 Prometheus

为了使 Prometheus 能够抓取 mysql_exporter 导出的指标,你需要在 Prometheus 的配置文件中添加一个新的 job。例如:

scrape_configs:
  - job_name: 'mysql'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['localhost:9104']

这将告诉 Prometheus 从运行在本地主机 9104 端口的 mysql_exporter 抓取指标。

完成以上步骤后,你的 mysql_exporter 应该已经在 Docker 中运行,并且 Prometheus 正在抓取指标。接下来,你可以在 Grafana 或其他可视化工具中使用这些指标来监控 MySQL 数据库的状态。

常见问题

1、LXC容器内Node Exporter误报告宿主机状态

当你在 Proxmox VE (PVE) 的 LXC 容器中安装并运行 node_exporter 时,默认情况下它确实会收集宿主机的状态信息而不是容器本身的。这是因为 node_exporter 默认会尝试访问 /proc, /sys, 和其他系统目录来收集指标,而这些目录在 LXC 容器中实际上是宿主机的镜像,而非容器自身的。

为了使 node_exporter 收集容器内部的状态信息,你需要在创建或编辑 LXC 容器配置时进行一些特殊的设置,以确保 node_exporter 只能看到容器内部的视图,而不是宿主机的。

以下是如何在 PVE 的 LXC 容器中正确配置 node_exporter 的步骤:

  1. 编辑容器配置
    打开 PVE 的 Web 界面,找到你想要安装 node_exporter 的容器,点击 Config 编辑其配置。

  2. 设置 cgroup 视图
    Unprivileged 选项卡中,确保选中了 CGroup NamespacesUnified CGroup Namespace。这将允许容器看到自己的 cgroup,而不是宿主机的。

  3. 挂载 procfs 和 sysfs
    Filesystem 选项卡中,添加以下两个挂载点,这将使容器能够访问自己的 /proc/sys 而非宿主机的:

    • /proc 挂载类型应选择 procfs
    • /sys 挂载类型应选择 sysfs
  4. 禁用 host networking
    确保容器没有使用 host networking,否则它可能会试图使用宿主机的网络堆栈,这可能导致错误的指标。如果需要,可以为容器分配一个桥接网络接口。

  5. 安装 node_exporter
    在容器内安装 node_exporter。这通常可以通过包管理器完成,例如在 Debian 或 Ubuntu 基础的容器中使用 apt-get

  6. 配置 node_exporter
    你可能需要在 node_exporter 的启动命令中添加额外的参数,以确保它正确地绑定到容器内部的接口。例如,你可以指定 --collector.filesystem.ignored-mount-points 参数来忽略宿主机的挂载点,只关注容器内部的挂载点。

  7. 启动或重启 node_exporter
    最后,确保 node_exporter 正确启动,并且 Prometheus 的配置已更新以指向新容器的 IP 地址和 node_exporter 的端口。

按照上述步骤操作后,node_exporter 应该能够正确地收集和报告容器内部的状态信息,而不是宿主机的信息。这将确保 Prometheus 收集到的数据是关于容器的,有助于更准确地监控和理解容器的工作负载。

2、如何修改node_exporter默认端口

修改 node_exporter 的默认监听端口(通常是 9100)可以通过编辑其启动配置或者直接修改命令行参数来实现。下面是一些常见的方法:

方法一:通过命令行参数修改

如果你是以命令行方式启动 node_exporter 的,可以直接在命令行中添加参数来改变监听端口。命令如下:

node_exporter --web.listen-address=:9200

这里的 9200 是你想要使用的新的端口号。

方法二:通过 systemd 服务文件修改

如果你使用的是 systemd 管理的系统,并且 node_exporter 是作为一个服务运行的,那么你可能需要编辑它的 .service 文件。这个文件通常位于 /etc/systemd/system/ 目录下,文件名可能是 node_exporter.service

在该文件中,你会找到一个 [Service] 部分,在这里面查找 ExecStart 行,然后修改它以包含新的端口号。例如:

[Service]
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9200

修改完成后,记得重新加载 systemd 的配置,并重启 node_exporter 服务:

sudo systemctl daemon-reload
sudo systemctl restart node_exporter

方法三:使用 Docker 容器

如果你是在 Docker 容器中运行 node_exporter 的,你可以在 docker run 命令中加入 -p 参数来映射一个新的端口。例如:

docker run -d --name node_exporter -p 9200:9100 prom/node-exporter

这里,宿主机上的 9200 端口将被映射到容器内的 9100 端口。

方法四:修改配置文件

某些部署环境下,node_exporter 可能会读取一个配置文件。在这种情况下,你可以在配置文件中设置 web.listen-address 参数来指定新的端口。

无论你采用哪种方法,确保在修改端口之后更新你的 Prometheus 配置文件中的 scrape job 设置,以便它们指向正确的端口。这样 Prometheus 才能够继续正确地从 node_exporter 收集度量数据。

例如,你的 prometheus.yml 文件中的 scrape job 配置应该类似这样:

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9200']

这里的 9200 是你修改后的 node_exporter 的端口号。