亚马逊AWS官方博客
Unreal Engine 像素流送在g4dn上实现容器化部署实践(二)
在Unreal Engine 像素流送在g4dn上实现容器化部署实践(一)中我们讲解了在g4dn上如何编译Unreal Engine 4项目, 构建docker 镜像,还讲解了如何通过docker-compose部署了UE4像素流送演示项目,接下来我们将会在Amazon Elastic Kubernetes Service(EKS)上尝试部署一套可以弹性伸缩的像素流送平台。
本文分为如下几个部分:
- 架构说明
- 创建Amazon EKS集群,配置工作节点, 配置AWS Load Balancer Controller
- 编写需要的yaml配置文件,包括TURN/STUN, Matchmaker, Streamer , Enovy 等多个组件
- 测试弹性伸缩功能
1. 架构说明
Epic Games官方提供了一个多用户/多游戏像素流送的参考架构(见下图), 通过一个Matchmaker匹配服务,将用户请求连接到不同的Signaling Server(Web Server), 不过官方提供的Matchmaker是直接返回Singaling Server的IP和端口,并没有实现统一接入,需要自行修改Matchmaker实现统一端口接入。
Epic Games 官方多用户/多游戏像素流送参考架构图
根据Amazon EKS/Kubernetes的特性进行了重构
- 分别使用CPU和GPU, 2种类型的工作节点, 通过节点亲和/污点容忍,CPU类型节点运行Matchmaker, STUN/TRUN, Envoy路由服务, GPU类型节点(g4dn)运行UE4项目/Streamer。
- 平台通过统一Ingress 入口提供对外服务, 使用了Enovy 作为中间路由。
- Matchmaker进行了改造,不用进行端口跳转。
Amazon EKS参考架构图如下:
2. 创建Amazon EKS集群
2.1 创建Amazon EKS集群
我们将同时会创建2个工作节点组,1节点组个使用m5.large (CPU负载),主要用来部署STUN/TURN, Envoy, Matchmaker, player 等服务器, 另外一个节点组使用g4dn.xlarge,主要是用来部署UE4 像素流送项目,实现WebRTC流推送。
集群配置文件(cluster.yaml),当前默认kubernetes集群版本为1.21
创建集群
eksctl create cluster -c cluster.yaml
2.1 部署AWS Load Balancer Controller (ALB ingress需要)
#创建ingress使用的角色,策略, service account
#安装cert-manager
#下载ALB 2.2.1 安装配置文件
编辑v2_2_1_full.yaml,将–cluster-name=your-cluster-name 修改为–cluster-name=eksworshop
修改v2_2_1_full.yaml后安装aws-load-balancer-controller
kubectl apply -f v2_2_1_full.yaml
系统会自动在kube-system下部署aws-load-balancer-controller。
3. 编写需要的yaml文件
根据步骤1我们设计的架构,准备所需要的yaml文件, 笔者已经将所有文件放在UE4-PixelStreaming-AWS-EKS仓库中的deploy目录中。
git clone https://github.com/stevensu1977/UE4-PixelStreaming-AWS-EKS
3.1 创建namespace,配置权限
我们将使用部署一个带有kubectl命令行工具的pod来为了获得TURN外网地址,所以我们需要kubernetes API Server 访问权限
创建Namespace
创建了2个service account 并且通过ClusterRole, ClusterRoleBinding进行正确授权
3.2 STUN/TURN server
我们使用了coturn 作为STUN/TURN server ,通过它来解决内网Streamer(游戏实例)数据传输的问题 , 通过标签”app.pixel/turn=true” 将cotton以Dameonset的方式部署到指定的EC2节点。
3.3 matchmaker, player, streamer
matchmaker负载将空闲的streamer发送给客户,player提供的是静态网页/javascript , streamer 使用了Epic Games 提供的一个ARPG演示项目。
3.4 ingress , envoy-router
我们会创建一个ALB Ingress, 它由Amazon load balancer controller 完成ALB资源的创建
另外我们会部署一个envoy 网关,通过它将不同路由分别映射到player, matchmaker服务上去。
4. 部署测试
所有的yaml内容都在deploy目录下面 ,我们直接进行部署
kubectl apply -f ./deploy
4.1 验证部署是否成功
检查Ingress , Service
检查应用
4.2 测试演示项目
获取访问地址
4.3 弹性伸缩测试
我们部署的应用stream 默认只有1个副本,当我们已经有1个浏览器连接ingress, matchmaker会把当前空闲的游戏实例发送给客户建立WebRTC连接,我们开启第二个浏览器(Firefox)访问该地址的时候它会显示”Waiting for available streamer”
这个时候我们只需要增加stream的副本,matchmaker就会通过websocket 发送新的游戏连接信息,firefox浏览器也会从”Waiting for available streamer” 状态变为游戏连接状态。
这个时候我们可以看到firefox , chrome 浏览器使用同一个ALB地址但是分别连接到2个独立的UE4游戏, 进行各自的游戏,说明通过副本数扩展可以实现演示游戏的弹性伸缩,我们也可以继续增加应用stream的副本数量来支持更多的客户访问。
有兴趣的读者还可以自行研究与Kubernetes HPA组件结合来实现UE4像素流送的自动弹性伸缩。
5.总结
本文详细地介绍了如何将Unreal Engine 4 游戏打包部署在Amazon Elastic Kubernetes Service(EKS)服务上,通过Kubernetes内置的功能和Amazon EC2 g4dn实例打造一个支持多用户可以弹性伸缩的UE4游戏像素流送平台。