原创 赵楠, 刘秋阳 2025-07-24 18:15 浙江
新一代游戏网关,在不侵入业务架构的同时实现游戏服优雅下线、配置无感变更等能力。
游戏连接治理的最后一公里
Aliware
基于业务状态的流量管理
Aliware
优雅下线
如演示所示,具体部署步骤如下:
1. 前置步骤:
- 开通 ACK 托管集群,安装 ack-kruise-game 和 ack-kruise 组件.开通 API 云原生网关【2】。
2. OKG 服务部署:为了模拟真实的游戏环境,我们选择了开源游戏 Posio 作为我们的 demo 游戏服。通过以下 yaml 文件,可以快速构建一个多实例的游戏服务集群。
在这个示例中,我们通过 GameServerSet 创建了多个游戏服实例,每个实例都有其唯一的访问域名。具体而言:游戏服0:game0.postio.example.com游戏服1:game1.postio.example.com游戏服2:game2.postio.example.com这种域名设计不仅便于客户端精确访问不同的游戏服,也为后续的负载均衡和流量调度奠定了基础。通过这样的部署结构,我们可以模拟复杂的游戏服务环境,为优雅下线的实验提供真实可靠的测试平台。在云原生游戏服务的优雅下线过程中,精确的状态感知和玩家会话管理至关重要。我们通过 YAML 脚本来实现这一复杂的过程,该脚本融合了状态检测、玩家活跃度监控和优雅退出机制。1. 状态感知apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
name: postio
namespace: default
spec:
lifecycle:
preDelete:
labelsHandler:
gs-sync/delete-block: "true"
replicas: 3
updateStrategy:
rollingUpdate:
podUpdatePolicy: InPlaceIfPossible
network:
networkType: Kubernetes-Ingress
networkConf:
- name: IngressClassName
value: "higress"
- name: Port
value: "5000"
- name: Path
value: /
- name: PathType
value: Prefix
- name: Host
value: game<id>.postio.example.com
gameServerTemplate:
metadata:
labels:
gs-sync/delete-block: "true"
spec:
containers:
- image: registry.cn-beijing.aliyuncs.com/chrisliu95/posio:8-24
name: postio
volumes:
- name: gsinfo
downwardAPI:
items:
- path: "state"
fieldRef:
fieldPath: metadata.labels['game.kruise.io/gs-state']
serviceQualities:
- name: healthy
containerName: minecraft
permanent: false
exec:
command: ["bash", "./probe.sh"]
serviceQualityAction:
- state: true
result: done
labels:
gs-sync/delete-block: "false"
- state: false
opsState: None
脚本首先从
/etc/gsinfo/state
文件中获取当前游戏服务(GS)的状态。这一步骤体现了对服务生命周期的实时监控能力,是实现精确控制的基础。
2. 下线触发判断
当检测到 GS 状态为 "PreDelete" 时,脚本识别出服务已进入下线阶段。这种精确的状态判断确保了下线操作仅在适当的时机启动,最大限度地减少对玩家体验的影响。
3. 玩家活跃度评估
进入下线流程后,脚本会持续监控与该游戏服务相关的活跃连接数。这里,我们巧妙地利用 API 云原生网关提供的连接数指标作为玩家在线状态的代理指标。这种方法不仅简化了实现,还提供了一个可靠的玩家活跃度衡量标准。
脚本会循环检查活跃连接数,直到该数值降为零。只有在确认所有玩家都已安全断开连接后,脚本才会输出 "done" 并以退出码 0 结束执行。这种机制确保了每一个玩家会话都得到了妥善处理,真正实现了"优雅"下线。
file_path="/etc/gsinfo/state"
if [[ ! -f "$file_path" ]]; then
exit 1
fi
data="query=sum(envoy_cluster_upstream_cx_active{cluster_name=~\"outbound_5000__${HOSTNAME}.default.svc.cluster.local\"})"
state_content=$(cat "$file_path")
if [[ "$state_content" == "PreDelete" ]]; then
json=$(curl -s -G --data-urlencode $data http://prometheus.com/api/v1/query)
value=$(echo "$json" | grep -o '"value":\[[^]]*\]' | sed 's/.*"\([^"]*\)"]/\1/')
if [[ -z "$value" || "$value" == "0" ]]; then
echo "done"
exit 0
fi
exit 1
fi
exit 1
无感变更
重点解决了自定义插件的添加与删除、日志格式的动态调整、全局参数等高阶配置修改时的连接保持问题。这些操作现在可以在不中断现有游戏会话的情况下平滑完成,极大地提升了服务的可维护性和灵活性。2. 长连接场景优化
专门针对游戏行业普遍存在的长连接特性,设计了独特的连接保护机制。即使在进行复杂的配置调整时,也能确保玩家的长时间会话不被中断,从而维持游戏体验的连续性。
0 改造、易接入
- "即插即用"设计:OKG 服务可直接接入云原生环境,彻底消除代码改造的繁琐过程。
从决策到部署,最快仅需数分钟,让您的游戏服务立即享受云原生技术带来的全方位优势。
- 丰富的 Prometheus 指标, 只需简单配置 Prometheus URL,即可实现自动接入。
预配置的仪表板直观呈现关键指标,让游戏服务的健康状态一目了然。
- 直观的控制台界面革新了 API 管理体验,将复杂的配置流程简化为几次点击操作。
- 预设模板覆盖常见游戏场景,使得流量控制、负载均衡等高级功能触手可及。
相关链接:【1】OpenKruiseGamehttps://openkruise.io/kruisegame/introduction【2】云原生 API 网关https://help.aliyun.com/zh/api-gateway/cloud-native-api-gateway/product-overview/what-is-cloud-native-api-gateway【3】自定义生命周期 https://openkruise.io/zh/kruisegame/user-manuals/lifecycle【4】Higress × OpenKruiseGame 游戏网关最佳实践https://developer.aliyun.com/article/1440348?spm=5176.26934562.main.1.5769356b3EZsWh