ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Agones 0.11.0-rc 版本解析:Unity SDK、Passthrough 端口策略与打包分配等新特性详解

Agones 0.11.0-rc 版本解析:Unity SDK、Passthrough 端口策略与打包分配等新特性详解 游戏开发云原生【免费下载链接】agonesDedicated Game Server Hosting and Scaling for Multiplayer Games on Kubernetes项目地址https://gitcode.com/gh_mirrors/ag/agones点击查看免费下载本文基于 0.11.0-rc 发布说明 展开并结合当前仓库源码逐项印证。0.11.0-rc 是 Agones 在 2019 年 6 月发布的候选版本RC引入了 Unity SDK、GameServerAllocation 打包Packed分配的批量优化、Passthrough 端口策略、Reserved 游戏服务器状态、分布式多集群 Allocator 反向代理等一批对游戏服务器托管至关重要的能力。阅读本文后你将掌握这批特性的配置方式、底层实现原理与升级影响能够准确评估从旧版本迁移到 0.11.x 时需要注意的破坏性变更。一、版本背景与发布节奏0.11.0-rc 发布于 2019-06-17是 0.11 迭代周期的候选版本Release Candidate标志着该周期功能开发基本收口。发布说明明确指出进入功能冻结Feature Freeze自发布起至 6 月 25 日星期二之前只合并文档、Bug 修复与测试相关的 PR其余功能 PR 将被标记为feature-freeze-do-not-merge并延后合并。软件状态为 Alpha该版本处于 alpha 阶段仍可能发生变化官方明确提示不应用于生产系统This software is currently alpha, and subject to change. Not to be used in production systems.。安装入口README 与 CHANGELOG 是特性、安装与使用细节的权威来源通过 Helm 安装时使用helm install agones/agones --version 0.11.0-rc并需先执行helm repo add https://agones.dev/chart/stable添加官方 stable 仓库。该版本官方发布的镜像清单如下对应 cmd/controller、cmd/sdk-server、cmd/ping 三个可执行组件以及示例游戏服务器镜像镜像说明gcr.io/agones-images/agones-controller:0.11.0-rc控制器controller负责 Fleet、GameServerSet、GameServer 等资源编排gcr.io/agones-images/agones-sdk:0.11.0-rcSDK Serversidecar与游戏进程通过本地 gRPC/HTTP 通信gcr.io/agones-images/agones-ping:0.11.0-rcPing 服务用于集群可达性/延迟探测gcr.io/agones-images/cpp-simple-server:0.5C 示例游戏服务器examples/cpp-simplegcr.io/agones-images/udp-server:0.11UDP 示例服务器examples/simple-game-servergcr.io/agones-images/xonotic-example:0.5Xonotic 示例游戏服务器examples/xonotic二、破坏性变更升级前必须了解0.11.0-rc 包含两项破坏性变更直接影响现有资源的组别API Group与 SDK 调用方式1. FleetAutoscaler 迁移到autoscaling.agones.dev组PR #829 定义与pkg/apis/autoscaling/v1下的注册代码见 pkg/apis/autoscaling/register.go共同生效。所有存量 FleetAutoscaler 清单中的apiVersion都必须改为新的组名否则 CRD 无法匹配、资源无法被控制器识别。2. SDK proto 文件按风格指南修订PR #776 中 SDK 接口包括connect()、ready()、allocate()、shutdown()、close()等proto 源文件位于 proto/sdk/sdk.proto 及 proto/sdk/alpha 与 proto/sdk/beta。升级 SDK 客户端版本时必须同步更新代码中的方法调用。三、全新特性逐项详解1. Unity SDK让 Unity 游戏直连 AgonesPR #818核心实现是 sdks/unity/AgonesSdk.cs以MonoBehaviour形式存在可挂载到任意场景对象上通过IRequestSender抽象见 sdks/unity/IRequestSender.cs发送 HTTP 请求到 Agones sidecar便于测试时替换为 Mock 发送器提供AgonesSdk、AgonesAlphaSdk、AgonesBetaSdk见 sdks/unity/AgonesAlphaSdk.cs、sdks/unity/AgonesBetaSdk.cs对应 SDK 的稳定版与 Alpha/Beta 特性面使用 MiniJSONsdks/unity/third_party/MiniJSON.cs完成 JSON 序列化避免引入额外第三方依赖资源模型定义在 sdks/unity/model 目录如GameServer.cs、GameServerStatus.cs、StatusPort.cs等与 Kubernetes 中 GameServer 的状态结构一一对应附带了完整的 Unity 测试工程sdks/unity/Tests与package.json可通过 Unity Package Manager 集成。Unity SDK 的引入意味着 Unity 客户端/游戏逻辑可以直接通过 sidecar 上报Ready、Allocated等状态并在GameServer状态变化时拿到端口、地址等运行时信息无需再自己封装 HTTP/JSON 协议。2. Passthrough 端口策略容器端口与宿主机端口一致PR #817 解决了 issue #294在动态端口分配场景下允许将容器端口containerPort设置为与动态选出的宿主机端口hostPort相同的值即新增Passthrough端口策略。在 pkg/apis/agones/v1/gameserver.go 中定义了全部四种PortPolicyStatic固定端口必须同时指定hostPort与containerPortDynamic系统在安装时传入的MIN_PORTMAX_PORT范围内动态分配hostPortcontainerPort必须显式定义Passthrough新增动态分配hostPort后将containerPort自动设置为与hostPort相同None忽略hostPort可选地使用containerPort设置实例端口。从 pkg/apis/agones/v1/common.go 的校验错误常量可以看出 Passthrough 的约束规则ErrHostPortHostPort cannot be specified with a Dynamic or Passthrough PortPolicy—— 使用 Dynamic/Passthrough 时禁止显式指定hostPortErrContainerPortPassthroughContainerPort cannot be specified with Passthrough PortPolicy—— 使用 Passthrough 时禁止显式指定containerPort。对应的校验逻辑在 pkg/apis/agones/v1/gameserver.goif p.PortPolicy Passthrough p.ContainerPort 0 { allErrs append(allErrs, field.Required(path.Child(containerPort), ErrContainerPortPassthrough)) } if p.HostPort 0 (p.PortPolicy Dynamic || p.PortPolicy Passthrough) { allErrs append(allErrs, field.Forbidden(path.Child(hostPort), ErrHostPort)) }一个 Passthrough 的 GameServer 端口声明示例ports: - name: gameport portPolicy: Passthrough range: default使用要点游戏进程无法在容器启动时预先知道端口必须通过 sidecar SDK 查询实际打开的端口pkg/apis/agones/v1/gameserver.go 明确注释了这一行为当 GameServer 采用 Dynamic 或 Passthrough 策略时其默认状态会先进入PortAllocation见 pkg/apis/agones/v1/gameserver.go 的applyStatusDefaults完成端口分配后才转为 Ready当前仓库通过注解agones.dev/container-passthrough-port-assignmentpkg/apis/agones/v1/gameserver.go跟踪容器与 Passthrough 端口的分配关系。该策略特别适合那些希望对外端口号与容器内监听端口一致的 UDP/直连型游戏协议省去客户端与服务器之间的端口重映射协商。3. 打包Packed与分布式Distributed分配的批量优化PR #804 实现了 Batched Packed and Distributed Allocations在不牺牲性能的前提下提升了GameServerAllocation的打包分配Packed效果。从 pkg/apis/allocation/v1/gameserverallocation.go 可以看到GameServerAllocation.spec.scheduling字段默认值为PackedApplyDefaults()中当该字段为空时设为apis.Packed见 pkg/apis/allocation/v1/gameserverallocation.go合法值仅为Packed与Distributed校验逻辑见 pkg/apis/allocation/v1/gameserverallocation.go。两种策略的语义差异Packed默认分配器优先把新分配“打包”到已使用但仍有空闲容量的节点上追求基础设施的高利用率Distributed尽可能将 GameServer 分散到不同节点提升故障域隔离与可用性。从源码结构看本次优化的核心是把分配操作从逐个挑选改为批量处理分配器在缓存pkg/gameserverallocations/allocation_cache.go中批量筛选候选 GameServer再一次性完成分配相关测试位于 pkg/gameserverallocations/allocator_test.go其中run(t, packed, ...)用例验证了 Packed 策略下按节点优先级逐节点填充的行为。这就解释了发布说明中“Better packing onGameServerAllocationwithout a drop in performance”的含义——打包质量提升但吞吐不下降。4. Reserved 游戏服务器状态可分配但不可删除PR #766 新增了ReservedGameServer 状态用于那些可以被分配出去、但不能被缩容删除的实例例如已被预约、即将进入对局的关键实例。状态定义在 pkg/apis/agones/v1/gameserver.go// GameServerStateReserved is for when a GameServer is reserved and therefore can be allocated but not removed GameServerStateReserved GameServerState Reserved配套的状态语义函数同样在该文件中IsDeletable()pkg/apis/agones/v1/gameserver.go处于Allocated或Reserved状态的 GameServer 只有在存在删除时间戳DeletionTimestamp时才可删除IsBeforeReady()Reserved不再视为 Ready 之前的状态IsActive()pkg/apis/agones/v1/gameserver.goAllocated、Ready、Reserved都被视为活跃实例。状态字段中还新增了ReservedUntil *metav1.Timepkg/apis/agones/v1/gameserver.go用于记录预约的截止时间配合 SDK 侧的Reserve调用使用。Fleet 缩容逻辑需要感知该状态避免误删预约中的实例。5. 多集群 Allocator 反向代理与端点数组化PR #768 增加了作为反向代理reverse proxy的 allocator 服务配合 PR #830 将AllocationEndpoint改为端点数组共同支撑跨集群 GameServer 分配。在 pkg/apis/multicluster/v1/gameserverallocationpolicy.go 中ClusterConnectionInfo的AllocationEndpoints字段是[]string// The endpoints for the allocator service in the targeted cluster. // If the AllocationEndpoints is not set, the allocation happens on local cluster. // If there are multiple endpoints any of the endpoints that can handle allocation request should suffice AllocationEndpoints []string json:allocationEndpoints,omitempty含义解读配置多个端点时任何一个能够处理分配请求的端点均可容错能力更强如果allocationEndpoints未设置则分配在本地集群完成每个目标集群还需要secretNameTLS 客户端证书、serverCaPEM 编码的服务端 CA等 TLS 配置同文件中的ConnectionInfoIteratorpkg/apis/multicluster/v1/gameserverallocationpolicy.go实现了按 priority → 集群 → 权重迭代选取目标集群的逻辑并用黑名单避免同一集群被重复选中。从代码结构看反向代理形态的 allocator 把跨集群分配请求转发给目标集群的 allocator 服务再由目标集群完成实际的 GameServer 选择与分配从而在不暴露内部集群结构的情况下实现多集群调度。6. Node.js SDK暴露 allocate 与 close 方法PR #774 与 PR #748 分别补全了 Node.js SDK 的allocate与close方法解决 issue #773Node.js 自分配不受支持。当前 sdks/nodejs/src/agonesSDK.js 中allocate()通过 gRPC 调用client.allocate(request, ...)返回 GameServer 信息对象见 sdks/nodejs/src/agonesSDK.jsclose()依次关闭健康上报流、其余流与 gRPC 客户端连接见 sdks/nodejs/src/agonesSDK.js。类型声明见 sdks/nodejs/src/agonesSDK.d.tsconnect(): Promisevoid、close(): void、ready()、allocate()、shutdown()等。Node.js 开发者自此可以在服务器内主动将自身标记为 Allocated自分配并正确释放连接资源。7. WorkerQueue 支持延迟入队EnqueueAfterPR #835 增加了EnqueueAfter(obj any, duration time.Duration)实现延迟入队见 pkg/util/workerqueue/workerqueue.go。同文件还包含Enqueue常规入队与EnqueueImmediately跳过限速直接入队。该能力为控制器提供了一种“延时重试/延时处理”的通用原语例如在资源状态尚未满足条件时安排稍后重新检查。8. FleetAutoscaler 事件与参数校验增强连接错误事件PR #794其请求/响应结构FleetAutoscaleRequest/FleetAutoscaleResponse定义在同一文件pkg/apis/autoscaling/v1/fleetautoscaler.go。RollingUpdate 参数校验PR #808 为 Fleet 的滚动更新RollingUpdate策略参数增加了校验避免非法参数导致滚动更新异常。9. 其他改进NodeExternalIP 回退PR #828 修复了当节点外部 IP 为空时回退到内部 IPNodeInternalIP的逻辑提升多网卡/无外部 IP 环境下的地址可用性Agones 概览重写PR #824 重写了项目 README 概览部分Terraform 模块PR #756、install/terraform/modules/gke、install/terraform/modules/helm3 以及示例工程 examples/terraform-submodules。四、安装与验证指引该版本处于 alpha 阶段建议在测试集群中验证。安装步骤如下# 1. 添加官方 Helm stable 仓库 helm repo add https://agones.dev/chart/stable # 2. 安装 0.11.0-rc 版本 helm install agones/agones --version 0.11.0-rc验证建议升级前先备份并核对存量清单中的apiVersion确认 FleetAutoscaler 已迁移到autoscaling.agones.dev组用示例清单验证新特性可参考 examples/fleet.yaml、examples/gameserverallocation.yaml 与 examples/webhookfleetautoscaler.yamlWebhook 策略示例若使用 Passthrough 端口注意在游戏代码中通过 SDK 查询实际端口号而不是假定固定端口若使用多集群分配确认每个目标集群的allocationEndpoints、secretName、serverCa均已正确配置。五、总结0.11.0-rc 是 Agones 向 0.11 正式版迈进的关键节点Unity SDK 打开了 C# 生态的接入通道Passthrough 端口策略简化了动态端口游戏的部署模型批量化的 Packed/Distributed 分配在提升打包质量的同时保持了分配吞吐Reserved 状态为“可分配但不可删除”的场景提供了原生语义多集群 allocator 反向代理与端点数组则把跨集群分配的可靠性提升了一个台阶。同时FleetAutoscaler 的 API 组迁移与 SDK proto 修订是两项必须处理的破坏性变更。结合 CHANGELOG.md 可获取该版本更完整的变更清单。需要注意0.11.0-rc 仍处于 alpha 阶段不适合直接用于生产环境请务必在完成充分验证后再规划生产升级。赞分享游戏开发云原生【免费下载链接】agonesDedicated Game Server Hosting and Scaling for Multiplayer Games on Kubernetes项目地址https://gitcode.com/gh_mirrors/ag/agones点击查看免费下载相关推荐Fan Control 实战指南用温度曲线把 Windows 风扇噪音压到最低Fan Control 实战指南用温度曲线把 Windows 风扇噪音压到最低 Fan Control 是一款免费的 Windows 风扇控制软件它直接读取游戏开发云原生Agones 1.6.0-rc 版本发布解析Player Tracking 玩家跟踪新特性与多集群分配 API 稳定化Agones 1.6.0 rc 版本发布解析Player Tracking 玩家跟踪新特性与多集群分配 API 稳定化 Agones v1.6.0 rc 是该游戏开发云原生yyjson 0.11.0 版本发布性能优化与新特性解析yyjson 0.11.0 版本发布性能优化与新特性解析 yyjson 是一个高性能的 C 语言 JSON 库以其极快的解析速度和低内存占用著称。它支持完整上一篇FaceMaskDetection口罩检测系统技术实现与应用方案下一篇终极解决方案彻底解决Genesis项目中的libGL错误从根源排查到环境优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进