【问题标题】:Can I make calls directly to pods from outside Kubernetes?我可以从 Kubernetes 外部直接调用 pod 吗?
【发布时间】:2016-04-22 17:08:28
【问题描述】:

我正在尝试将现有应用程序转换为 Kubernetes,其工作方式如下:

  • 外部服务通过具有新会话的负载平衡器调用我们的应用程序。
  • 我们的应用程序返回处理请求的服务器的 ip。
  • 外部服务对该会话的所有后续调用都直接发送到同一台服务器(绕过负载平衡器)

在 kubernetes 中有什么方法可以做到这一点吗?我知道 pod ip 不会暴露在外部,有什么方法可以直接暴露它们吗?

另外,我认为我不能使用 sessionAffinity="ClientIP" 因为请求都来自同一个地方。有没有办法编写自定义 sessionAffinity 类型?

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    这在某种程度上取决于您的网络是如何设置的以及您所说的“外部服务”是什么意思,但答案很可能是“否”。

    如果您在云环境中使用默认集群创建脚本之一运行,则 pod IP 地址无法从 Internet 路由,因此与您的集群不在同一专用网络中的任何服务都将无法通信直接到 pod。

    但是,根据您使用的云提供商,您可能会通过继续通过service of type LoadBalancer 的外部 IP 进行所有调用来获得您想要的行为。例如,在 Google Cloud Platform 上,cloud load balancer that gets created for such services by default maintains connection affinity by 5-tuple(src ip 和端口,dst ip 和端口,L4 协议)听起来就是您想要的,因为您希望按会话而不是按 IP 进行平衡。

    至于创建新的 sessionAffinity 类型,这不是一件容易扩展的事情,因为它需要更改 Kubernetes 源代码。如果这确实是您想要采取的方法,那么您可能希望在集群中运行自己的负载均衡器,而不是依赖内置的负载均衡。

    【讨论】:

    • 我们目前在我们自己的服务器上运行我们的应用程序。会话 ID 也将是我们发送的消息数据的一部分。听起来唯一的解决方案可能是将我们自己的负载均衡器作为 Pod / 服务运行在 Kubernetes 内的应用程序前面。知道我应该从哪里开始寻找那种东西吗?
    • 忘了提,但是所有这 5 件事对于会话亲和性来说已经足够了。源和目标 ip 将始终相同。它需要基于我们创建的会话 ID。
    • 那里有一些示例,但我不确定是否有任何直接映射到您的用例。考虑查看paulbakker.io/kubernetes/load-balancing-kubernetesnginx.com/blog/load-balancing-kubernetes-services-nginx-plus
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多