AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1066495
Accepted
xenrelay
xenrelay
Asked: 2021-06-12 20:37:07 +0800 CST2021-06-12 20:37:07 +0800 CST 2021-06-12 20:37:07 +0800 CST

Kubernetes 在 GKE 上管理许多不同的 UDP 服务器

  • 772

我正在尝试建立一个系统,该系统可以自动启动和关闭视频游戏服务器作为 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。
udp google-cloud-platform kubernetes google-kubernetes-engine
  • 1 1 个回答
  • 330 Views

1 个回答

  • Voted
  1. Best Answer
    Dawid Kruk
    2021-06-29T01:55:29+08:002021-06-29T01:55:29+08:00

    发布这个社区 wiki 答案是为了为这个问题设置更多的基线方法,而不是给出一个明确的解决方案。

    随意编辑和扩展。


    您可以使用Services. 有一些选项在某些方面与另一个选项不同:

    • ClusterIP:在集群内部 IP 上公开服务。选择此值使服务只能从集群内访问。这是默认设置ServiceType。
    • NodePort:在每个节点的 IP 上的静态端口 (the NodePort) 上公开服务。ClusterIPService 路由到的ServiceNodePort是自动创建的。您可以NodePort通过请求从集群外部联系服务<NodeIP>:<NodePort>。
    • LoadBalancer:使用云提供商的负载均衡器在外部公开服务。自动创建外部负载均衡器路由到的服务NodePort。ClusterIP
    • ExternalName :通过返回带有其值的记录,将服务映射到externalName字段的内容(例如foo.bar.example.com) 。CNAME没有设置任何类型的代理。

    -- Kubernetes.io:文档:概念:服务网络:服务:发布服务服务类型

    Google Kubernetes Engine可以在此处找到特定于公开应用程序的文档:

    • Cloud.google.com:Kubernetes Engine:文档:如何:公开应用

    特别关注问题中包含的一些要点:


    我可以使用 NodePort 服务,而无法控制客户端需要连接到哪个端口。这是一个问题,因为服务器将自己注册到服务器列表中。

    您可以在YAML中指定NodePort端口(如或)。ServicenodePort: 32137nodePort: 30911

    您可以将您的应用程序配置为在与以下相同的端口上侦听nodePort:

    • 应用程序正在侦听端口30000
    • 服务使用nodePortwith port: 30000(客户端/用户应连接到此端口)和 targetPort: 30000。在这种情况下,不会有端口更改。

    旁注!

    默认情况下,nodePort端口范围被GCP防火墙阻止。您将需要创建一个允许它的规则(或一组规则)。


    我可以使用主机网络。如果我的信息是正确的,那就需要特权容器,这绝对不好。

    除非有充分的理由,否则我会建议不要使用特权容器。引用官方文档:

    特权政策是有意开放的,并且完全不受限制。这种类型的策略通常针对由受信任的特权用户管理的系统级和基础架构级工作负载。

    -- Kubernetes.io:文档:概念:安全:Pod 安全标准:特权


    端口是可以配置的,只要知道pod启动前服务器需要运行在哪个端口上即可。

    由于您将拥有大量单曲Pods(每个都有单独的Deployment),因此您可以对其进行参数化。我的意思是您可以创建一个模板并仅修改清单的一部分(如端口、环境变量等)。

    您可以将环境变量传递给您Pod,以便它可以用作命令中的参数。您还可以修改Pod开头的命令

    • Kubernetes.io:文档:任务:注入数据应用程序:定义环境变量容器:为容器定义环境变量
    • Kubernetes.io:文档:任务:注入数据应用程序:定义命令参数容器
    • 1

相关问题

  • 在 Docker 中运行 nuttcp 时出现分段错误

  • Windows Server 2008 上的默认 TCP 窗口大小是多少?

  • OpenVPN 和 UDP 广播

  • 用于网络监控的路由/代理 SNMP 陷阱(或 Netflow、通用 UDP 等)的解决方案?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve