容器端口映射
容器端口映射
Multiverse的服务器是运行在Kubernetes的容器当中的。容器端口映射(Port Mapping)是容器网络功能中的⼀个重要特性,它允许将容器内部的网络端口映射到宿主机的端口上,使得外部可以访问容器中运行的服务。
1. 基本概念
端口映射解决了以下问题:
- 容器默认运行在隔离的网络环境中,外部无法直接访问
- 容器内部应用使用的端口可能与宿主机端口冲突
- 需要控制外部访问容器服务的入口
2. 实际应用场景
- Web服务: 将容器内的80端口映射到宿主机的8080端口
- 数据库服务: 将MySQL容器的3306端口映射到宿主机的3307端口
- 多环境隔离: 同一宿主机上运行多个相同服务的多个容器实例,使用不同端口进行区分
3. Multiverse中的应用
在Multiverse中,应用场景更像是应用场景3的情况,在一台宿主机中运行多个游戏服务器实例。在每个游戏服务器容器内部,服务器可以使用相同的端口(如:9998);在容器外部,宿主机层面,服务器的端口会被映射到不同的端口,如7417、7596。以如下实际Multiverse应用为例:
- 游戏A有这样的镜像配置,配置了一个UDP端口9998,9998即为游戏服务器在容器中应该启动井监听的端口

- 配置成功,并分配成功后,分配好的服务器信息如下

- 在端口映射的作用下,玩家连接 124.221.202.138:7417 ,连接到宿主机后,请求会将 7417 端口映射到游戏服务器容器A的 9998 端口

4. Multiverse中的最佳实践
- 游戏服务器程序启动时监听固定端口(示例中的9998)
- 在Multiverse的镜像配置中,添加该固定端口为服务器端口(示例中的udp-9998)
- 正式运行中,游戏客户端根据获得的分配信息中的IP和动态端口来连接到游戏服务器(示例中的124.221.202.138:7417)
5. 为什么我连不上我的Multiverse服务器?
请检查以下事项,排查问题:
- 游戏服务器程序是否按照预期端口,和 0.0.0.0 的IP地址进行启动?
var address = "0.0.0.0";
var port = 9998;
var utp = (UnityTransport)NetworkManager.Singleton.NetworkConfig.NetworkTransport;
utp.SetConnectionData(address, (ushort)port);- 游戏服务器程序是否正确集成了MultiverseSDK,并在游戏启动成功后,调用 MultiverseSDK.Instance.ReadyAsync() ?
// 初始化 sdk instance
try
{
await MultiverseSDK.Initialize();
}
catch (MultiverseSDKException ex)
{
Debug.LogErrorFormat("Failed to initialize sdk. {0}", ex);
throw;
}
// 启动游戏服务器并开始监听端口
StartServerAndListen();
// 标记 game server 为 ready 状态
await MultiverseSDK.Instance.ReadyAsync();在本地启动游戏服务器程序,用游戏客户端是否可以使用本地地址和指定端口(localhost:9998)进行连接?
启动前请启动Multiverse本地 sdkserver
在UOS网站上制作Multiverse镜像并创建镜像配置时,是否按照预期端口配置了服务器端口,协议是否选择正确?(UDP或TCP)

在UOS网站上制作Multiverse镜像并创建镜像配置时,镜像是否测试成功?

配置完成,创建服务器后,服务器是否正确运行并显示正在运行?

在使用游戏客户端连接Mutliverse服务器时,是否正确使用了服务器详情中的IP和端口?
