将数据从一个pod发送到另一个pod,专门在同一主机上运行(DaemonSet)

时间:2017-06-30 21:45:02

标签: docker kubernetes datadog

我有一个代理(datadog代理但可能是其他东西)在我的集群的所有节点上运行,通过DaemonSet部署。此代理正在收集有关主机的各种指标:cpu和内存使用情况,IO,哪些容器正在运行。

它还可以通过侦听特定端口1234来收集自定义指标。

如何将数据从pod发送到与pod相同的节点上运行的代理实例? 如果我使用Kubernetes服务,发送指标的调用将在我的所有代理之间进行负载平衡,并且我将失去发布指标的pod与其运行的主机之间的相关性。

3 个答案:

答案 0 :(得分:3)

一些初步的Google搜索通过https://github.com/kubernetes/kubernetes/pull/42717让我https://github.com/kubernetes/kubernetes/issues/24657。看起来拉动请求在Kubernetes 1.7中及时合并。这应该意味着您可以使用向下API将status.hostIP公开为环境变量(https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/)或卷(https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/)中的文件。然后,您的应用程序需要读取环境变量或文件以获取实际主机IP地址的值。

答案 1 :(得分:3)

我在kubernetes集群中使用完全相同的设置dd-agent作为DaemonSet运行。使用您评论here的相同端口映射,您只需将指标发送到运行应用程序的节点的主机名即可。

您可以使用pod规范中的向下api将节点名称添加到pods环境中:

env:
- name: NODE_NAME
  valueFrom:
    fieldRef:
      fieldPath: spec.nodeName 

然后,您只需打开与${NODE_NAME}:8125的UDP连接即可连接到datadog代理。

答案 2 :(得分:0)

如果代理是由您自己编写的,则可以打开并侦听Unix域套接字,让其他pod通过它发送数据。

如果没有,您可以编写一个小型数据代理,在Unix套接字上侦听数据。另一方面,通过与守护程序共享pod,您可以轻松地将数据发送到本地容器