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



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

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

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

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

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

编辑 1

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

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

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

编辑 2

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

我建议以下两种方法之一,两者都有其优点和缺点。

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

使用hostPort设置守护程序。它会很快,因为两个 pod 将位于同一节点上,但 statsd 端口将被公开。(您需要通过其他方式保护统计信息d)

  • 不如hostPort快,但安全

公开服务并使用服务 dns 进行连接 (servicename.namespace.svc.cluster.local)。没有hostPort那么快,因为无法到达特定的 pod,但很安全,因为集群外部没有人可以击中 statsd。

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

相关内容

最新更新