尹烨,腾讯专家工程师,K8s/CNI等开源项目贡献者,负责腾讯游戏K8s等云原生相关技术的研发运营工作。
蔡卫东,腾讯高级工程师。K8s、Virtual-kubelet等社区活跃贡献者,曾向上游开源社区贡献过tensile-kube、scheduler-plugins等组件。
Open Cloud-native Game-application Initiative(OCGI)[1]是由腾讯游戏计算资源团队创建的一个开源项目,主要解决游戏 GameServer 在 K8s 集群上的部署、运行和自动伸缩等问题。
对于FPS[2]、MOBA[3]等在线多人游戏后台架构中,都有专门服务玩家对局的服务器Dedicated Server(简称 DS)[4]。
下图是典型的游戏 DS 架构:

其中,zone server 为大厅服务器,dscenter 负责 ds 的管理和分配,dsagent 管理 ds 进程。一般来说,DS 都有以下些特点:
DS 这些特点和要求,当 DS 运行在 Kubernetes 上会面临很大的挑战。K8s 提供的 Workload,比如Deployment[5]、或者Statefulset[6],都不能很好的满足要求。
另外,一般来说,DS 的负载都呈周期性变化,比如白天的负载相对较高,凌晨之后负载就会降下来,需要自动弹性伸缩能力。K8s 的HPA[7]提供了基于 metrics 的自动伸缩功能,但功能上还不够。比如很多游戏业务都希望实现定时扩缩容,甚至应用自己控制 Workload 副本数量。
业界已经有一些开源项目去尝试解决这类游戏服务的 DS 管理问题,比如 Google 的Agones[8]。

Agones的实现是每个Pod一个ds进程(Dedicated game server process per Pod)。这对于在线百万,甚于千万的大型游戏,在高峰期瞬间可能会产生数万、甚至数十万对局,这会伴随着数十万、甚至数百万的Pod创建和销毁,这会对K8s的apiserver和scheduler都会带来极大的挑战。同时,DS的启动延迟(镜像下载、进程启动)要求也无法满足要求。
另外,还有一些项目,比如阿里开源的OpenKruise[9]项目,提供了很多特性增强的 K8s Workload,但这些 Workload 主要面向一些通用的应用场景。
经过与腾讯游戏工作室的许多开发同学交流和讨论,我们创建了OCGI这个项目。我们希望借助K8s和OCGI,帮助游戏业务更好的解决资源的弹性伸缩、利用率和成本等效能问题。

OCGI 主要包括下面一些 Workload:
Squad 和 GeneralPodAutoscaler 提供了一些扩展和交互机制,变更,或者扩缩容时,GameServer 可以更加优雅的退出,避免对游戏玩家的影响。

Workload GameServer 提供了一个简单的 SDK,游戏后端 server 可以把当前的一些服务状态信息,通知到 Carrier controller,用于 Carrier controller 在弹性伸缩、或者发布变更时,选择合适的副本进行删除。

GameServer 的 autoscaler 流程如下:

注意,上面的 Condition,比如 offline,no-player 等可由业务自己定义。更多参考Carrier SDK[13]。
OCGI项目在设计和开发过程中,得到腾讯游戏许多工作室开发同学(kenny,ethan,jerry等)以及业务运维同学(zhichangfu等)的支持和帮助。在这里致以最诚挚的感谢。
[1]
Open Cloud-native Game-application Initiative(OCGI): https://github.com/ocgi
[2]
FPS: https://en.wikipedia.org/wiki/First-person_shooter
[3]
MOBA: https://en.wikipedia.org/wiki/Multiplayer_online_battle_arena
[4]
Dedicated Server(简称 DS): https://en.wikipedia.org/wiki/Game_server#Dedicated_server
[5]
Deployment: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
[6]
Statefulset: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
[7]
HPA: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
[8]
Agones: https://agones.dev/
[9]
OpenKruise: https://github.com/openkruise/kruise
[10]
K8s Pod: https://kubernetes.io/docs/concepts/workloads/pods/
[11]
Carrier controller: https://github.com/ocgi/carrier
[12]
GeneralPodAutoscaler: https://github.com/ocgi/generalpodautoscaler
[13]
Carrier SDK: https://github.com/ocgi/carrier-sdk


往期精选推荐

