介绍下Agones
Agones 是一个专门给游戏行业做的开源项目,作用是把 Kubernetes 改造成能够托管、运行、伸缩”专用游戏服务器”(dedicated game server)的平台,2017 年由 Google 和育碧(Ubisoft)联合发起开发,2026 年 3 月刚捐给了 CNCF(也就是管理 Kubernetes 本身的那个基金会),现在已经有 250 多个贡献者,育碧从项目发起之初到现在一直在自家正式上线的多人游戏里生产使用它。名字 Agones 来自希腊语,意思是”竞赛/比武”,算是跟游戏主题呼应的一个命名。
它要解决的核心矛盾,正是我们上一个问题聊到的那个——标准 Kubernetes 的整套设计哲学(Pod 无状态、随时可以被杀掉重建、靠 reconcile loop 自愈)跟游戏服务器的实际需求(进程内存里持有几百个玩家正在进行中的对局状态,绝对不能被随意重启)是正面冲突的。Agones 的做法不是绕开 Kubernetes 另起炉灶,而是通过自定义资源(CRD)和自定义控制器去扩展 Kubernetes 原生的调度和生命周期管理逻辑,让 Kubernetes”学会”怎么正确对待这类特殊的有状态负载,你之前跟我一起装过 Crossplane 的 Provider,这里的原理是完全一样的套路——都是靠 CRD + Controller 这套 Kubernetes 扩展机制,只是 Crossplane 扩展出来的是云资源管理,Agones 扩展出来的是游戏服务器生命周期管理。
具体的核心资源有这么几层,从下往上看:最底层是 GameServer,对应一个具体的游戏服务器进程实例(本质上包一层 Pod),Agones 给它定义了一套专属的状态机,比如 Scheduled(已调度但还没就绪)、RequestReady(正在启动)、Ready(已就绪、可以被分配)、Allocated(已经被分配给某局游戏,正有玩家在用)、Shutdown(这局结束,准备下线),这套状态机比原生 Kubernetes Pod 的 Running/Pending 这种粗粒度状态精细得多,专门用来表达”这个游戏服务器现在到底能不能被拿去用”。往上一层是 Fleet,对应一批同构的 GameServer 集合,你声明”我要维持多少个 Ready 状态、随时可以被分配的空闲游戏服务器”,Fleet 控制器会通过它管理的 GameServerSet 去自动创建、维持这个数量,概念上跟 Kubernetes 原生的 Deployment 管理一批 Pod 副本很像,只是多了游戏服务器专属的状态感知。
再往上是 FleetAutoscaler,根据当前 Ready 状态的服务器数量是不是低于设定的缓冲水位,自动调整 Fleet 该维持多少个实例,跟 Kubernetes 原生的 HPA(水平自动扩缩容)思路类似,但依据的是”有多少空闲游戏服务器可用”这种游戏专属的指标,而不是 CPU/内存这类通用指标。真正把一个 Ready 状态的服务器分配出去给一局具体游戏,靠的是 GameServerAllocation 这个操作——外部的匹配系统(matchmaker)不需要理解 Kubernetes 调度的复杂细节,只要调用 Agones 暴露出来的这个 API,Agones 就会从 Fleet 里原子性地挑一个 Ready 状态的 GameServer,把它标记成 Allocated,并把这个实例真实的 IP 和端口返回给匹配系统,再由匹配系统下发给客户端,这就实现了我们之前说的会话粘性——客户端拿到的是一个具体、确定的服务器地址,而不是走一个会随机分流的 Service。
健康检查这块也做了专门设计:游戏服务器进程本身通常是用 C++、C# 或者其他语言写的自定义二进制,Agones 提供了一个 SDK,以 sidecar 容器的形式跟游戏服务器进程一起跑在同一个 Pod 里,游戏服务器代码通过这个 SDK 主动上报”我现在 Ready 了””这局游戏已经开始了、请把我标记成 Allocated””这局结束了、请把我标记成 Shutdown”,而不是像普通 Kubernetes Pod 那样只靠 liveness/readiness probe 从外部被动探测存活状态——这个设计是因为游戏逻辑是否”真正可用”往往需要游戏进程自己判断(比如地图有没有加载完、房间逻辑有没有初始化好),外部探针很难准确判断这种业务语义,让游戏进程自己通过 SDK 主动汇报状态,准确度要高得多。
总体来看,Agones 相当于在 Kubernetes 原有的、面向无状态微服务设计的那套调度和自愈逻辑之上,叠加了一层专门理解”游戏对局生命周期”的语义层,让运维团队能继续用他们已经很熟悉的 Kubernetes 工具链(kubectl、YAML、监控告警体系)去管理游戏服务器集群,同时又不会因为 Kubernetes 默认的无状态假设而把正在进行中的对局意外打断,是目前游戏行业里把 Kubernetes 用于生产环境游戏服务器托管这个方向上最主流、最成熟的开源方案。
Sources:
