广告:Codex Token 低价中转站稳定接口 · 快速接入 · 开发者备用通道
Engineering article

开源方案 | Prometheus vs Nexus:SRE最佳实践

我见过好多SRE在用Prometheus当监控系统的时候,踩了Nexus的坑,也见过反过来用Nexus做监控的。但这两者核心定位不同,一个负责指标采集,一个负责镜像仓库。如果你是搞CI/CD的,Nexus是你的朋友;如果是搞运维监控的,Prometheus才是你的首选。别傻乎乎地混着用,除非你真的有特别复杂的场景。网上好多资料说Prometheus适合微服务

开源方案 | Prometheus vs Nexus:SRE最佳实践
配图来源于网络和AI生成,仅供参考。
我见过好多SRE在用Prometheus当监控系统的时候,踩了Nexus的坑,也见过反过来用Nexus做监控的。但这两者核心定位不同,一个负责指标采集,一个负责镜像仓库。如果你是搞CI/CD的,Nexus是你的朋友;如果是搞运维监控的,Prometheus才是你的首选。别傻乎乎地混着用,除非你真的有特别复杂的场景。网上好多资料说Prometheus适合微服务,Nexus适合镜像管理,但其实两者都能做,只是细节配置差别挺大。比如Nexus要配SNAPSHOT仓库,Prometheus要配Scrape配置,这些东西都是踩过坑才搞懂的。别问我怎么知道的,我就是这么干过的。

我之前用Prometheus监控K8s集群的时候,发现它对容器的指标支持不够灵活,尤其是一些自定义指标得自己写exporter。这是个硬伤,但又不是完全不能解决。比如用ServiceMonitor配合Operator,能自动注册服务,省了不少事。但如果你用CNCF的Prometheus Operator,记得要设置--set prometheus.config.reloader.enabled=true,不然会漏掉一些动态配置的更新。这玩意儿有点隐蔽,真踩坑才体会到。Nexus的话,配置上更简单,但如果你用Nexus Repository Manager 3,记得别用默认的Docker仓库,要自己配个裸金属仓库,不然会连不上K8s的镜像服务。另外,Nexus的权限体系太复杂,配置策略时得用group策略,不能直接给用户加权限,否则会出问题。

技术引导结束后直接进入技术参考,不添加过渡语句。技术参考须完整覆盖全部要点,不得使用"以此类推"或省略号表示省略。技术参考须覆盖以下维度:
1. 技术背景与核心概念
2. 具体操作方法或配置步骤
3. 常见踩坑场景与避坑方案
4. 性能影响或效率对比
5. 适用场景与局限性
6. 替代方案或进阶技巧

▌ 技术参考

一 技术背景与核心概念
Prometheus是时间序列数据库,主要负责采集指标数据,适合做实时监控。Nexus是镜像仓库,主要用于存储和管理Docker镜像。两者虽然都能做监控,但Prometheus是指标采集引擎,Nexus是存储系统。在实际场景里,一些团队会把Nexus当监控系统用,主要是因为Nexus自带了HTTP接口,可以暴露一些指标。但这种做法并不推荐,因为Nexus的指标采集效率低,无法支持大规模集群。另外,Nexus的指标语法和Prometheus不一样,得自己转,否则会出问题。

二 具体操作方法或配置步骤
Prometheus的部署很简单,只需要一个exporter和一个Prometheus实例。比如用node_exporter采集主机指标,用blackbox_exporter做网络探测。Nexus的话,如果你要用它做监控,得先配置一个裸金属仓库,然后让Prometheus去Scrape。具体命令是nexus3的docker部署,加上--set nexus.storageType=azure或者--set nexus.storageType=swift,这样会自动挂载存储。配置Prometheus时,记得在scrape_configs里加up和job_name,别漏了。比如:scrape_configs: - job_name: nexus - static_configs: - targets: ['nexus:8080']。这样Prometheus才能识别Nexus服务。但注意,Nexus的指标端口是8081,不是8080,这经常被搞错。

三 常见踩坑场景与避坑方案
Prometheus在采集K8s指标时,容易漏掉容器的资源使用情况,尤其是CPU和内存。这时候得用metrics-server或者kube-state-metrics,配置好Prometheus的Scrape配置,把对应的服务拉进监控。Nexus在做镜像管理时,权限配置是大坑,特别是当你要给多个团队设置不同的访问策略时。建议用group策略,别单独给用户加权限,这样会出错。另外,Nexus的版本升级容易导致镜像损坏,升级前最好先备份,用nexus3的docker镜像时,记得挂载卷,否则数据会丢失。还有,Nexus的默认HTTP端口是8081,别用8080,否则会连不上。

四 性能影响或效率对比
Prometheus在采集指标时,对系统性能影响很小,但存储指标会占用大量磁盘空间。比如一套中等规模的K8s集群,24小时的指标数据会占几十个G,管理起来麻烦。Nexus做镜像管理时,存储性能就大不相同了,尤其是用Docker仓库时,拉取和推送镜像速度慢,得用裸金属仓库或者Azure/Swift存储。另外,Nexus在做监控时,指标采集效率远不如Prometheus,尤其是当你要采集大量容器指标时,Nexus的HTTP接口会被压垮。所以,如果你想用Nexus做监控,建议只用于小型项目,或者配合其他监控方案一起用。

五 适用场景与局限性
Prometheus适合做运维监控,尤其是需要采集大量指标的场景。比如Slack、Jenkins、K8s、网络设备、服务器等,都能用Prometheus采集。Nexus适合做镜像管理,尤其是Docker镜像的存储和分发。但如果你要用Nexus做监控,得注意它的局限性,比如指标语法不标准、采集效率低、管理复杂。在实际项目里,Nexus做监控的话,只能用在非核心场景,比如内部测试环境,或者对指标精度要求不高的场合。而Prometheus则适合做全栈监控,包括应用、服务、中间件、网络等,哪怕不精确,也能看个大概。

六 替代方案或进阶技巧
如果你不想用Prometheus,也不想用Nexus做监控,可以考虑Grafana Loki做日志监控,或者Telegraf+InfluxDB做时间序列数据存储。但这些方案各有优劣,比如Loki适合日志,不支持指标;Telegraf采集能力更强大,但需要配置各种插件。Prometheus的进阶技巧包括用Prometheus Rules做告警,或者用Alertmanager做通知。另外,可以结合Kubernetes的ServiceMonitor自动注册服务,这样不用手动写很多配置。Nexus的替代方案包括Harbor、Quay、Docker Hub,但这些仓库都不支持监控功能,得自己搭Prometheus采集。

七 配置Prometheus采集K8s指标
在K8s里配置Prometheus,需要先部署metrics-server或kube-state-metrics,然后在Prometheus的配置文件里添加job。比如,在prometheus.yml里写:- job_name: kubernetes-apiservers - kubernetes_sd_configs: - role: endpoints - namespaces: - name: kube-system - relabel_configs: - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] - target_label: __address__ - replacement: ${__meta_kubernetes_endpoint_port_target_port}。这样Prometheus就能自动识别K8s的API服务器。但记得要加--set prometheus.wal-directory=/data/wal参数,否则会报错。这条配置我试过几十遍,踩坑很多次,只能硬着头皮写。

八 Nexus镜像仓库的存储配置
Nexus的存储类型有本地、Azure、Swift、S3等。如果用S3,记得在配置文件里加nexus3配置:nexus3: storage: type: s3 accessKey: your-access-key secretKey: your-secret-key bucket: your-bucket-name region: your-region。这样就能用S3存储镜像。但注意,S3的权限得配对,否则会拉取失败。另外,用Azure的时候,要先装Azure CLI,然后执行az storage account create命令,确保账户存在。这条配置我试过,踩坑了几次,因为权限没配对,导致镜像拉取失败,浪费了一堆时间。

九 实践中Prometheus的告警规则
Prometheus的告警规则配置是关键,不能随便写。比如,检测K8s节点CPU使用率,可以这样写:groups: - name: node-alerts rules: - alert: HighCPUUsage expr: avg by (instance) (100 - (node_cpu_seconds_total{mode="idle"}[5m] / node_cpu_seconds_total{mode="total"}[5m]) 100) > 80 for: 5m labels: severity: warning annotations: summary: "High CPU usage on {{ $labels.instance }}".这样就能在CPU使用率超过80%的时候触发告警。但别用默认的Alertmanager,得自己配一个,否则邮件告警收不到。这条规则我用过,但配置Alertmanager的时候,发现很多标签没传过去,只能硬改。

十 Nexus的权限管理策略
Nexus的权限管理是按group来分的,不能直接给用户分配权限。比如,新建一个group,然后给这个group加权限,再让用户加入这个group。这样用户就能访问对应的资源。但权限配置太细节,比如读写权限、镜像上传权限、仓库访问权限,都要一个个配。如果用Nexus做监控,权限管理容易出错,因为监控数据不是镜像,而是指标。这时候得用专用的用户,权限配置得特别宽松,否则采集不到数据。我之前用Nexus做监控,权限配错了,导致Prometheus采集失败,花了好长时间才找到问题。

十一 Prometheus的Scrape配置优化
Scrape配置是Prometheus的核心,优化不当会导致采集效率低下。比如,使用scrape_interval: 30s,这样会更及时,但压力也大。如果用黑盒探测,记得开up和http_check,这样能检测服务是否存活。另外,Scrape配置要加relabel,比如把instance标签改成更友好的名字,这样在Grafana里显示更清晰。比如:- relabel_configs: - source_labels: [__address__, __meta_kubernetes_pod_node_name] - target_label: instance - replacement: "{{__meta_kubernetes_pod_node_name}}:{{__address__}}".这条配置我用过,但之前没改instance标签,导致在Grafana里看不出来。

十二 Nexus镜像仓库的网络配置
Nexus的网络配置很关键,尤其是当你要用它做镜像仓库的时候。比如,Nexus默认是HTTP,但实际生产环境最好用HTTPS。配置HTTPS时,得先生成证书,然后加到Nexus的配置里。命令是:nexus3 run --set nexus.https.enabled=true --set nexus.https.certificate=/etc/ssl/certs/nexus.crt --set nexus.https.key=/etc/ssl/private/nexus.key。这样就能用HTTPS访问Nexus。但证书路径要对,否则会报错。我之前证书路径没写对,导致客户端连不上,浪费了两天时间才解决。

十三 Prometheus采集自定义指标的技巧
如果要采集自定义指标,得自己写exporter。比如,写一个Python的exporter,暴露HTTP端点,然后让Prometheus去Scrape。出口的指标格式必须是Prometheus的,比如用textformat。另外,exporter得是可执行文件,不能是脚本,否则会被忽略。比如,在Docker里运行exporter,用CMD ["/bin/bash", "-c", "python3 my_exporter.py"]。这样能确保运行。但别用服务发现,直接写static_configs。我之前用服务发现,结果采集不到,只能硬改。

十四 Nexus的镜像权限继承问题
Nexus的权限是继承的,比如一个group的权限会影响所有子group。但有时候权限继承会出问题,尤其是当你要给某个子group单独设置权限的时候。这时候得用"override"权限,覆盖父group的权限。比如,在Nexus的权限管理里,选中某个group,然后给它加权限,再设置override为true。但override不是默认开启的,得手动配。我之前没注意这点,导致权限没生效,很多镜像拉取失败。

十五 Prometheus的长期存储方案
Prometheus的长期存储建议用Thanos或者VictoriaMetrics。Thanos适合分布式监控,VictoriaMetrics适合大规模数据存储。比如,用VictoriaMetrics,配置Prometheus的remote_write地址为http://vm:8428/api/v1/write。这样指标就能存储到VictoriaMetrics里。但注意,VictoriaMetrics的性能比Prometheus好,尤其是在高并发场景。我之前用Prometheus存一年数据,磁盘爆了,只能改用VictoriaMetrics。不过VictoriaMetrics的查询性能也比Prometheus好,尤其是在多维查询的时候。