如何找到您的应用 运行 所在的 Kubernetes 节点(从应用内部)

How to find what Kubernetes node your app is running on (from inside app)

我有一个安全要求,要在我的事件日志中包含我的应用程序实例所在的机器名称/主机名 运行。据推测,这是为了让试图追踪漏洞的安全审计员可以确定,例如,漏洞是否与一台特定的受感染机器有关。这还假设所有日志都集中收集在 SIEM 或类似的东西中,因此您需要知道每个事件的来源。

过去在单体应用程序上这总是很容易的。但是,现在我正在开发具有各种微服务的基于 Kubernetes 的云应用程序。 /etc/hostname 显示 bs pod 名称,因为每个 pod 都有自己的文件系统。 “主机名”命令似乎没有安装;即使是,我也不相信它不会只是鹦鹉学舌 /etc/hostname 中的信息。我需要从 pod 中 运行 的代码中获取 pod 运行 所在的实际机器的名称(在有人说“为什么你不使用 kubectl" 吗?);我很乐意接受包含 pod 实例的 Kubernetes 节点所在的 VM 的名称是 运行,假设一路返回到 hypervisor 机器名称是一个太远的桥梁。

应用程序(例如,使用 Kestrel 作为 Web 服务器的 C# 网络 Web 应用程序 运行)是否可以通过容器和 Pod 获取此信息?或者我可以让调度器在启动 pod 之前立即覆盖配置映射条目的合理方法,以便应用程序可以从那里读取它(是的,我们正在使用 Helm,但这是只有调度器知道的信息Pod 被实例化的时间)?或者我是否必须与网络人员争论他们的要求如何无法实现?

也许最简单的方法是使用 Kubernetes Downward API。您可以通过 Pod 规范中定义的环境变量公开节点名称:

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