我正在尝试建立一个系统,该系统可以自动启动和关闭视频游戏服务器作为 docker 图像。在这种情况下,factoriotools/factorio-docker。每个游戏都是该容器的不同的、不同的单 Pod 部署,因此(在简化的情况下)需要自己的 IP 地址来侦听特定的 UDP 端口。负载平衡器是多余且无关紧要的,而且 Cloud NAT 似乎不容易允许入口流量。
我知道有几种方法可以让它发挥作用,两者都有相当大的妥协:
- 我可以使用 NodePort 服务,而无法控制客户端需要连接到哪个端口。这是一个问题,因为服务器将自己注册到服务器列表中。
- 我可以使用主机网络。如果我的信息是正确的,那就需要特权容器,这绝对不好。
- 我也许可以使用 UDP 负载平衡器,但即使它存在并且有效,它也很昂贵。
可能有一些方法可以解决这两种方法的局限性(第二种方法是让主机保持短暂的生命并保持防火墙严格,而且应该大部分都可以?),但我不禁认为有更好的选择我在官方 kubernetes 文档中找不到描述。traefik 有什么我不知道的技巧吗?是否有某种方法可以获得 MetalLB 的变体,它可以根据需要动态分配公共 IP 地址?
如何让每个服务器容器使用特定的 UDP 端口侦听不同的公共 IP 地址,而不会使过程中的安全性变得不可能?
编辑:
- 端口是可以配置的,只要知道pod启动前服务器需要运行在哪个端口上即可。
- 除非我误解了服务器文档,否则客户端需要能够连接到服务器正在侦听的同一端口。在我的情况下,k8s 在应用程序侦听端口和客户端连接端口之间的区别是没有帮助的。
- 解决这个问题,我不想要负载均衡器,因为它对我没有任何作用。更改 IP 地址无关紧要,系统旨在处理该问题。如果服务器宕机 15 秒,每个人都将不得不重新连接,然后他们会找到新的 IP 地址。服务器无法处理同一个游戏中的多个 Pod,因此永远不会有多个副本。
- 我刚刚尝试了一个
NodePort
带有随机公共端口的服务(还没有看到我可以选择外部端口),我得到了直接连接,但没有服务器列表连接。服务器列表过程首先通过让服务器将出站 UDP 流量发送到给定端点来自动检测如何连接到服务器。因此,我不仅需要控制入站流量连接到的端口,还需要控制出站流量的路由方式,包括可能使用的任何 NAT。
发布这个社区 wiki 答案是为了为这个问题设置更多的基线方法,而不是给出一个明确的解决方案。
随意编辑和扩展。
您可以使用
Services
. 有一些选项在某些方面与另一个选项不同:Google Kubernetes Engine
可以在此处找到特定于公开应用程序的文档:特别关注问题中包含的一些要点:
您可以在YAML中指定
NodePort
端口(如或)。Service
nodePort: 32137
nodePort: 30911
您可以将您的应用程序配置为在与以下相同的端口上侦听
nodePort
:30000
nodePort
withport
:30000
(客户端/用户应连接到此端口)和 targetPort:30000
。在这种情况下,不会有端口更改。除非有充分的理由,否则我会建议不要使用特权容器。引用官方文档:
由于您将拥有大量单曲
Pods
(每个都有单独的Deployment
),因此您可以对其进行参数化。我的意思是您可以创建一个模板并仅修改清单的一部分(如端口、环境变量等)。您可以将环境变量传递给您
Pod
,以便它可以用作命令中的参数。您还可以修改Pod
开头的命令