17.4.6 Exporter部署、配置与安全
在生产环境中部署Exporter需遵循“最小权限、统一管理、可观测可追溯”的原则。推荐以systemd或容器方式运行,保持统一的目录结构与日志规范,便于批量运维与审计。
原理草图(采集与访问控制)
部署方式选择与规范
- systemd:适合裸机与虚拟机,便于与系统启动流程集成;统一使用专用用户运行,禁止root直接执行。
- 容器化:适合K8s与微服务场景,通过DaemonSet/Deployment实现弹性与滚动升级,挂载必要的宿主机目录。
- 二进制管理:放置于/usr/local/bin,配置文件位于/etc/<exporter>/,日志输出到journald或集中日志。
安装与systemd示例(以node_exporter为例)
# 1) 创建专用用户与目录
useradd -r -s /sbin/nologin nodeexp
mkdir -p /etc/node_exporter /var/lib/node_exporter
# 2) 安装二进制
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xf node_exporter-1.7.0.linux-amd64.tar.gz
install -m 0755 node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/node_exporter
# 3) 创建systemd服务
cat >/etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
User=nodeexp
Group=nodeexp
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=127.0.0.1:9100 \
--collector.filesystem.mount-points-exclude=^/(proc|sys|dev|run)($|/) \
--collector.netclass.ignored-devices='^lo$'
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
# 4) 启动并验证
systemctl daemon-reload
systemctl enable --now node_exporter
ss -lntp | grep 9100
curl -s http://127.0.0.1:9100/metrics | head
命令解释:
- --web.listen-address限制监听地址,避免公网暴露。
- --collector.filesystem.mount-points-exclude避免采集伪文件系统。
- --collector.netclass.ignored-devices忽略无意义网卡指标。
容器化部署示例(Docker)
# 仅监听本地,并挂载必要目录读取主机指标
docker run -d --name node_exporter \
--restart=always \
-p 127.0.0.1:9100:9100 \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /:/rootfs:ro \
prom/node-exporter:v1.7.0 \
--path.procfs=/host/proc \
--path.sysfs=/host/sys \
--path.rootfs=/rootfs
Kubernetes示例(DaemonSet,节选)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostPID: true
containers:
- name: node-exporter
image: prom/node-exporter:v1.7.0
args:
- --web.listen-address=0.0.0.0:9100
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --path.rootfs=/rootfs
ports:
- containerPort: 9100
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
- name: rootfs
mountPath: /rootfs
readOnly: true
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
基础配置要点(含示例)
- 监听地址与端口:默认0.0.0.0需改为内网网卡或本地回环。
- 采集范围:限制采集的文件系统、网卡、进程等,避免过多无用指标。
- 资源限制:设置CPU与内存上限,避免采集对业务造成影响。
- 日志与调试:开启必要的日志级别,生产环境禁用过量debug输出。
安全加固与访问控制(Nginx反向代理示例)
# 1) 生成Basic Auth账号
htpasswd -c /etc/nginx/.htpasswd promuser
# 2) Nginx配置(仅内网访问)
cat >/etc/nginx/conf.d/exporter.conf <<'EOF'
server {
listen 9101;
server_name 127.0.0.1;
auth_basic "Prometheus Exporter";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://127.0.0.1:9100;
}
}
EOF
nginx -t && systemctl reload nginx
# 3) Prometheus抓取时使用basic_auth
Prometheus配置示例(使用Basic Auth与内网端口):
scrape_configs:
- job_name: node
scrape_interval: 15s
static_configs:
- targets: ['10.0.0.10:9101']
basic_auth:
username: promuser
password: 'StrongPass'
配置示例与运维实践
- systemd服务文件建议包含User=、Restart=always、LimitNOFILE等关键字段。
- 使用配置管理(Ansible/SaltStack)统一下发Exporter版本与参数。
- 对高频采集的Exporter设置合理的scrape_interval与timeout,避免超时和负载放大。
常见风险与规避
- 端口冲突与重复采集:统一端口分配,避免同一指标多源采集导致数据混乱。
- 标签爆炸:避免动态标签(如时间戳、请求ID),保证指标稳定性与可聚合性。
- 暴露敏感信息:过滤包含账号、路径、配置内容的指标输出,必要时在代理层做脱敏。
排错清单与命令
# 1) 服务未启动
systemctl status node_exporter
journalctl -u node_exporter -n 100 --no-pager
# 2) 端口监听失败或冲突
ss -lntp | grep 9100
lsof -i:9100
# 3) 指标无法抓取
curl -s http://127.0.0.1:9100/metrics | head
curl -u promuser:StrongPass http://10.0.0.10:9101/metrics
# 4) 指标量异常或标签爆炸
curl -s http://127.0.0.1:9100/metrics | wc -l
grep -E 'label_name|instance' -n /var/log/prometheus/prometheus.log | tail
排错要点:
- 若curl本地可用但Prometheus抓不到,优先检查防火墙与安全组。
- 若指标行数陡增,检查是否引入动态标签或过宽的采集范围。
练习
1. 以systemd方式部署node_exporter,将监听地址限制为127.0.0.1,并通过Nginx反向代理对外提供9101端口访问。
2. 在Prometheus中配置basic_auth抓取指标,并验证up指标为1。
3. 人为占用9100端口,观察node_exporter启动失败日志,写出排错步骤与恢复命令。