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

Sending data from one pod to another pod running specifically on the same host (DaemonSet)

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

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

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

一些初步的 Google 搜索让我进入 https://github.com/kubernetes/kubernetes/pull/42717 by way of https://github.com/kubernetes/kubernetes/issues/24657. It looks like the pull request was merged in time to be in Kubernetes 1.7. This should mean that you can use the Downward API to expose status.hostIP as an environment variable (https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/) or a file in a volume (https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/)。然后您的应用程序需要读取环境变量或文件以获取实际主机 IP 地址的值。

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

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

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

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

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

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