跳转至

Proxy


代理 Datakit 的请求,将其数据从内网发送到公网。

配置

采集器配置

挑选网络中的一个能访问外网的 DataKit,作为代理,配置其代理设置。

进入 DataKit 安装目录下的 conf.d/proxy 目录,复制 proxy.conf.sample 并命名为 proxy.conf。示例如下:

[[inputs.proxy]]
  ## choose some inner IP address
  bind = "127.0.0.1"
  ## default bind port
  port = 9530

  # allowed client IP address(in CIDR format)
  allowed_client_cidrs = []

  # verbose mode will show more info about during proxying.
  verbose = false

  # mitm: man-in-the-middle mode
  mitm = false

配置好后,重启 DataKit 即可。

目前可以通过 ConfigMap 方式注入采集器配置来开启采集器。


安全性有关的配置

某些情况下,可能需要将该代理暴露在公网,此时我们需要做一些必要的安全措施,避免该代理被攻击者利用。

  1. 开启客户端白名单控制(allowed_client_cidrs):只代理指定客户端过来的请求,如:
# 此处支持 IPv6 的 CIDR 配置
allowed_client_cidrs = ["10.0.0.0/8", "2001:db8::/32"]
  1. 如果是部署在公有云,可以在 VPC 上设置下内网 CIDR 地址访问。也可以在对应主机上增加 iptables 规则:
# 操作系统级防火墙示例(以 Linux iptables 为例)
iptables -A INPUT -p tcp --dport 9530 -s 10.0.0.0/8 -j ACCEPT  # 仅允许内网访问
iptables -A INPUT -p tcp --dport 9530 -j DROP

网络拓扑结构

如果内网 Datakit 将自己的 Proxy 指向某个已开启 Proxy 采集器的 Datakit:

[dataway]
  http_proxy = "http://some-datakit-with-proxy-ip:port"

则内网各个 Datakit 的请求流量将通过 Proxy 代理出来(此处假定 Proxy 绑定端口为 9530):

flowchart LR;
dk_A(Datakit A);
dk_B(Datakit B);
dk_C(Datakit C);
dk_X_proxy("Datakit X's Proxy(0.0.0.0:9530)");
dw(Dataway/Openway);

subgraph "内网"
dk_A --> dk_X_proxy;
dk_B --> dk_X_proxy;
dk_C --> dk_X_proxy;
end

subgraph "公网"
dk_X_proxy ==> |https://openway.guance.com|dw;
end

关于 MITM 模式

开启 MITM 模式主要是便于收集 Proxy 更详细的指标信息,其原理是:

  • 内网 Datakit 连接 Proxy 时,需信任 Proxy 采集器提供的 HTTPS 证书(该证书肯定是一个非安全的证书,其证书源在此
  • 一旦 Datakit 信任了该 HTTPS 证书,则 Proxy 采集器就能嗅探 HTTPS 包内容,继而可以记录更多请求有关的指标
  • Proxy 采集器记录完指标信息后,再将请求转发给 Dataway(用观测云安全的 HTTPS 证书)

此处 Datakit 和 Proxy 之间虽然用了不安全的证书,但仅限于内网流量。Proxy 将流量转发到公网 Dataway 的时候,仍然使用的是安全的 HTTPS 证书。

Attention

开启 MITM 模式后,会大幅度降低 Proxy 的性能,参见下面的性能测试结果。

指标

参见 Datakit 自身指标中,搜索 proxy 即可获取相关的指标。

Attention

如果不开启 mitm 功能,则不会有 datakit_input_proxy_api_totaldatakit_input_proxy_api_latency_seconds 两个指标。

性能测试

通过编写简单的 HTTP server/client 程序,基本的环境参数:

  • 硬件:Apple M1 Pro/16GB
  • OS: macOS Ventura 13
  • 服务端:一个空跑的 HTTPS 服务,它接收 /v1/write/ 的 POST 请求,直接返回 200
  • 客户端:POST 一个 170KB 左右的文本文件(metric.data)给服务端
  • 代理:本机开启的一个 Datakit Proxy 采集器(http://localhost:19530
  • 请求量:总共 16 客户端,每个客户端发送 100 个请求

命令如下:

$ ./cli -c 16 -r 100 -f metric.data -proxy http://localhost:19530

...

得出如下的性能测试结果:

  • 不开启 MITM 的性能如下:
Benchmark metrics:
# HELP api_elapsed_seconds Proxied API elapsed seconds
# TYPE api_elapsed_seconds gauge
api_elapsed_seconds 0.249329709
# HELP api_latency_seconds Proxied API latency
# TYPE api_latency_seconds summary
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.5"} 0.002227916
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.9"} 0.002964042
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.99"} 0.008195959
api_latency_seconds_sum{api="/v1/write/xxx",status="200 OK"} 3.9450724669999992
api_latency_seconds_count{api="/v1/write/xxx",status="200 OK"} 1600
# HELP api_post_bytes_total Proxied API post bytes total
# TYPE api_post_bytes_total counter
api_post_bytes_total{api="/v1/write/xxx",status="200 OK"} 2.764592e+08
  • 开启 MITM 后,性能骤降(~100X):
Benchmark metrics:
# HELP api_elapsed_seconds Proxied API elapsed seconds
# TYPE api_elapsed_seconds gauge
api_elapsed_seconds 29.454341333
# HELP api_latency_seconds Proxied API latency
# TYPE api_latency_seconds summary
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.5"} 0.29453425
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.9"} 0.405621917
api_latency_seconds{api="/v1/write/xxx",status="200 OK",quantile="0.99"} 0.479301875
api_latency_seconds_sum{api="/v1/write/xxx",status="200 OK"} 461.3323555329998
api_latency_seconds_count{api="/v1/write/xxx",status="200 OK"} 1600
# HELP api_post_bytes_total Proxied API post bytes total
# TYPE api_post_bytes_total counter
api_post_bytes_total{api="/v1/write/xxx",status="200 OK"} 2.764592e+08

结论:

  • 不开启 MITM 的情况下,TPS 约 1600/0.249329709 = 6417/s
  • 开启 MITM 后,TPS 将至 1600/29.454341333 = 54/s

不建议在生产环境开启 MITM 功能,仅用于调试或测试。

文档评价

文档内容是否对您有帮助? ×