【问题标题】:Kubernetes: Exposing each Pod externally under unique portKubernetes:将每个 Pod 暴露在唯一的端口下
【发布时间】:2021-05-13 23:31:51
【问题描述】:

我正在学习 Kubernetes,想知道它是否适合以下用例:

我有一个用于多人游戏的服务器(在守护进程中的服务器,而不是计算机)。游戏连续运行,客户可以随时加入和离开。但是每台服务器都有最大客户端数量的限制。当它变满时,应该启动新的服务器。服务器应在空时关闭,但随时至少有一个运行。每个服务器都选择一个任意的 UDP 端口来侦听。各个服务器向主服务器报告自己。客户端首先连接到主服务器以获取正在运行的服务器列表,包括它们的地址和端口,然后直接连接到其中一个。

要使用 Kubernetes 处理此问题,每个游戏服务器都可以是一个 Pod。我可以使用带有自定义指标的自动缩放来根据连接的客户端数量来处理启动和关闭。

但我不确定如何在唯一的 UDP 端口下将每个 Pod 暴露给外界。如果我为这些 Pod 创建一个服务,那么我只会为所有这些 Pod 分配一个端口,并且每次到达它的数据包都会发送到不同的 Pod,这显然是行不通的。

kubernetes 有没有合理的方法来处理这个问题?

编辑:虽然游戏服务器能够自动查找空闲端口,但也可以将其配置为侦听特定端口,因此如果 kubernetes 可以处理空闲端口的分配,则该部分不是问题面向互联网的地址。

理想情况下,最终结果可能如下所示:

  Public-facing IP            +------- NodeA --------------+
                              | +------ Pod1 ------------+ |
     UDP/10001 ............>  | | GameServer @ UDP/10000 | |
                              | +------------------------+ |
     UDP/10002 ......         | +------ Pod2 ------------+ |
                     ......>  | | GameServer @ UDP/10000 | |
     UDP/10003 ...            | +------------------------+ |
                  ..          +----------------------------+
     UDP/10004 .    ..
                .     ..      +------- NodeB --------------+
                 .      ..    | +------ Pod3 ------------+ |
                  .       .>  | | GameServer @ UDP/10000 | |
                   .          | +------------------------+ |
                    ..        | +------ Pod4 ------------+ |
                      .....>  | | GameServer @ UDP/10000 | |
                              | +------------------------+ |
                              +----------------------------+

【问题讨论】:

    标签: kubernetes autoscaling


    【解决方案1】:

    这是一个非常不寻常的案例。 K8s 并非设计用于打开随机端口的应用程序。我想到的唯一解决方法是使用hostNetwork: true,但您需要了解它的作用和缺点。 K8s docs:

    HostNetwork - 控制 pod 是否可以使用节点网络 命名空间。这样做可以让 pod 访问回送设备, 侦听本地主机的服务,可用于窥探网络 同一节点上其他 pod 的活动。

    现在让我们想一想为什么它(hostNetwork 的使用:true)会成为一个解决方案。

    在节点上运行hostNetwork: true的Pods会有节点的ip,只要节点暴露了就会自动对外暴露。

    udp 应该没有问题,您不需要配置任何服务,并且事先知道任何端口。 Pod 以主机 ip 开头,应用程序打开它想要的任何端口,将其通告给主服务器,然后就可以开始了。

    但由于需要将节点暴露在互联网上,请注意节点容易受到攻击,这可能被视为安全问题。

    【讨论】:

    • 感谢您的回答。我已经对问题进行了澄清 - 如果以这种方式配置,游戏服务器可以在固定端口上侦听,这不是问题。我宁愿不将每个节点都暴露在互联网上,而是让 kubernetes 像处理普通服务一样为特定端口设置端口转发。
    • 关于服务器的更多信息?可以配置地址做广告吗?
    • 是的,您也可以配置它。我还会考虑重写主服务器,以使用其 API 直接从 kubernetes 获取有关运行游戏服务器的信息,而不是像现在一样被游戏服务器联系。
    • 您是服务器的所有者/开发者吗?您是否考虑过编写自定义代理?这可能是你能做的最简单的事情。 K8s 不是为此类用例设计的,因此使用开箱即用的 k8s 安装是不可能做到这一点的。
    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 2019-02-17
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2020-02-22
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多