首页 > 解决方案 > 将 statsd-exporter 设置为 Kubernetes 上的守护进程,并从 pod 向其发送指标

问题描述

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

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

  2. 在 上statsd-exporter运行hostNetwork,并以某种方式使 Pod 能够将指标发送到exporter在同一节点上运行。

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

您能否比较两种方法的优缺点,并建议我如何知道 Pod 与导出器一起运行的 Node 的 IP 地址。

编辑 1

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

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

我仍然需要明确哪种方法可以更好地进行设置。使用类型公开服务,ClusterIP然后在 pod 中使用HOST:PORTfrom 环境变量或hostNetwork: true在 pod 规范中使用,然后使用NODE_IP环境变量访问它。clusterIp 是否保证数据包将被路由到与发送数据包的 pod 相同的节点?

编辑 2

我探索了无头服务,我认为这最接近我想要的。但我不确定 DNS 解析是否会返回本地节点 IP 作为nslookup.

标签: kubernetesprometheusstatsd

解决方案


我会建议以下两种方法中的一种,它们各有利弊。

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

使用hostPort. 这会很快,因为两个 pod 都在同一个节点上,但是 statsd 端口会被暴露。(您需要通过其他方式保护 statsd)

  • 速度不如hostPort但安全

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

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


推荐阅读