在 Kubernetes 上将 statsd-exporter 设置为守护进程并从 pods 向其发送指标

Setup statsd-exporter as daemon on Kubernetes and send metrics to it from pods

我想在我的 Kubernetes 集群上将 statsd-exporter 设置为 DaemonSet。它公开了一个 UDP 端口 9125,应用程序可以在该端口上使用 statsD 客户端库发送指标。 Prometheus 抓取工具可以抓取此导出器以获取应用程序或系统指标。我想将指标发送到端口 9125 上导出器中的 UDP 服务器 运行ning。我有两个选择:

  1. 将服务公开为 DaemonSet ClusterIP,然后配置 statsD 客户端使用该 IP 和端口发送指标

  2. hostNetwork 上创建 statsd-exporter 运行,并以某种方式启用 pods 将指标发送到 exporter 运行在同一个节点上。

不知何故,选项 2 似乎更好,因为我的 pods 将向同一节点上的导出器 运行ning 发送指标,但我无法将指标发送到statsd-exporter 因为我没有 pod 正在 运行 上的节点的 IP。

能否请您比较两种方法的优缺点,并建议我如何知道 pod 所在节点的 IP 地址 运行ning 以及导出器。

编辑 1

我可以通过添加环境变量来获取节点IP。

- name: NODE_IP
  valueFrom:
    fieldRef:
      fieldPath: status.hostIP

我仍然需要弄清楚哪种设置方法更好。公开类型为 ClusterIP 的服务,然后在 pod 中使用来自环境变量的 HOST:PORT 或在 pod 规范中使用 hostNetwork: true,然后使用 NODE_IP 环境变量访问它。 clusterIp 是否保证数据包将路由到与发送数据包的 pod 相同的节点?[​​=25=]

编辑 2

我探索了 headless service,我认为这最接近我想要的。但是我不确定DNS解析会return本地节点IP作为nslookup中的第一个结果。

我会推荐以下两种方法之一,两者各有利弊。

  • 快速,可能不完全安全。

使用 hostPort 设置的守护进程。它会很快,因为 pods 都在同一个节点上,但 statsd 端口会暴露。 (您需要通过其他方式保护 statsd)

  • 不如hostPort快但安全

公开服务并使用服务 dns 进行连接 (servicename.namespace.svc.cluster.local)。不如 hostPort 快,因为无法到达特定的 pod,但安全,因为集群外部的任何人都无法访问 statsd。

更多详情:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#communicating-with-daemon-pods