Kubernetes 集群上的 WebRTC
WebRTC on Kubernetes cluster
我有一个正在开发的实时多人游戏的专用服务器构建,我想 运行 在 Kubernetes 集群上。该游戏针对浏览器使用 WebRTC RTCDataChannel
s 进行网络通信。当 运行 在 Kubernetes 节点上连接游戏服务器时,如果我将我的 Pods 配置为 hostNetwork: true
,玩家可以直接连接到它。在没有 hostNetwork: true
的情况下,玩家仍然可以直接连接,但前提是他们落后于行为良好的 NAT,如果不是,那么成功连接的唯一选择是引入 TURN 服务器来中继流量。
这似乎是因为游戏服务器 运行 位于 Kubernetes 节点上,本质上是对称 NAT,即 NAT 映射行为取决于地址和端口。我已经通过从容器内的同一个 UDP 套接字在不同的 STUN 服务器上发射两条 STUN 消息来确认这一点——绑定响应具有相同的 public IP 但不同的端口。
这种 NAT 行为通过降低玩家在没有使用 TURN 服务器中继流量的情况下直接连接到游戏服务器的成功率来影响 WebRTC。现在,我非常希望尽可能避免通过 TURN 服务器中继流量,因为这会增加延迟——这对于实时多人游戏来说并不是太理想。
我希望只设置 hostNetwork: true
并完成它,但我正在考虑使用不支持它的 Agones(因为它剥夺了安全执行的能力边车)。
所以我想知道我是否有任何其他选择(理想情况下不引入另一台服务器来中继流量)来调整此 NAT 行为,因为我认为尝试转发整个范围的随机数据是不可行的WebRTC 将尝试用于通信的 UDP 端口?
更新:通读 TURN RFC,我现在认为使用 TURN 服务器 运行ning 中的下图设置可能是可能的与专用游戏服务器相同的容器(因此延迟引入应该是最小的)。
游戏客户端将充当 TURN 客户端,即在 TURN 服务器上创建分配等。
游戏服务器将充当客户端想要与之通信的对等点。游戏服务器本身不需要是 TURN 客户端,如果我的理解是正确的,甚至不需要知道 TURN 服务器是 TURN 服务器。
可以使用单个侦听 UDP/TCP 端口为多个 WebRTC 连接提供服务。您使用 ICE ufrag
和 pwd
进行多路分解,然后使用远程 3 元组进行路由。
我不确定您使用的是什么 WebRTC 实现,但是对于 Pion,您可以通过 SetICEUDPMux the actual code is in pion/ice 启用它。如果我们在解复用之前已经看到这个地址,否则我们会尝试查找 ICE 值。
我也看到有人走 TURN 路线,但我建议不要这样做。当您再添加一件可能会在重负载下降低流量时,调试可能会令人沮丧。
事实上,可以在后端部署一个 TURN 服务器,只允许向 WebRTC 客户端公开一个 UDP and/or TCP 端口。这不是经典用法,但我在生产中见过几次。只有客户端需要设置 TURN 服务器,游戏服务器将直接与 TURN 服务器通信,因为它将中继本地网络地址。此外,您应该在客户端强制执行 ICE 中继。
另一种选择是在 WebRTC 代理配置中设置端口范围并在 NAT 上转发端口范围。在这种情况下,您可以使用外部地址手动覆盖发出的候选主机,而不是设置 STUN 服务器,以优化连接建立。
我有一个正在开发的实时多人游戏的专用服务器构建,我想 运行 在 Kubernetes 集群上。该游戏针对浏览器使用 WebRTC RTCDataChannel
s 进行网络通信。当 运行 在 Kubernetes 节点上连接游戏服务器时,如果我将我的 Pods 配置为 hostNetwork: true
,玩家可以直接连接到它。在没有 hostNetwork: true
的情况下,玩家仍然可以直接连接,但前提是他们落后于行为良好的 NAT,如果不是,那么成功连接的唯一选择是引入 TURN 服务器来中继流量。
这似乎是因为游戏服务器 运行 位于 Kubernetes 节点上,本质上是对称 NAT,即 NAT 映射行为取决于地址和端口。我已经通过从容器内的同一个 UDP 套接字在不同的 STUN 服务器上发射两条 STUN 消息来确认这一点——绑定响应具有相同的 public IP 但不同的端口。
这种 NAT 行为通过降低玩家在没有使用 TURN 服务器中继流量的情况下直接连接到游戏服务器的成功率来影响 WebRTC。现在,我非常希望尽可能避免通过 TURN 服务器中继流量,因为这会增加延迟——这对于实时多人游戏来说并不是太理想。
我希望只设置 hostNetwork: true
并完成它,但我正在考虑使用不支持它的 Agones(因为它剥夺了安全执行的能力边车)。
所以我想知道我是否有任何其他选择(理想情况下不引入另一台服务器来中继流量)来调整此 NAT 行为,因为我认为尝试转发整个范围的随机数据是不可行的WebRTC 将尝试用于通信的 UDP 端口?
更新:通读 TURN RFC,我现在认为使用 TURN 服务器 运行ning 中的下图设置可能是可能的与专用游戏服务器相同的容器(因此延迟引入应该是最小的)。
游戏客户端将充当 TURN 客户端,即在 TURN 服务器上创建分配等。
游戏服务器将充当客户端想要与之通信的对等点。游戏服务器本身不需要是 TURN 客户端,如果我的理解是正确的,甚至不需要知道 TURN 服务器是 TURN 服务器。
可以使用单个侦听 UDP/TCP 端口为多个 WebRTC 连接提供服务。您使用 ICE ufrag
和 pwd
进行多路分解,然后使用远程 3 元组进行路由。
我不确定您使用的是什么 WebRTC 实现,但是对于 Pion,您可以通过 SetICEUDPMux the actual code is in pion/ice 启用它。如果我们在解复用之前已经看到这个地址,否则我们会尝试查找 ICE 值。
我也看到有人走 TURN 路线,但我建议不要这样做。当您再添加一件可能会在重负载下降低流量时,调试可能会令人沮丧。
事实上,可以在后端部署一个 TURN 服务器,只允许向 WebRTC 客户端公开一个 UDP and/or TCP 端口。这不是经典用法,但我在生产中见过几次。只有客户端需要设置 TURN 服务器,游戏服务器将直接与 TURN 服务器通信,因为它将中继本地网络地址。此外,您应该在客户端强制执行 ICE 中继。
另一种选择是在 WebRTC 代理配置中设置端口范围并在 NAT 上转发端口范围。在这种情况下,您可以使用外部地址手动覆盖发出的候选主机,而不是设置 STUN 服务器,以优化连接建立。