网络安全人才转型指南:从零基础到高薪就业
2026/11/5 9:20:42
## 1. 项目概述 在运维监控领域,Prometheus+Grafana的组合已成为事实上的标准方案。这次我在AlmaLinux 8系统上通过Docker容器化部署这套监控系统,主要解决以下问题: - 传统监控方案(如Zabbix)配置复杂、资源占用高 - 需要轻量级但功能完整的监控体系,支持Linux/Windows混合环境 - 实现快速部署和灵活扩展,适应测试环境和生产环境的不同需求 整套方案包含三个核心组件: 1. **Node-Exporter**:运行在被监控主机上的轻量级数据采集器(仅15MB内存) 2. **Prometheus**:时序数据库和告警引擎(单实例可处理10万级指标) 3. **Grafana**:数据可视化平台(支持300+官方仪表盘模板) 实测在2核4G的虚拟机即可流畅运行整套系统,监控20+主机时CPU占用率低于5%。 ## 2. 环境准备与规划 ### 2.1 硬件配置建议 | 角色 | CPU | 内存 | 磁盘 | 网络 | |-----------------|------|------|--------|--------| | 监控服务器 | 2核+ | 4G+ | 100GB+ | 千兆 | | 被监控节点 | 1核 | 512MB| 10GB | 百兆 | ### 2.2 软件版本选择 ```bash # 版本验证命令 docker run --rm prom/prometheus:v2.47.0 --version docker run --rm grafana/grafana:10.1.5 --version docker run --rm prom/node-exporter:v1.6.1 --version选择版本时的经验原则:
graph TD A[Prometheus Server] -->|pull| B[Node-Exporter:9100] A -->|pull| C[Windows-Exporter:9182] D[Grafana:3000] -->|query| A关键配置要点:
firewall-cmd --permanent --add-port=9100/tcp firewall-cmd --reload# XFS文件系统优化(适合时序数据库) mkfs.xfs -f -i size=512 -l size=128m,lazy-count=1 /dev/sdb1 echo "/dev/sdb1 /data xfs defaults,noatime,nodiratime 0 0" >> /etc/fstab # 目录权限设置(关键!) mkdir -p /data/prometheus/{data,conf} chown -R 65534:65534 /data/prometheus # Prometheus容器用户version: '3.8' services: prometheus: image: prom/prometheus:v2.47.0 deploy: resources: limits: memory: 2G volumes: - /data/prometheus/data:/prometheus - ./prometheus.yml:/etc/prometheus/prometheus.yml command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.retention.time=30d' # 数据保留30天 grafana: image: grafana/grafana:10.1.5 environment: - GF_SECURITY_ADMIN_PASSWORD=StrongPassword123! - GF_USERS_ALLOW_SIGN_UP=false volumes: - /data/grafana:/var/lib/grafanadocker run -d \ --name node-exporter \ --net=host \ --pid=host \ -v "/:/host:ro,rslave" \ prom/node-exporter:v1.6.1 \ --path.rootfs=/host \ --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc)($$|/)" \ --collector.textfile.directory=/host/var/lib/node-exporter关键参数说明:
--net=host:直接使用主机网络,避免NAT性能损耗rslave:递归挂载,确保所有子挂载点可见{ "__inputs": [ { "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "", "type": "datasource", "pluginId": "prometheus", "pluginName": "Prometheus" } ] }当出现数据缺失时,按以下步骤排查:
node_memory_MemFree_bytes{instance="$node"}node_memory_MemFree→node_memory_free_bytes)job="node-exporter"→job="nodes")# 检查exporter是否正常提供指标 curl -s http://localhost:9100/metrics | head # 验证Prometheus抓取配置 docker exec -it prometheus promtool check config /etc/prometheus/prometheus.yml # 查看抓取目标状态 http://prometheus-server:9090/targets典型原因及解决:
时间范围不匹配:
变量未生效:
{ "datasource": "${DS_PROMETHEUS}", "expr": "node_cpu_seconds_total{instance=~\"$hosts\"}" }指标名称变更:
{__name__=~"node_.*"}模糊查询# prometheus.yml 关键配置 global: scrape_interval: 30s # 根据负载调整 evaluation_interval: 30s alerting: alertmanagers: - static_configs: - targets: ['alertmanager:9093'] rule_files: - '/etc/prometheus/rules/*.yml' storage: tsdb: retention: 15d # 缩短保留期降低磁盘压力graph TD A[Prometheus A] -->|远程写入| C[VictoriaMetrics] B[Prometheus B] -->|远程写入| C D[Grafana] --> C实现步骤:
remote_write: - url: http://victoriametrics:8428/api/v1/write通过textfile收集器添加自定义指标:
# 创建指标文件 echo 'node_custom_metric 42' > /var/lib/node-exporter/custom.prom # 设置定时任务更新指标 */5 * * * * echo "node_custom_metric $(date +%s)" > /var/lib/node-exporter/custom.prom监控HTTP/ICMP/TCP服务:
# prometheus.yml 新增配置 scrape_configs: - job_name: 'blackbox' metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - http://example.com relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115# Nginx反向代理配置示例 location /grafana/ { proxy_pass http://localhost:3000/; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; } location /prometheus/ { proxy_pass http://localhost:9090/; allow 192.168.1.0/24; deny all; }docker run -v /path/to/certs:/etc/grafana/certs grafana/grafana \ --config=/etc/grafana/grafana.ini \ --cert-file=/etc/grafana/certs/server.crt \ --key-file=/etc/grafana/certs/server.keytls_config: cert_file: /path/to/client.crt key_file: /path/to/client.key# Prometheus���据备份脚本 #!/bin/bash BACKUP_DIR=/backup/prometheus-$(date +%Y%m%d) mkdir -p $BACKUP_DIR docker exec prometheus tar czf - /prometheus > $BACKUP_DIR/data.tar.gz cp /opt/prometheus-grafana/prometheus.yml $BACKUP_DIR/docker compose stop prometheusdocker compose up -d prometheuscurl -s http://localhost:9090/-/healthygroups: - name: host.rules rules: - alert: HighCPUUsage expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 10m labels: severity: warning annotations: summary: "High CPU usage on {{ $labels.instance }}" description: "CPU usage is {{ $value }}%" - alert: MemoryPressure expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 20 for: 15m labels: severity: critical# Grafana变量定义 - name: service query: label_values(my_app_http_requests_total, service) refresh: OnDashboardLoad # 关键业务指标查询 sum(rate(my_app_http_requests_total{service="$service",status=~"2.."}[5m])) by (endpoint) / sum(rate(my_app_http_requests_total{service="$service"}[5m])) by (endpoint)# CPU使用率计算公式 100 - ( avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100 ) # CPU负载告警规则 node_load5 / on(instance) count by(instance)(node_cpu_seconds_total{mode="system"}) > 1.5# 内存使用率(含缓存) (node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / node_memory_MemTotal_bytes * 100 # SWAP使用告警 node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes > 1024^3 * 1 # 超过1GB使用# 添加cAdvisor监控 - job_name: 'docker' static_configs: - targets: ['cadvisor:8080'] metric_relabel_configs: - source_labels: [container_label_com_docker_swarm_service_name] target_label: service # 典型容器指标 container_cpu_usage_seconds_total{name="nginx"} container_memory_working_set_bytes{image!=""}通过Loki实现:
# promtail配置示例 scrape_configs: - job_name: system static_configs: - targets: - localhost labels: job: varlogs __path__: /var/log/*log # Grafana添加Loki数据源# 检查服务端口 ss -tulnp | grep -E '9090|3000|9100' # 验证数据采集 curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets[] | select(.health=="up")' # 检查Grafana数据源 curl -u admin:password http://localhost:3000/api/datasources -H "Content-Type: application/json"# Prometheus查询压力测试 docker run --rm -it --network host quay.io/prometheus/prometheus \ promtool tsdb bench write --metrics=10000 --out=bench.out # Grafana压力测试 docker run --rm -v $(pwd):/var/loadtest \ -e LOAD_TEST_URL=http://grafana:3000 \ -e LOAD_TEST_USERS=10 \ grafana/k6 run /var/loadtest/script.js经过完整部署和验证,这套监控系统已经可以稳定运行。在实际使用中,建议定期(每周)检查存储空间和告警规则有效性,根据业务增长适时扩展资源。对于关键业务指标,可以设置更精细的告警阈值和升级机制。