【问题标题】:Sending data from one pod to another pod running specifically on the same host (DaemonSet)将数据从一个 pod 发送到专门在同一主机上运行的另一个 pod (DaemonSet)
【发布时间】:2017-06-30 21:45:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: docker kubernetes datadog


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,这就是我最终做的事情
    • 请缓存您的 NODE_NAME 的 DNS 解析,否则您的 Statsd 指标会很快耗尽您的 kubedns
    • @MarkvanStraten 正如下面的 Andy Shinn 所指出的,对于 kubernetes >=1.7,您可以直接访问主机 IP。
    【解决方案2】:

    一些初步的谷歌搜索让我通过https://github.com/kubernetes/kubernetes/issues/24657 登陆https://github.com/kubernetes/kubernetes/pull/42717。看起来拉取请求已及时合并到 Kubernetes 1.7 中。这应该意味着您可以使用 Downward 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 地址的值。

    【讨论】:

    • 好的,这有帮助,但是我该如何使用这个 IP?我设法 ping IP 但守护程序似乎没有响应,我认为这可能是我公开端口的方式的问题。在我的 pod 规范中,我输入:端口:- containerPort:8125 hostPort:8125 名称:dogstatsdport 协议:UDP
    • 你知道你使用的是什么网络实现吗?听起来您可能会遇到github.com/kubernetes/kubernetes/issues/23920。根据一条评论,您可以使用hostNetwork: true 运行 DaemonSet 作为一种解决方法。但这可能会产生其他不良影响。
    【解决方案3】:

    如果你的agent是你自己写的,你可以打开并监听一个Unix域socket,让其他pod通过它发送数据。

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

    【讨论】:

    • 他们正在使用 dogstatsd,这是 Datadog 的 statsd 兼容指标代理:docs.datadoghq.com/guides/dogstatsd。他们可以为 dogstatsd 公开一个服务,并让他们的应用程序 Pod 连接到该服务。但他们特别想将他们的 Pod 连接到在同一主机上运行的 dogstatsd DaemonSet。如果他们使用服务,那么到 dogstatsd 的连接可能是到 DaemonSet 中的任何主机,这是他们想要避免的。
    • 我觉得你还是可以写一个小代理来进行数据转发的。 proxy可以和datadogd共享一个pod,同时暴露一个Unix域。
    猜你喜欢
    • 2019-10-27
    • 2022-01-25
    • 2020-08-05
    • 1970-01-01
    • 2019-12-16
    • 2020-07-27
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多