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 中添加相应的设置来完成。以下是具体步骤:
-
编辑 Prometheus 配置文件:
打开你的 Prometheus 配置文件prometheus.yml,通常位于/etc/prometheus/目录下。 -
添加 HTTP Basic Auth 设置:
在配置文件中找到或添加web配置段,并在其中添加tls_config和basic_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 的配置文件中。
-
重启 Prometheus 服务:
修改配置文件后,记得重启 Prometheus 服务以应用新的设置。在大多数 Linux 系统上,你可以使用以下命令:sudo systemctl restart prometheus -
测试访问:
当你尝试通过 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_exporter 或 windows_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 的步骤:
-
编辑容器配置:
打开 PVE 的 Web 界面,找到你想要安装node_exporter的容器,点击Config编辑其配置。 -
设置 cgroup 视图:
在Unprivileged选项卡中,确保选中了CGroup Namespaces和Unified CGroup Namespace。这将允许容器看到自己的 cgroup,而不是宿主机的。 -
挂载 procfs 和 sysfs:
在Filesystem选项卡中,添加以下两个挂载点,这将使容器能够访问自己的/proc和/sys而非宿主机的:/proc挂载类型应选择procfs。/sys挂载类型应选择sysfs。
-
禁用 host networking:
确保容器没有使用host networking,否则它可能会试图使用宿主机的网络堆栈,这可能导致错误的指标。如果需要,可以为容器分配一个桥接网络接口。 -
安装 node_exporter:
在容器内安装node_exporter。这通常可以通过包管理器完成,例如在 Debian 或 Ubuntu 基础的容器中使用apt-get。 -
配置 node_exporter:
你可能需要在node_exporter的启动命令中添加额外的参数,以确保它正确地绑定到容器内部的接口。例如,你可以指定--collector.filesystem.ignored-mount-points参数来忽略宿主机的挂载点,只关注容器内部的挂载点。 -
启动或重启 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 的端口号。