【问题标题】:Access an application running on a random port in Kubernetes访问在 Kubernetes 中随机端口上运行的应用程序
【发布时间】:2022-01-02 23:48:49
【问题描述】:

我的应用程序在 kubernetes 集群的 pod 容器中运行。每次在容器中启动时,它都会分配一个随机端口。我想从外部(例如从另一个 pod 或节点)访问我的应用程序,但由于它分配了一个随机端口,我无法创建服务(NodePort 或 LoadBalancer)来将应用程序端口映射到特定端口以便能够访问它.

在 Kubernetes 集群中处理这种情况的选项有哪些?

【问题讨论】:

  • “它分配一个随机端口”是什么意思?您在容器侦听的 podspec 中定义一个或多个端口。
  • Pod 通常通过 Kubernetes Services 访问,这为您提供了进入 pod 的静态且可发现的入口点。
  • @Robert Keck 我的意思是它在随机端口上创建一个应用程序。我无法使用 Kubernetes 服务,因为我不知道 targetPort
  • 我明白了。只是出于好奇:什么样的应用程序不允许您配置端口?
  • 解释起来很复杂

标签: kubernetes containers kubernetes-pod


【解决方案1】:

不支持,请查看问题here。即使使用 docker,如果您的范围过于广泛,您也可以点击 issue

【讨论】:

  • 我希望有一个技巧可以做到这一点:(
【解决方案2】:

解决此问题的一种方法是使用动态配置的 sidecar 代理,该代理负责将 pod 流量从固定端口路由到应用程序的动态端口。

这样做的好处是即使所有实例都有不同的端口,也可以扩展服务。 但这也有一个潜在的大缺点,即每个请求都会由于额外的网络步骤而增加开销,即使只是几毫秒,这也会产生相当大的影响,具体取决于应用程序的工作方式。

关于代理的动态配置,您可以例如使用共享 pod 卷。

编辑:

pod 中的容器有点特别。他们能够共享预定义的卷和他们的网络命名空间。

对于共享卷,这意味着。您可以定义一个卷,例如emptyDir 类型的并将其安装在两个容器中。结果是您可以在两个容器之间共享信息,方法是将它们写入第一个 pod 中的特定卷并在第二个 pod 中读取信息。

对于网络,这使得一个 pod 的容器之间的通信更容易,因为您可以使用环回在容器之间进行通信。在您的情况下,这意味着边车代理容器可以通过调用 localhost: 来调用您的服务。

更多信息请查看official docs

那么这对你有什么帮助呢?

您可以使用envoy 之类的代理并将其配置为侦听dynamic configuration changes。动态配置的来源应该是您的应用程序容器和 sidecar 代理容器之间的共享卷。 在您的应用程序启动并分配动态端口后,您现在可以自动为特使代理创建配置并将其保存在共享卷中。由于上述配置,同一个源特使正在监听。 Envoy 本身充当反向代理,可以静态侦听端口 8080(或您喜欢的任何其他端口),并通过调用 localhost: 将传入的网络流量路由到具有动态端口的应用程序.

很遗憾,我没有针对此用例的任何预定义配置,但如果您需要一些灵感,可以查看 istio - 他们使用非常相似的东西。

【讨论】:

  • 谢谢@BeWu。您能否解释更多“关于代理的动态配置,您可以例如使用共享 pod 卷”?如果你有这种实现的例子?谢谢
  • @JackLehman 我更新了答案并更详细地描述了它的工作原理。
  • 最佳解决方案,需要一些努力,但一定会奏效!
【解决方案3】:

正如 gohm'c 所说,没有内置的方法可以做到这一点。

作为一种解决方法,您可以运行脚本来调整服务:

  1. 启动应用程序并从应用程序中检索选择的随机端口
  2. 使用新端口修改 Kubernetes 服务、负载均衡器等

这样做的缺点是,如果端口发生变化,之后更新服务会有短暂的延迟。

【讨论】:

  • 这是我目前正在做的,不太实用:(
  • 为什么这不实用?
【解决方案4】:

这个怎么样:

  1. 在 Kubernetes 集群中部署并启动您的应用程序。

  2. 运行kubectl exec <pod name here> -- netstat -tulpn | grep "application name" 以识别与您的应用程序关联的端口号。

  3. 运行 kubectl port-forward <pod name here> <port you like>:<random application port> 以访问应用程序的 pod。

这对你有用吗?

编辑。这与@Lukas Eichler 的回复非常相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-23
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多