尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于 Agones 的多集群游戏服务器统一分配端点(Allocation Endpoint)代理实战指南
游戏开发云原生【免费下载链接】agonesDedicated Game Server Hosting and Scaling for Multiplayer Games on Kubernetes项目地址https://gitcode.com/gh_mirrors/ag/agones点击查看免费下载导读本指南以 Agones 仓库中 examples/allocation-endpoint 示例为核心完整讲解如何在 GKE 环境中为多个 Agones 集群搭建一个统一入口的 Allocation Endpoint 代理部署于 Cloud Run并让游戏匹配服务Matchmaker通过 gRPC 请求一次、由代理按权重与容错策略自动分配底层 GKE 集群。读完本文你将掌握 GKE 集群初始化、ESP 边车部署、Terraform 一键创建 GCP 资源、代理镜像构建与压测客户端调用这一整套可复制的落地路径。一、方案背景为什么需要一个 Allocation Endpoint 代理在 Agones 中GameServerAllocation通常由客户端直接向某个集群的agones-allocator服务发起 gRPC 请求来分配游戏服务器。当游戏规模横向扩展为多个 GKE Agones 集群例如按区域或容量拆分时客户端直接调用会面临三个实际问题入口分散每个集群都有自己的agones-allocator外部 IP客户端需要维护多套地址并自行选择权重调度缺失客户端无法感知各集群的容量与权重难以把流量按期望比例分发到不同集群故障转移困难某个集群不可用或容量耗尽时客户端难以自动切换到其他集群。本示例提供的 Allocation Endpoint 代理下文简称 AP 代理正是为解决这些问题而设计的它是一个部署在 Cloud Run 上的 gRPC 服务对外只暴露一个 FQDN对内维护多个 Agones 集群的连接池与分配权重并把来自匹配服务的每一次分配请求路由到最合适的集群。从 server/main.go 的源码结构看代理服务直接注册了 Agones 的AllocationServicegRPC 服务pb.RegisterAllocationServiceServer对外与客户端的协议完全复用 Agones 的分配接口因此任何能调用agones-allocator的客户端 SDK 都可以零改造地改为调用代理。二、整体架构与 GCP 资源组成仓库 examples/allocation-endpoint/README.md 给出的文件夹结构与 GCP 架构可以概括为以下几个层次Terraform 模块terraform/创建 Cloud Run 服务、Endpoints 服务、IAM 绑定、Secret Manager 密钥等 GCP 资源代理服务端代码server/部署到 Cloud Run 的 Allocation Endpoint 代理ESP 边车容器基于 Envoy 的 ESP v2Endpoints Service Proxy作为agones-allocator容器的 sidecar 部署在 GKE 集群内示例客户端client/携带服务账号凭据向代理发送分配请求的压测客户端镜像构建脚本代理的 Dockerfile、Makefile 与 cloudbuild.yaml使用文档README.md。数据流大致如下与仓库内的 architecture.png 一致Matchmaker匹配服务以某个 Service Account 身份调用 Cloud Run 上的 AP 代理Cloud Run 对请求方做IAM 权限校验并从Secret Manager读取服务账号密钥、从环境变量读取各集群的 ESP service 地址CLUSTERS_INFO代理向目标 GKE 集群签发JWT token并转发分配请求GKE 集群内的ESP 边车接收请求后再向 Cloud Endpoints 做Access check校验通过后转发给后端agones-allocator容器。适用前提本方案仅在 GKE 集群上验证过非 GKE 集群未经过测试见 README 中的注意事项。三、GKE 集群准备启用 Workload Identity 并安装 Agones3.1 创建集群时必须启用 Workload Identity创建 GKE 集群时需要在gcloud container clusters create中显式传入--workload-pool格式为GKE-PROJECT-ID.svc.id.googgcloud container clusters create [NAME] \ ... \ --workload-pool[GKE-PROJECT-ID].svc.id.googWorkload Identity 是本方案的关键前置条件后续 ESP 边车所在的agones-allocatorService Account 需要借它来伪装impersonateGCP 服务账号从而向后端服务签发访问令牌。3.2 安装 Agones 并关闭 mTLS/TLSagones-allocator容器将作为 ESP 边车的后端因此安装 Agones 时必须禁用 mTLS 与 TLS并关闭 allocator 的 HTTP 服务避免与 ESP 的 8443 端口监听产生冲突helm upgrade my-release --install --namespace agones-system --create-namespace agones/agones \ --set agones.allocator.disableMTLStrue \ --set agones.allocator.disableTLStrue \ --set agones.allocator.service.http.enabledfalse3.3 为 allocator 部署 ESP 边车安装完成后用仓库提供的 patch-agones-allocator.yaml 给agones-allocatorDeployment 打补丁注入 ESP 容器。注意补丁中的[GKE-PROJECT-ID]需要先替换为你的项目 ID。从补丁文件可见 ESP 的关键参数--listener_port9443ESP 对外监听端口即本集群的分配入口--generate_self_signed_cert自动生成自签名证书本方案后端不校验服务端证书见后文“未来考虑”--backendgrpc://127.0.0.1:8443转发到本地agones-allocator容器的 gRPC 端口--serviceagones-allocation.endpoints.[GKE-PROJECT-ID].cloud.goog关联 Terraform 创建的 Endpoints 服务名ESP 依赖它做访问校验--rollout_strategymanaged采用托管式发布策略。随后依次执行三个kubectl命令完成补丁、端口切换与服务账号注解kubectl patch deployment agones-allocator -n agones-system --patch-file patch-agones-allocator.yaml kubectl patch svc agones-allocator -n agones-system --type merge -p {spec:{ports: [{port: 443,name:https,targetPort:9443}]}} kubectl annotate sa -n agones-system agones-allocator iam.gke.io/gcp-service-accountae-esp-sa[PROJECT-ID].iam.gserviceaccount.com这三步的含义分别是让 ESP 边车进入 allocator Pod把agones-allocatorService 的443端口改指向 ESP 的9443监听端口对外分配入口变为 ESP给agones-allocatorService Account 打上注解使其可通过 Workload Identity 伪装为ae-esp-sa这个 GCP 服务账号。四、Terraform 一键创建 GCP 资源4.1 需要提前准备的前提运行 Terraform 之前你需要一个已创建的 GCP服务账号用于授权访问 AP 代理记录其邮箱上一步得到的各集群agones-allocator外部 IPESP 监听地址。4.2 apply 命令与关键变量在 terraform/ 目录下执行terraform apply \ -var project_id[PROJECT-ID] \ -var authorized_members[\serviceAccount:[SERVICE-ACCOUNT-EMAIL]\] \ -var clusters_info[CLUSTERS-INFO] \ -var workload-pool[GKE-PROJECT-ID].svc.id.goog各变量说明定义见 terraform/variable.tf变量说明默认值project_idGCP 项目 ID无authorized_members被授权调用 AP 代理的服务账号列表如[serviceAccount:xxxx.iam.gserviceaccount.com]无clusters_infoJSON 字符串反序列化为[]ClusterInfo结构定义见 server/clusterselector.go无workload-poolGKE workload pool形如my-proj.svc.id.goog无regionCloud Run 部署区域us-central1ae_proxy_image代理镜像地址us-docker.pkg.dev/agones-images/examples/allocation-endpoint-proxy:0.18agones-namespaceagones-allocator服务所在命名空间agones-system4.3clusters_info的完整格式[CLUSTERS-INFO]是一个 JSON 数组例如[{name:cluster1,endpoint:34.83.14.82,namespace:default,allocation_weight:100},{name:cluster2,endpoint:34.83.14.83,namespace:default,allocation_weight:50}]对应的ClusterInfo结构server/clusterselector.go包含四个字段name集群的唯一名称自选需与其余集群区分endpoint该集群agones-allocator的外部 IPnamespace游戏服务器所在命名空间代理转发时会用该值覆盖请求中的 Namespaceallocation_weight取值 0~100 的整数权重决定该集群相对其他集群获得分配流量的比例设为 0 表示该集群停止接收分配请求源码中minAllocationWeight 0、maxAllocationWeight 100见 server/main.go。4.4 Terraform 实际创建的资源对照 terraform/main.tfterraform apply会创建Endpoints 服务agones-allocation.endpoints.PROJECT-ID.cloud.goog基于 api_config.yaml.tpl 模板与预编译的 agones_allocation_api_descriptor.pb 注册 gRPC API并配置 JWT 鉴权规则audiences指向 Endpoints 服务名issuer/jwks_uri指向ae-esp-sa服务账号Cloud Run 服务allocation-endpoint-proxycontainer_concurrency 80、超时 30 秒、maxScale 1000、minScale 0暴露 h2c 端口 8080HTTP/2并通过环境变量注入CLUSTERS_INFO与AUDIENCESA_KEY则从 Secret Manager 读取IAM 绑定Endpoints 服务授权ae-esp-sa作为 serviceControllerCloud Run 的roles/run.invoker授予authorized_membersWorkload Identity 绑定允许 GKE 中的agones-allocator伪装ae-esp-saSecret Managerae-sa-key密钥内容为ae_sa服务账号私钥并授权 Cloud Run 计算服务账号读取。apply 完成后output endpointterraform/output.tf会打印 Cloud Run 的 URL这就是代理的唯一入口 FQDN。五、构建并推送代理镜像5.1 手动构建与推送代理代码位于 server/构建镜像docker build --tag gcr.io/[PROJECT-ID]/allocation-endpoint-proxy:[VERSION] . docker push gcr.io/[PROJECT-ID]/allocation-endpoint-proxy:[VERSION]Dockerfile 基于golang:1.26-alpine将go.mod/go.sum与源码复制进容器后执行go build -o /allocation-endpoint-proxy暴露 8080 端口并直接运行二进制。如果你构建了自己的镜像可以通过 Terraform 变量ae_proxy_image指向它见 terraform/variable.tf。5.2 使用 Makefile / Cloud Build 构建仓库 Makefile 提供了封装好的目标make build构建镜像默认 tag 为allocation-endpoint-proxy:0.18可通过REPOSITORY变量加前缀make push先构建再推送make echo-image-tag输出当前镜像 tagmake cloud-build调用 cloudbuild.yaml 在 GCP Cloud Build 中完成构建与推送_REPOSITORY默认us-docker.pkg.dev/${PROJECT_ID}/examples。六、代理服务端的运行机制与核心参数6.1 启动与环境变量从 server/main.go 的readEnvVariables()可以看到代理启动时读取三个环境变量环境变量用途缺失后果CLUSTERS_INFO集群列表 JSON与 Terraform 同名变量一致解析失败直接log.Fatalf退出AUDIENCE连接后端时的 JWT audience即 Endpoints 服务名缺失即log.Fatal退出SA_KEY用于签发 JWT 的服务账号私钥JSON 内容缺失即log.Fatal退出PORTgRPC 监听端口可选默认443Cloud Run 场景下被容器端口覆盖SA_KEY会通过google.JWTAccessTokenSourceFromJSON构造一个全局复用的 TokenSource令牌自动刷新源码注释With a global TokenSource tokens would be reused and auto-refreshed at need。6.2 连接池与容错源码中定义了一批关键常量server/main.gonumOfConnections 12代理为每个集群缓存 12 条 gRPC 连接请求时用rand.Perm随机选取避免热点连接connectionPoolTimeout 60 * time.Minute连接空闲超过该时长会重新建立failureTimes 300/failureDuration 10s某个集群在 10 秒内连续失败 300 次即被标记为失败集群Allocate循环会跳过它exhaustedDuration 10s容量耗尽ResourceExhausted的错误会在 10 秒后解除allocationTimeout 20s单次分配请求的整体超时connectionTimeout 5s建立后端连接的超时。在Allocate主循环server/main.go中代理按“先按权重选集群 → 失败则换下一个”的顺序尝试直到成功或所有集群都试过如果请求未完成时agones-allocator返回ResourceExhausted代理不会立刻丢弃该连接而是等待exhaustedDuration后重试。6.3 权重调度算法selectClusterserver/clusterselector.go在每次分配前基于各集群的AllocationRate构造累计概率区间再生成[0, 总权重)的随机数落点选簇AllocationRate则由allocationRate()server/main.go在启动时一次性计算若所有启用集群都设置了权重100AllocationRate weight / totalWeight按权重比例分摊若存在权重为 100 的集群这些“非限流”集群会吸收剩余流量保证它们的总分配率接近1/nn 为启用集群数从而防止未设置限流的集群流量过载或闲置。简单来说权重 0 关闭集群、100 表示“按需吸收剩余流量”中间值则按比例限流适合用「一主多备」或「多集群均分」等不同策略。七、客户端调用与压测用法7.1 准备服务账号密钥客户端代码位于 client/。把authorized_members中任一服务账号的 Key 保存为sa_key.json放在客户端目录下client/main.go 通过//go:embed sa_key.json将其嵌入二进制。如果你的客户端本身运行在 GCP例如 GKE也可以改用 Workload Identity 从元数据服务器获取访问令牌无需下载密钥文件。7.2 运行客户端go run *.go --url[CLOUD-RUN-ENDPOINT][CLOUD-RUN-ENDPOINT]是 Terraform 输出的 Cloud Run FQDN不要带 scheme例如allocation-endpoint-proxy-code.a.run.app。7.3 压测参数与结果报告客户端在 client/main.go 中提供了三个压测参数参数默认值含义--clientCount1并发客户端数量--perClientCalls1每个客户端并行发起的分配请求数--runs1实验重复次数结果取平均客户端使用idtoken.NewTokenSource以https://endpoint为 audience 签发 ID token并将其放入 gRPC 出站元数据的Authorization头每次分配使用 120 秒超时的上下文。运行结束后会打印报告report()函数调用总数、运行时长、成功数、成功平均延迟、每秒成功请求数RPC以及按 gRPC status code 分类的错误计数——可用于直接评估代理在负载下的吞吐与容错表现。八、未来考虑与已知限制README 的“Future considerations”部分明确给出了三点边界使用时请务必知悉公网出口本示例的请求走的是各集群agones-allocator的公网 IP。如果集群与代理在同一个 VPC 内可以改用私有 IP 通信从而去掉对服务账号与 Secret Manager 签发 JWT 的依赖跳过服务端证书校验代理当前设置了InsecureSkipVerify: trueserver/main.go只为简化演示。为 ESP 配置正式 TLS 证书后务必移除该选项否则存在中间人攻击风险非 GKE 兼容性方案在设计上应当兼容非 GKE 的 Agones 集群但当前只经过 GKE 环境验证未经测试的配置需谨慎使用。九、相关文件速查示例总览examples/allocation-endpoint/README.md代理服务端server/main.go入口、环境变量、连接池与容错、server/clusterselector.goClusterInfo 结构与权重选簇客户端压测client/main.goTerraformterraform/main.tf、terraform/variable.tf、terraform/output.tf、terraform/api_config.yaml.tplESP 边车补丁patch-agones-allocator.yaml构建配置server/Dockerfile、Makefile、cloudbuild.yaml分配协议定义proto/allocation/allocation.proto赞分享游戏开发云原生【免费下载链接】agonesDedicated Game Server Hosting and Scaling for Multiplayer Games on Kubernetes项目地址https://gitcode.com/gh_mirrors/ag/agones点击查看免费下载相关推荐Agones 多集群游戏服分配Multi-cluster Allocation实战指南优先级、权重与 agones-allocator 路由Agones 多集群游戏服分配Multi cluster Allocation实战指南优先级、权重与 agones allocator 路由 Agones游戏开发云原生MLX90614如何与单片机对话I2C/SMBus测温原理与0x5A地址一次讲透MLX90614如何与单片机对话I2C/SMBus测温原理与0x5A地址一次讲透 MLX90614 是一款流行的非接触红外测温模块单片机只需通过 I2C/S游戏开发云原生Agones与游戏匹配系统集成实现智能游戏服务器分配的最佳方案Agones与游戏匹配系统集成实现智能游戏服务器分配的最佳方案 在当今的多人游戏生态中 Agones游戏服务器分配 系统正成为游戏开发者的首选解决方案。这个游戏开发云原生上一篇终极3DS自制软件管理指南Universal-Updater完整解决方案下一篇3分钟掌握Windows窗口调整终极技巧WindowResizer免费工具完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场

Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场

Core dump 崩溃排查:JVM 宕机后,那份 core 文件怎么用 gdb 还原现场凌晨告警:进程没了。翻日志,最后一行戛然而止,没有任何 Java 异常栈——因为它压根不是"抛异常"死的,是崩死的(SIG…

📅 2026/10/10 2:24:17
ncm转mp3怎么弄?亲测7种实用方法,简单易学

ncm转mp3怎么弄?亲测7种实用方法,简单易学

上周收到一条网友私信,附了张照片——便签纸上歪歪扭扭写着:“下了两百多首歌,全是ncm,车机放不了,咋整?”便签旁边还画了个哭脸。 这个问题我太熟了。网易云音乐下载的歌曲默认存成.ncm格式,属…

📅 2026/10/10 2:24:17
酷狗kgg转mp3怎么弄?7个靠谱方法图文详解

酷狗kgg转mp3怎么弄?7个靠谱方法图文详解

真急人! 昨天下午收到一条网友私信,说他晚上要开车回老家,想把酷狗下载的几十首歌转成mp3放U盘里路上听,结果折腾了一下午一个都没转成功。他随手在便签纸上写了几个问题拍给我——"格式不支持""转换后没声音&quo…

📅 2026/10/10 2:24:17
MORE NEWS

更多资讯

📰

SpringBoot+Vue私人诊所管理系统:协同过滤推荐算法实战解析

这两年我陆陆续续帮几个做基层医疗系统的朋友看过代码,也做过一些私人诊所的信息化改造,发现一个挺有意思的现象:很多诊所老板以为管理系统就是“记个账、排个班”,但真正用了半年之后,最让他们离不开的反而是“推荐”…

📰

MagPie模型路由工具:Agent多模型统一管理与自动分发实践

这个项目叫 MagPie,本质上是一个 Agent 模型路由工具。它的核心思路不是再训练一个多大的模型,而是把市面上已有的各种模型能力统一管起来,根据任务类型自动选择最合适的模型去处理。对于经常在 Agent、工作流、自动化脚本里反复切换模型的人…

📰

用Shell脚本实现轻量级基础设施即代码(IaC)实践

做了这么多年运维,我一直觉得“基础设施即代码”这件事,不应该只有大厂那套玩法。很多小团队、轻量项目,根本不需要立刻上Terraform、Ansible这些重型工具,直接用Shell脚本也能把IaC做得明明白白。这次分享的这套实践,…

📰

本地AI项目部署实战:环境准备、API接口与批量任务全流程解析

高效启动本地 AI 项目:从环境准备到接口联调的一次完整实测打开这篇文章的读者,大概率不是来看概念介绍的,而是想知道三件事:这个项目怎么跑起来、跑起来之后能干什么、遇到问题怎么排查。这次我们就围绕一个本地 AI 工具类项目的…

📰

OpenHarmony真机Flutter应用错误处理与异常管理实战指南

在OpenHarmony真机上跑Flutter,最磨人的不是写页面,而是排错。原因很简单:你在模拟器里跑得好好的逻辑,一旦上了真机,摄像头权限、传感器驱动、系统省电策略、通知开关,任何一环出问题,整个App就…

📰

人类阅读与大语言模型如何应对概念中断和指称中断?

这次我们来看一个研究性项目:Distinct dynamics of conceptual and referential disruptions in human reading and large language model processing,翻译过来是“人类阅读与大语言模型处理中概念与指称中断的不同动态”。它不是一个可以一键部署的模型…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬