【问题标题】:How to make an HTTP request from a K8 pod to a NodePort service in the same cluster如何从 K8 pod 向同一集群中的 NodePort 服务发出 HTTP 请求
【发布时间】:2026-02-17 22:20:07
【问题描述】:

我需要一个 K8 pod 中的服务能够对下游服务进行 HTTP 调用,通过 NodePort 进行负载平衡,在同一个集群和命名空间内。

我的限制是:

  • 我只能通过操纵部署和服务来做到这一点 实体(没有入口。我没有该级别的访问权限 集群)
  • 我无法添加任何 K8 插件
  • NodePort 暴露的端口必须是随机的,而不是硬编码的
  • 这整个事情必须自动化。我无法使用文字值设置部署 暴露的端口。它需要由某种变量设置,或者 类似的过程。

这可能吗?如果可以,怎么做?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    它可能可以完成,但它不会是直截了当的,您可能需要添加一些自定义自动化。 NodePort 服务旨在供集群外部的实体使用。

    对于集群间通信,常规服务(使用 ClusterIP)将按设计工作。您的服务可以使用DNS service discovery 访问另一个服务。例如。 svc-name.mynamespace.svc.cluster.localmynamespace 命名空间中 svc-name 的 DNS 条目。

    如果你只能做一个NodePort,它本质上是你的K8s节点上的一个端口,你可以创建另一个Deployment或类似nginxhaproxy的Pod。然后让这个部署由具有 ClusterIP 的常规 K8s 服务提供服务。然后让 nginx 或 haproxy 指向 Kubernetes 集群中所有节点上的 NodePort。此外,将其配置为仅转发到具有某种运行状况检查的侦听 NodePort。

    上述步骤似乎是一个额外的必要步骤,但如果您需要集群内的 NodePort(出于某种原因),它应该可以解决问题。

    【讨论】:

    • 感谢您提供所有这些信息。我喜欢 DNS 服务发现的想法。我将不得不看看我是否有权构建它。不过,您能否澄清一下:一旦设置好,我只需输入网址foo-service.my-namespace.svc.cluster.local 就可以拨打电话?
    • 我今天试试这个,看看能不能验证 DNS 解决方案。
    • 谢谢。这对我帮助很大。测试并验证了 DNS 解决方案。已接受答案。