背景
最近公司需要部署node_exporter到各ECS中收集节点级别的指标数据,并暴露给集中式的prometheus-server抓取。但由于不同项目的ECS处于不同的VPC中,存在网络隔离。因此,可使用PushProx这个项目来完成指标流量的代理。
PushProx是一个客户端工具和代理,它允许Prometheus穿越NAT和其他类似的网络拓扑,同时仍然遵循Prometheus中的pull模型。
项目地址: https://github.com/prometheus-community/PushProx
工作方式
它适用于以下网络环境:
- Prometheus无法直接访问客户端ECS;
- Prometheus可以访问客户端所在VPC中的ECS(下称为PushProx代理),可通过内网穿透或者暴露公网的方式使其可达PushProx代理;
- 客户端ECS和PushProx代理处于同一VPC;
每个客户端由其fqdn标识,Prometheus通过PushProx抓取目标fqdn-x时,执行以下的操作过程:
- 客户端轮询代理,以获取抓取请求,并将其fqdn包含在轮询中(1);客户端发送POST请求到代理端,此时代理未响应;
- Prometheus尝试通过代理,抓取主机名为fqdn-x的目标(2)。Prometheus发送GET请求到代理端,代理根据fqdn-x路由到正确的客户端,此时代理未响应;
- 抓取请求位于轮询中的,代理发送给客户端的响应报文中,以响应步骤1中的客户端POST请求(3);
- 抓取请求由客户端执行(4);
- 抓取到的数据包含指标的响应(5),并且发布到代理中(6);
- 代理将其返回给Prometheus中(7),作为步骤2中Prometheus发送GET请求时的响应报文;
PushProx 透明地传递所有 HTTP 标头,压缩和接受编码等功能取决于抓取 Prometheus 服务器。
配置
编译
根据项目文档编译,需要自行部署go环境。编译完成后会生成两个可执行文件:
- pushprox-client
- pushprox-proxy
代理端配置
代理端和Prometheus通信
开放安全组或者防火墙,保证proxy和prometheus可相互通信。proxy默认监听8080端口,此处修改为17080端口。
代理端部署DNS服务器
由于PushProx的工作方式是基于fqdn去识别每个客户端,并且不依赖于本地的hosts文件,因此需要部署DNS服务器,并自定义fqdn的解析。
此处使用dnsmasq作为DNS服务器,并简要记载配置过程。
-
安装
yum -y install dnsmasq
-
配置
# vim /etc/dnsmasq.conf resolv-file=/etc/resolv.dnsmasq.conf # 上游dns服务器,如114.114.114.114 strict-order listen-address=172.16.50.253 addn-hosts=/etc/dnsmasq.hosts # 自定义解析记录
-
定义解析记录
# vim /etc/resolv.dnsmasq.conf nameserver 100.100.2.136 nameserver 100.100.2.138 # vim /etc/dnsmasq.hosts $IP $FQDN # 此处为自定义的A记录
-
启动并且验证
systemctl start dnsmasq systemctl enable dnsmasq vim /etc/resolv.conf # 设定DNS地址为本机地址 nameserver 172.16.1.199 dig -t A $FQDN
客户端部署node_exporter
过程略。
启动PushProx
./pushprox-proxy --web.listen-address=":17080"
启动Client
./pushprox-client --proxy-url=http://172.16.1.199:17080/
prometheus添加配置
-
prometheus是基于fqdn解析客户端,因此添加hosts解析:
vim /etc/hosts
-
添加prometheus.yml配置:
- job_name: 'xx-测试环境' proxy_url: http://proxy:17080/ static_configs: - targets: ['fqdn:9100']
-
重启prometheus
此时可观察PushProx-client和PushProx-proxy,如果无明显异常,并且可以在prometheus的UI界面上可看到抓取的client端数据,则说明配置成功。