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=alwaysLimitNOFILE等关键字段。
- 使用配置管理(Ansible/SaltStack)统一下发Exporter版本与参数。
- 对高频采集的Exporter设置合理的scrape_intervaltimeout,避免超时和负载放大。

常见风险与规避
- 端口冲突与重复采集:统一端口分配,避免同一指标多源采集导致数据混乱。
- 标签爆炸:避免动态标签(如时间戳、请求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启动失败日志,写出排错步骤与恢复命令。